3.2 开发环境

3.2 开发环境

本节对 AZ Processor 的交叉开发环境进行介绍。然后讲解并制作一个控制 AZPR EvBoard 上的 LED 的程序。

计算机上运行的程序,通常程序的开发与程序的执行在同一系统下进行,称为本地开发。反之,在与执行环境不同的环境下进行程序开发,称为交叉开发。AZ Processor 的程序开发为交叉开发。因此,开发流程为在计算机上编写程序,然后将执行文件下载到 AZ Processor 执行。

3.2.1 准备工作

AZ Processor 的程序开发需要准备 AZPR EvBoard、AC 变压器、计算机和 USB 线。

  • AZPR EvBoard

    第 2 章解说制作的 FPGA 电路板:AZPR EvBoard。

  • AC 变压器

    AC 变压器为 AZPR EvBoard 供电的 AC 变压器。请使用 2.3.2 节提到的,规格为输出电压为 5V,输出电流为 1A 以上的变压器。

  • 计算机

    开发使用的计算机系统为 Windows 7。由于需要通过 USB 接口与 AZPR EvBoard 连接,所以需要计算机带有 USB 接口。

  • USB 线

    USB 线用来连接计算机与 AZPR EvBoard。计算机上的 USB 接口一般为 A 接口。另一边 AZPR EvBoard 上的 USB 接口为 mini USB 接口。因此,应该选用一头是 A 接头,另一头是 mini USB 接头的 USB 线。照 片 3-1 为 A 接头、照片 3-2 为 mini USB 接头。

    照片 3-1 USB A 接头

    照片 3-2 mini USB 接头

3.2.2 FPGA 开发环境

FPGA 开发环境需要安装 ISE WebPACK 和 UrJTAG 两种工具软件。

ISE WebPACK 是赛灵思公司提供的 FPGA 综合开发环境,含有逻辑综合、布局布线、配置等多种 FPGA 开发的必要功能。逻辑综合是将硬件描述语言编写的程序代码转换为门级电路网表的过程。将这个电路网表的逻辑门和网络映射到 FPGA 的逻辑单元和 I/O 的过程称为布局布线。

UrJTAG 是与设备连接,执行 JTAG 操作的工具。使用支持 USB 的 UrJTAG 软件,可以利用 AZPR EvBoard 搭载的 USB 配置模块向 FPGA 的配置 ROM 进行下载操作。

我们使用这些工具,处理第 1 章制作的电路源程序,然后写入 FPGA。文件转换和所用工具的对应关系如图 3-1 所示。

图 3-1 文件转换和所用工具的对应关系

  • ISE Project Navigator

    ISE Project Navigator 是 ISE WebPACK 中包含的工具。使用 ISE Project Navigator,可以将第 1 章使用 Verilog 编写的源程序,编译转换为包含 FPGA 配置信息的 BIT 文件。

  • iMPACT

    iMPACT 也是 ISE Project Navigator 中包含的工具。使用 iMPACT 可以将 BIT 文件转换为记述 JTAG 操作的 SVF 格式文件。

    大多数 FPGA 使用 SRAM 作为编程配置元件。由于 SRAM 是易失性存储器,一旦断电,配置信息就会消失。为了在关闭电源时也能保存配置信息,FPGA 可以与写有配置信息的非易失性配置 ROM 相连,在电源接通时从配置 ROM 对 FPGA 进行配置。由于将配置信息写入配置 ROM 需要 MCS 格式文件,所以需要使用 iMPACT 生成 MCS 文件。然后和 BIT 文件同样,使用 iMPACT 将 MCS 文件转换为 SVF 文件。

    SVF 文件为记述 JTAG 操作的文件格式。将配置信息转换为 SVF 格式文件,然后使用 UrJTAG 下载到设备。

  • UrJTAG

    UrJTAG 可以执行 SVF 文件中记述的 JTAG 操作,向 FPGA 或配置 ROM 下载配置信息。

3.2.3 ISE WebPACK

本节对 ISE WebPACK 的安装和使用进行说明。

  • 安装

    ISE WebPACK 可以从赛灵思官方网站下载。链接如下:

    http://japan.xilinx.com(中文官网:http://china.xilinx.com

    在下载页面,点击下载 ISE Design Suite 的“基于 Windows 的完整安装程序”,如图 3-2 所示。

    图 3-2 ISE Design Suite 下载页面

    点击下载后会出现登录画面。在赛灵思官网下载 ISE WebPACK 需要注册账号并登录。注册账号的界面如图 3-3 所示。填写必要的项目并点击 Create Account 按钮注册账号。

    图 3-3 账号注册页面

    账号注册后,注册时填写的邮箱会收到一封注册邮件。点击邮件中的验证 URL,即可使用注册的用户名和密码进行登录。登录后就可以下载 ISE Design Suite 了。对下载的文件解压缩,在解压后的文件中双击 xsetup.exe,启动安装程序。点击 Next 按钮,进入下一步安装。在图 3-4 所示的 Select Products to Install(安装产品选择)界面中,选择 ISE WebPACK。

    图 3-4 Select Products to Install 界面

    安装过程中会出现图 3-5 所示的 Xilinx License Configuration Manager 对话框。选择 Get Free ISE WebPack License,单击 Next 按钮。

    图 3-5 Xilinx License Configuration Manager(1/2)

    然后会出现图 3-6 所示的对话框,单击 Connect Now 按钮。

    图 3-6 Xilinx License Configuration Manager(2/2)

    然后在浏览器中会显示出赛灵思公司的网站登录界面,填写之前注册的用户名与密码进行登录。登录后在图 3-7 所示的页面中,选择 ISE Design Suite: WebPACK License,单击 Generate Node-Locked License 按钮。

    图 3-7 使用许可申请页面

    最后会出现图 3-8 所示的安装完成界面。

    图 3-8 安装完成

  • 生成 BIT 文件

    BIT 文件是含有 FPGA 配置信息的文件。需要使用 ISE Project Navigator 生成。ISE Project Navigator 是进行源程序管理、逻辑综合、配置配线等过程的工具。接下来,我们对 ISE Project Navigator 的使用方法、BIT 文件的制作方法进行说明。

    首先启动 ISE Project Navigator,从菜单栏选择 File → New Project,新建一个工程。ISE 启动时的 ISE Project Navigator 窗口如图 3-9 所示。

    图 3-9 ISE 启动时的 ISE Project Navigator 窗口

    然后会出现 New Project Wizard 向导对话框,在 Create New Project 画面中输入新工程的路径和源程序的类型。如图 3-10 所示,在 Top-level source type 中选择 HDL。

    图 3-10 New Project Wizard(1/2)

    在接下来出现的 Project Settings 界面中选择目标设备。AZPR EvBoard 的 FPGA 为 Spartan 3E 的 XC3S250E,封装为 VQ100,Speed 等级为 -4。所以在 Family 的 Value 中填写 Spartan3E、Device 的 Value 中填写“3E 的 XC3S250E”、Speed 的 Value 中填写 -4。 输入后的画面如图 3-11 所示。

    图 3-11 New Project Wizard(2/2)

    单击 Next 按钮继续 New Project Wizard 向导。New Project Wizard 对话框结束后,向新工程中添加源程序文件。如图 3-12 所示,在 xc3s250e-4vq100 处单击右键,选择 Add Copy of Source。

    图 3-12 选择 Add Copy of Source

    在 Add Copy of Source 对话框中添加所有第 1 章编写的 AZPR SoC 的源程序。这里指定的头文件一览如表 3-1 所示、源程序一览如表 3-2 所示。

    表 3-1 头文件一览

    文件名 说明
    nettype.h 设定默认网络类型
    global\_config.h 全局设定
    stddef.h 全局头文件
    isa.h ISA 头文件
    cpu.h CPU 头文件
    spm.h SPM 头文件
    bus.h 总线头文件
    gpio.h GPIO 头文件
    rom.h ROM 头文件
    timer.h 定时器头文件
    uart.h UART 头文件

    表 3-2  源程序文件一览

    设定的文件会被复制到当前工程的文件夹。出现图 3-13 所示的 Adding Source Files 对话框单击 OK。

    图 3-13 Adding Source Files

    添加源程序后的 ISE Project Navigator 窗口如图 3-14 所示。

    图 3-14 加入源程序的 ISE Project Navigator 窗口

    接下来处理源程序中只有声明的模块。例如图 3-15 方框中的部分,只有声明的模块前的图标为 ? 号。

    图 3-15 只含有声明的模块

    AZPR SoC 中,x_s3e_dcm、x_s3e_sprom 和 x_s3e_dpram 三个文件的图标为 ? 号。首先制作 x_s3e_dcm。右键单击 chip_top(chip_top.v),选择 New Source,如图 3-16 所示。

    图 3-16 选择 New Source

    单击 New Source 之后会出现图 3-17 所示的 New Source Wizard 对话框。在 Select Source Wizard 界面左侧选择 IP(CORE Generator & Architecture Wizard),File name 处填写模块名 x_s3e_dcm。

    图 3-17 New Source Wizard(1/2)

    单击 Next 进入图 3-18 所示的 Select IP 界面,选择 FPGA Features and Design → Spartan-3E, Spartan-3A → Single DCM_SP。

    图 3-18 New Source Wizard(2/2)

    单击 Next 进入图 3-19 所示的 Xilinx Clocking Wizard 对话框。AZPR SoC 需要从振荡器输入 10MHz 的时钟和与之相位相差 180 度的翻转时钟。为了生成翻转时钟,在本对话框将 CLK180 选中。在 Input Clock Frequency 中填写 10、并选择 MHz。其他项目保留默认值。

    图 3-19 Xilinx Clocking Wizard

    然后制作 x_s3e_sprom。和 x_s3e_dcm 的制作方法一样,在 chip_top 右键单击,选择 New Source。在 Select Source Wizard 界面左侧选择 IP(CORE Generator & Architecture Wizard),File name 处填写模块名 x_s3e_sprom。Select IP 界面中如图 3-20 所示,选中 All IP versions,然后选择 Memories & Storage Elements → RAMs & ROMs → Block Memory Generator。笔者的环境中如果使用了 Version 7.2 的 Block Memory Generator,会在后面要讲解的 Synthesize 时发生错误。向赛灵思公司咨询后得到的答复是,由于 2012 年 8 月 28 日时间点的版本含有 Bug,如图 3-20 所示,应该选择使用 Version 7.2 之 外版本的 Block Memory Generator。

    图 3-20 New Source Wizard

    完成 New Source Wizard 对话框后,会启动如图 3-21 所示的 Block Memory Generator 对话框。在这里对 Memory Type 进行设定。x_s3e_sprom 制作时需要选择 Single Port ROM。

    图 3-21 Block Memory Generator(1/4)

    单击 Next 进入如图 3-22 所示的界面。在该界面中填写 Memory Size 的 Read Width 和 Read Depth。将 Read Width 设定为 32、Read Depth 设定为 2048。其他项目保留默认值。

    图 3-22 Block Memory Generator(2/4)

    单击 Next 进入如图 3-23 所示的界面。这里选中 Memory Initialization 的 Load Init File、单击 Browse 按钮、然后指定初始化文件。初始化文件需要设定块 RAM 初始值的 COE 文件格式。COE 文件的制作方法将在 3.2.5 节进行说明。指定 COE 文件后,ROM 内容即被设定为初始值。AZPR EvBoard 电源接通或复位时,AZ Processor 从 ROM 读取并执行的程序,就是这里的 COE 文件包含的程序。

    Memory Initialization 的设置完成后,最后单击 Generate 按钮完成设置。

    图 3-23 Block Memory Generator(3/4)

    最后制作 x_s3e_dpram。前半部分和 x_s3e_sprom 的制作方法相同。在 chip_top 右键单击,选择 New Source。在 Select Source Wizard 界面左侧选择 IP(CORE Generator & Architecture Wizard),File name 处填写模块名 x_s3e_dpram。在 Select IP 界面中,选择 Memories & Storage Elements → RAMs & ROMs → Block Memory Generator。这次在 Block Memory Generator 对话框的 Memory Type 选择 True Dual Port RAM。如图 3-24 所 示,填写 Memory Size 的 Write Width 和 Write Depth。Write Width 设定为 32、Write Depth 设定为 4096。

    图 3-24 Block Memory Generator(4/4)

    在制作 x_s3e_sprom 和 x_s3e_dpram 时,Block Memory Generator 对话框需要改动的设置项目总结在表 3-3 中。

    表 3-3 Block Memory Generator 需要改动的设置项目

    至此,只有声明的模块的制作就完成了。再看一下工程,我们会发现图 3-15 中的 ? 图标都变成了图 3-25 中的样子。

    图 3-25 模块生成之后

    接下来进行逻辑综合。选中 chip_top,双击 ISE Project Navigator 窗口左下方的 Synthesize-XST。Synthesize-XST 的选择画面如图 3-26 所示。

    图 3-26 选择 Synthesize-XST

    逻辑综合完成后进行布局布线。这里还要准备一个文件。布局布线时需要一个用来设定各种约束的文件。约束包括模块输入输出信号线和 FPGA 引脚的对应关系、时序、面积等。记载着这些约束信息的文件称为约束文件。

    我们制作的约束文件命名为 AZPR_EvBoard.ucf,用纯文本格式编写。关于约束文件的详细信息,请从赛灵思网站下载约束指南(Constraints Guide,赛灵思文档 UG625)作为参考。

    约束指南

    http://japan.xilinx.com/support/documentation/dt_ise.htm

    约束文件至少要记述两种约束信息。一个是输入时钟的时序约束,另一个是 FPGA 引脚相关约束。输入时钟的时序约束为:

    NET "clk_ref" TNM_NET = "CLK";
    TIMESPEC "TS_CLK" = PERIOD "CLK" 100 ns HIGH 50%;
    
    

    第一行是将 clk_ref 信号指定为时钟信号,并赋予名称 CLK。第二行记述 CLK 的时序信息。此处设置时钟为周期为 100ns,即时钟频率为 10MHz,且高电平 H 占周期的 50%。

    FPGA 引脚相关的约束记述方式为:

    NET clk_ref LOC = P83;
    
    

    这一句意思是将 RTL 顶层模块的 clk_ref 信号线和 FPGA 的 P83 引脚相对应。引脚约束需要参考电路板上的排线决定。AZ Processor 信号线与 AZPR EvBoard 的引脚的映射如表 3-4 所示。

    表 3-4 AZ Processor 信号线与 XC3S250E 引脚的对应

    信号线 引脚
    clk\_ref 83
    reset\_sw 85
    uart\_rx 70
    uart\_tx 71
    gpio\_out<16> 54
    gpio\_out<17> 53
    gpio\_in<0> 22
    gpio\_in<1> 23
    gpio\_in<2> 24
    gpio\_in<3> 26
    gpio\_out<0> 91
    gpio\_out<1> 92
    gpio\_out<2> 12
    gpio\_out<3> 15
    gpio\_out<4> 16
    gpio\_out<5> 90
    gpio\_out<6> 86
    gpio\_out<7> 11
    gpio\_out<8> 3
    gpio\_out<9> 2
    gpio\_out<10> 5
    gpio\_out<11> 9
    gpio\_out<12> 10
    gpio\_out<13> 95
    gpio\_out<14> 94
    gpio\_out<15> 4
    gpio\_io<0> 60
    gpio\_io<1> 61
    gpio\_io<2> 62
    gpio\_io<3> 63
    gpio\_io<4> 65
    gpio\_io<5> 66
    gpio\_io<6> 67
    gpio\_io<7> 68
    gpio\_io<8> 33
    gpio\_io<9> 34
    gpio\_io<10> 35
    gpio\_io<11> 36
    gpio\_io<12> 40
    gpio\_io<13> 41
    gpio\_io<14> 57
    gpio\_io<15> 58

    gpio_io 信号还需要追加 PULLDOWN 相关信息。

    NET "gpio_io<0>" LOC = "P60" | PULLDOWN;
    
    

    此处 PULLDOWN 的含义是将 FPGA 的 P60 引脚通过 FPGA 内部电阻连接到 GND。AZPR EvBoard 上的 gpio_io 直接与排线引脚连接。当排线上没有连接外部设备时,FPGA 上相应的引脚也就处于悬空状态。该状态下无法确定输入是 H 还是 L,因此需要通过电阻连接到 GND。

    将编写的 AZPR_EvBoard.ucf 添加到工程中后,布局布线的准备就完成了。双击 ISE Project Navigator 窗口左下方的 Implement Design 执行布局布线。选择 Implement Design 的界面如图 3-27 所示。

    图 3-27 选择 Implement Design

    然后制作 BIT 文件。首先,如图 3-28 所示,在 Generate Programming File 上右键单击并选择 Process Properties。

    图 3-28 选择 Process Properties

    打开 Process Properties 窗口,选择左侧 Category 中的 Startup Options。在此处设置 FPGA Start-Up Clock。直接对 FPGA 进行配置的话,在 Value 里填写 JTAG Clock。如果向配置 ROM 写入配置信息的话,在 Value 里填写 CCLK。Process Properties 窗口如图 3-29 所示。

    图 3-29 Process Properties

    双击 Generate Programming File 后,会在工程文件夹中生成 BIT 文件。因为顶层模块名为 chip_top,生成的文件名为 chip_top.bit。

  • 制作 MCS 文件

    接下来说明如何从 BIT 文件生成 MCS 文件。首先双击 ISE Project Navigator 窗口左下方的 Generate Target PROM/ACE File,如图 3-30 所示。

    图 3-30 选择 Generate Target PROM/ACE File

    双击 Generate Target PROM/ACE File 后,会弹出 ISE iMPACT 窗口。ISE iMPACT 窗口如图 3-31 所示,双击左上方 iMPACT Flows 列表的 Create PROM File(PROM File Formatter)、启动 PROM File Formatter 对话框。PROM File Formatter 对话框如图 3-32 所示。

    图 3-31 选择 Create PROM File(PROM File Formatter)

    图 3-32 PROM File Formatter(1/3)

    在 PROM File Formatter 对话框中,首先输入 Step 1 的内容。Step 1 中先选中 Xilinx Flash/PROM、然后单击向右的箭头进入 Step 2。图 3-33 为 Step 2 的输入画面。

    图 3-33 PROM File Formatter(2/3)

    Step 2 的 Device 中,配置 ROM 的类型选择 xcf02s、单击 Add Storage Device 后,再单击向右的箭头进入 Step 3。图 3-34 为 Step 3 的输入画面。

    图 3-34 PROM File Formatter(3/3)

    在 File Format 中选择 MCS。单击 OK 后,会出现图 3-35 所示的 Add Device 对话框,单击 Yes 并选择 chip_top.bit。

    图 3-35 Add Device 对话框

    由于 AZPR EvBoard 上只有一枚 FPGA,因此配置用 BIT 文件也只选一个。选择 chip_top.bit 后单击 Add Device 对话框的 No 按钮。如图 3-36 所示,双击 ISE iMPACT 窗口左下方的 Generate File 后即可生成 MCS 文件。MCS 文件生成完成的界面如图 3-37 所示。

    图 3-36 选择 Generate File

    图 3-37 MCS 文件生成完成的界面

  • 制作 SVF 文件

    SVF 是 Serial Vector Format 的缩写,是描述 JTAG 操作的文件。我们将配置数据输出为 SVF 格式文件,并使用 3.2.4 节会讲到的 UrJTAG 工具下载到设备。UrJTAG 可以读取 SVF 文件,并对设备进行 JTAG 操作。接下来说明 SVF 文件的制作方法。

    首先,从 Windows 7 的开始菜单启动 iMPACT。ISE iMPACT 窗口如图 3-38 所示。从 ISE iMPACT 窗口左上方的 iMPACT Flows 中双击 Boundary Scan。

    图 3-38 选择 Boundary Scan

    执行 Boundary Scan 后的界面如图 3-39 所示。

    图 3-39 Boundary Scan 后的界面

    在图 3-39 的 Right click device to select operations 处单击右键,如图 3-40,选择 Output File Type → SVF File → Create SVF File,开始生成 SVF 文件。

    图 3-40 选择 Create SVF File

    然后在 Add Device 对话框选择要写入的文件。选择 BIT 文件和选择 MCS 文件这两 种方式的流程不同。

    选择 BIT 文件的话,配置对象设备显示为 xc3s250e,如图 3-41 所示。

    图 3-41 选择 BIT 文件后的界面

    选择 MCS 文件的话,会出现 Select Device Part Name 对话框,如图 3-42 所示。然后选择 xcf02s 作为 PROM。单击 OK 后配置对象设备显示为 xcf02s。

    图 3-42 Select Device Part Name

    图 3-43 选择 MCS 文件后的界面

    选择将要写入的文件之后,在设备上单击右键,出现如图 3-44 所示的菜单栏,选择 Program。

    图 3-44 选择 Program

    然后会弹出如图 3-45 所示的 Device Programming Properties 对话窗口,单击 OK。

    图 3-45 Device Programming Properties

    最后,如图 3-46 所示,确认出现 Program Succeeded 后,从菜单栏选择 Output → SVF File → Stop Writing to File,完成 SVF 文件的制作。

    图 3-46 SVF 文件制作完成

    以上为生成 SVF 文件的流程。

3.2.4 UrJTAG

本节讲解 UrJTAG 的安装和使用方法。

  • 安装

    我们需要安装 UrJTAG、FT2232 驱动,以及 libusb-win32。

  • UrJTAG

    为了对 FPGA 进行配置,我们使用 UrJTAG 读取 SVF 文件并执行其中的 JTAG 操作。UrJTAG 可以从下面的网站链接下载:

    UrJTAG

    http://urjtag.org/

    点击网站上的 Download 下载,如图 3-47 所示。

    图 3-47 UrJTAG 网站

    然后会跳转到如图 3-48 所示的页面,下载最新版本。

    图 3-48 UrJTAG 安装程序的下载页面

    在下载完成的文件上单击右键,选择“以管理员身份运行”。根据安装程序的提示完成安装。

    图 3-49 以管理员身份运行

  • FT2232 驱动

    由于 FPGA 的配置要通过 AZPR EvBoard 上的 FT2232 芯片,因此需要安装该芯片的驱动。Windows 7 连接 FT2232 后会自动安装驱动程序。用 USB 将计算机和 AZPR EvBoard 连接并打开电源,驱动程序即自动开始安装。驱动程序安装成功后,计算机就会识别 FT2232 设备。

    在设备管理器中可以确认 Windows 7 是否识别 FT2232。右键单击开始菜单中的计算机,选择属性。然后选择“设备管理器”,打开“设备管理器”窗口。然后展开端口(COM 和 LPT)并确认通信端口。由于 FT2232 是双通道 USB 转串口的芯片,正确识别后会出现两个 USB Serial Port。在图 3-50 中显示为 USB Serial Port (COM3) 和 USB Serial Port (COM4)。

    图 3-50 设备管理器

  • libusb-win32

    libusb-win32 是处理 USB 设备的驱动程序。从下面的网页可以下载:

    libusb-win32

    http://sourceforge.net/apps/trac/libusb-win32/wiki/

    用浏览器访问上面的链接,如图 3-51 所示,在 Download 项目中点击 project download site。

    图 3-51 libusb-win32 网站

    然后会打开如图 3-52 所示的页面,可以下载最新版的驱动文件。

    图 3-52 libusb-win32 的下载页面

    保持 AZPR EvBoard 连接到计算机,将下载的文件解压缩并执行 bin 文件夹中的 inf-wizard.exe,打开图 3-53 所示的 libusb-win32 Inf-Wizard 对话框。

    图 3-53 libusb-win32 Inf-Wizard(1/3)

    单击 Next 按钮,出现图 3-54 中的界面。

    图 3-54 libusb-win32 Inf-Wizard(2/3)

    此处任选一个设备,单击 Next 按钮。图 3-54 的示例选择了 Description 为 Dual RS232(Interface 1)的设备。继续安装进程,会出现图 3-55 所示的界面。

    图 3-55 libusb-win32 Inf-Wizard(3/3)

    最后单击 Install Now 按钮安装驱动程序。

  • UrJTAG 的启动

    从 Windows 7 开始菜单选择执行 JTAG Shell,出现图 3-56 所示的界面。jtag> 提示符后可以输入命令。

    图 3-56 JTAG Shell

  • 设置 UrJTAG

    为了在 UrJTAG 中使用 AZPR EvBoard 的 xc3s250e 和 xcf02s 设备,需要添加设置文件和部件列表。需要改动的文件可以在本书的支持网站下载,我们在这里对这些改动进行说明。假定 UrJTAG 安装在“C:\Program Files (x86)\UrJTAG\”目录。安装路径不同的读者请换为自己的安装路径。

    首先,在“C:\Program Files (x86)\UrJTAG\data\xilinx\”目录下新建名为 xc3s250e 的目录。在该目录中新建两个文本文件,分别命名为 STEPPINGS 和 xc3s250e。请注意两个文件都没有 .txt 扩展名。STEPPINGS 文件中输入以下内容:

    0000 xc3s250e 0
    0001 xc3s250e 1
    0010 xc3s250e 2
    0011 xc3s250e 3
    0100 xc3s250e 4
    0101 xc3s250e 5
    0110 xc3s250e 6
    0111 xc3s250e 7
    1000 xc3s250e 8
    1001 xc3s250e 9
    1010 xc3s250e 10
    1011 xc3s250e 11
    1100 xc3s250e 12
    1101 xc3s250e 13
    1110 xc3s250e 14
    1111 xc3s250e 15
    
    

    另一个文件的内容的输入需要用到 BSDL 文件。赛灵思公司的网站上有公开的 BSDL 文件,可以按照以下方法下载。

    启动浏览器并进入赛灵思网站。点击下载 → 器件模型。在 BSDL 模型中选择 Spartan 系列 FPGA。页面如图 3-57 所示。

    图 3-57 BSDL 文件的下载 (1/3)

    然后在点击 Spartan 系列 FPGA 后出现的页面中选择 Spartan-3E - BSDL Models 的 BSDL Models。页面如图 3-58 所示。

    图 3-58 BSDL 文件的下载 (2/3)

    选择 BSDL Models 后,就会开始下载。下载时和下载 ISE WebPACK 时一样需要登录。将下载的文件解压缩,并将解压缩后的 xc3s250e.bsd 复制到“C:\Program Files (x86)\UrJTAG\data\”。

    接下来设置 JTAG Shell 的属性。启动 JTAG Shell,在标题栏单击右键并选择属性,如图 3-59 所示。

    图 3-59 选择 JTAG Shell 属性

    在 JTAG Shell 属性中,选中快速编辑模式,如图 3-60 所示。然后在图 3-61 所示的界面中的“屏幕缓冲区大小”中的“高度”中填写 2000。

    图 3-60 JTAG Shell 属性(1/2)

    图 3-61 JTAG Shell 属性(2/2)

    接下来在 JTAG Shell 中执行以下命令:

    jtag> bsdl dump xc3s250e.bsd
    
    

    然后将执行后显示的结果复制并粘贴到 xc3s250e 文件中。JTAG Shell 窗口中按住鼠标左键选中要复制的内容,然后单击右键即可复制。

    xcf02s 的设置文件也和 xc3s250e 一样的方式添加。在“C:\Program Files (x86)\UrJTAG\data\xilinx\”中新建 xcf02s 文件夹。在该文件夹中新建 STEPPINGS 和 xcf02s 两个文本文件。在 STEPPINGS 中输入以下内容:

    0000 xcf02s 0
    0001 xcf02s 1
    0010 xcf02s 2
    0011 xcf02s 3
    0100 xcf02s 4
    0101 xcf02s 5
    0110 xcf02s 6
    0111 xcf02s 7
    1000 xcf02s 8
    1001 xcf02s 9
    1010 xcf02s 10
    1011 xcf02s 11
    1100 xcf02s 12
    1101 xcf02s 13
    1110 xcf02s 14
    1111 xcf02s 15
    
    

    xcf02s 的 BSDL 文件是从 BSDL 模型中选择配置,点击 Platform Flash BSDL Models 进行下载,如图 3-62 所示。

    图 3-62 BSDL 文件的下载(3/3)

    解压缩下载文件,将解压缩后的文件 xcf02s.bsd 复制到“C:\Program Files (x86)\UrJTAG\data\”。然后在 JTAG Shell 执行以下命令,并将执行结果复制到 xcf02s。

    jtag> bsdl dump xcf02s.bsd
    
    

    最后,在“C:\Program Files (x86)\UrJTAG\data\xilinx\PARTS”文件中追加如下记述,以向部件列表中添加 xc3s250e。

    0001110000011010       xc3s250e       xc3s250e
    
    

    xcf02s 已经包含在部件列表,不需要另行添加。

  • FPGA 配置方法

    接下来说明 FPGA 的配置方法。首先用 USB 线将计算机和 AZPR EvBoard 连接,启动 JTAG Shell。在 JTAG Shell 执行以下命令,就会识别 FPGA。

    jtag> cable jtagkey
    jtag> detect
    
    

    detect 命令执行后,会打印出如下信息:

    IR length: 14
    Chain length: 2
    Device Id: 00010001110000011010000010010011 (0x0000000011C1A093)
      Manufacturer: Xilinx
      Part(0):         xc3s250e
      Stepping:     1
      Filename:     c:\program files (x86)\urjtag\data/xilinx/xc3s250e/xc3s250e
    Device Id: 11110101000001000101000010010011 (0x00000000F5045093)
      Manufacturer: Xilinx
      Part(1):         xcf02s
      Stepping:     15
      Filename:     c:\program files (x86)\urjtag\data/xilinx/xcf02s/xcf02s
    
    

    从输出的信息中我们可以看出,xc3s250e 为 part0、xcf02s 为 part1。

    如果使用从 BIT 文件制作的 SVF 文件,则输入以下命令选择 xc3s250e :

    jtag> part 0
    
    

    如果使用从 MCS 文件制作的 SVF 文件,则输入以下命令选择 xcf02s :

    jtag> part 1
    
    

    假设之前生成的 SVF 文件路径为“D:\sample.svf”,执行以下命令即可开始 FPGA 的配置。

    jtag> svf D:\sample.svf
    
    

    如果在命令中追加 progress 选项,可以在配置时显示完成的进度。

    jtag> svf D:\sample.svf progress
    
    

专栏

cblsrv-0.1_ft2232

配置 AZPR EvBoard 的 FPGA 还可以使用 fenrir 制作的“cblsrv-0.1_ft2232”。

cblsrv-0.1_ft2232

http://fenrir.naruoka.org/archives/000644.html

使用该工具可以和赛灵思的配置工具 iMPACT 配合,通过 AZPR EvBoard 搭载的 FT2232 进行配置。使用该方法无需使用 BIT 或 MCS 文件制作 SVF 文件。使用方法请参照上面的 URL。

但是,我们向 fenrir 确认过,cblsrv-0.1_ft2232 只能支持最高到 ISE 11 版本。最新版的 ISE 有可能不能正常工作。并且由于 Windows 7 只能使用 ISE 12 以上版本,只能在装有 Windows XP 系统的计算机使用 ISE 11。

3.2.5 交叉汇编程序

汇编程序是将汇编语言编写的程序翻译为机器语言的系统软件。机器语言的表现形式为二进制序列,用户很难理解和使用。因此我们使用和机器语言指令一一对应的助记符进行编程。

我们先使用汇编语言进行编程,然后用汇编器将其翻译为机器语言。汇编语言和机器语言的对应关系如图 3-63 所示。

图 3-63 汇编语言和机器语言

  • 安装

    由于汇编语言和机器语言是一对一的映射关系,因此依赖于 CPU 的架构。我们为 AZ Processor 特有的指令集设计了专门的汇编器,名为 AZPR ASM。该汇编器可以在本书的“读者支持网页”下载(http://gihyo.jp/book/2012/978-4-7741-5338-4/support)。

    下载完成后请建立“C:\azpr\azprasm\”目录,并将编译器主程序 azprasm.exe 放入该目录。接下来在 Windows 7 的开始菜单中右键单击计算机,选择属性。然后,单击左侧的高级系统设置,打开系统属性对话框。

    图 3-64 系统属性

    选择系统属性对话框的高级标签,单击环境变量按钮,打开环境变量对话框,如图 3-65 所示。

    图 3-65 环境变量

    单击环境变量对话框中用户变量的新建按钮,弹出如图 3-66 所示的新建用户变量对话框。在变量名中填写 Path,在变量值中填写刚才放置 azprasm.exe 的完整路径地址。

    图 3-66 新建用户变量

    在本书的示例中,路径填写为:

    C:\azpr\azprasm
    
    

    如果用户变量中已经包含名为 Path 的变量,则点击编辑按钮,在变量值的最后追加分号“;”,加上 azprasm.exe 的完整路径。比如,Path 变量值为 C:\hoge 的话,新变量值为:

    C:\hoge;C:\azpr\azprasm
    
    

    Path 设置结束后就完成了编译器的安装。打开命令行窗口并执行 azprasm 命令,如果显示出如下的 Usage 信息,则表示安装正确。

    C:\Users\respon>azprasm
    Usage: azprasm [ -o outfile ] infile
    
    

    如果显示如下信息,则表示编译器没有正确安装。

    C:\Users\respon>azprasm
    'azprasm' 不是内部或外部命令,也不是可运行的程序或批处理文件。
    
    

    这种情况请确认 azprasm.exe 的目录、环境变量是否设置正确。

  • 使用方法

    启动命令行,执行 azprasm 命令并指定源代码文件,即可输出转换为机器语言的程序文件。azprasm 命令的参数如表 3-5 所示。

    表 3-5 azprasm 命令参数

    参数 说明
    -o outfile outfile 处指定输出二进制文件的名字
    -p prgfile 按照 prgfile 指定的文件名生成 PRG 文件
    --coe coefile 按照 coefile 指定的文件名生成 COE 文件。请注意参数名前有两个减号

    “-o”参数用来指定输出二进制文件的名称。缺省时输出文件名为 outfile。“-p”参数用来指定 PRG 文件名并生成 PRG 文件。在使用第 1 章介绍的 iverilog 工具仿真时,需要初始化内存用的 PRG 文件。详情请参见 1.4.3 节的“载入存储镜像”部分。“-p”参数缺省时不生成 PRG 文件。“--coe”参数用来指定 COE 文件名并生成 COE 文件。COE 文件为设定块 RAM 初始值的文本文件。该文件在 ISE Project Navigator 中的 Block RAM Generator 对话框中使用。详情请参见 3.2.3 节的“生成 BIT 文件”部分。“--coe”参数缺省时,不生成 COE 文件。

    下面是在命令行下执行汇编程序的示例。该命令中输入名为 sample.asm 的源程序文件,并将其汇编为 AZPR ASM 机器语言,生成名为 sample.bin 的输出文件。

    C:\Users\respon>azprasm -o sample.bin sample.asm
    
  • 程序格式

    • 助记符

      AZPR ASM 助记符一览如表 3-6 所示。各指令的详细介绍请从本书官方网站下载 AZ Processor Specification Sheet 进行查阅。

      表 3-6 助记符一览

      种类 指令
      逻辑运算指令 ANDR, ANDI, ORR, ORI, XORR, XORI
      算术运算指令 ADDSR, ADDSI, ADDUR, ADDUI, SUBSR, SUBUR
      移位指令 SHRLR, SHRLI, SHLLR, SHLLI
      分支指令 BE, BNE, BSGT, BUGT, JMP, CALL
      内存指令 LDW, STW
      特殊指令 TRAP
      特权指令 RDCR, WRCR, EXRT
    • 汇编指示

      汇编指示是用来指示汇编器操作的记述。AZPR ASM 的汇编指示一览如表 3-7 所示。

      表 3-7 汇编指示一览

      汇编指示 功能
      LOCATE 改变程序起始地址
      EQU 符号设定
      high 截取地址的 16 位到 31 位的值转换为 16 位整数
      low 截取地址的 0 位到 15 位的值转换为 16 位整数
      • LOCATE

        LOCATE 用来改变程序的起始地址。例如,在程序中进行如下设置时,程序的起始地址变为 0x20000000。

        LOCATE 0x20000000
        
        

        图 3-67 说明了改变程序起始地址的示例。

        图 3-67 改变程序起始地址的示例

      • EQU

        EQU 用来设置符号。符号是用字符串替换程序中的数值。使用符号可以让程序易读,更容易让大家了解指令执行对象的含义。下面是 EQU 记述的示例。

        SYMBOL EQU 100
        
        

        通过这条语句记述,程序中 SYMBOL 字符串就和数值 100 等价了。下面是使用符号的示例。

        ADDUI r0,r1,SYMBOL
        
        

        这条指令与下面的指令等效。

        ADDUI r0,r1,100
        
      • high

        high 用来截取地址的 16 位到 31 位的值转换为 16 位数值。high 也可以作用于 LABEL。下面是 high 的记述示例。

        high(LABEL)
        
        

        图 3-68 为使用 high 进行值变换的示例。

        图 3-68 使用 high 进行值变换

      • low

        low 用来截取地址的 0 位到 15 位的值转换为 16 位数值。low 也可以作用于 LABEL。下面是 low 的记述示例。

        low(LABEL)
        
        

        图 3-69 为使用 low 进行值变换的示例。

        图 3-69 使用 low 进行值变换

    • LABEL 的形式

      我们可以为指令所在的地址赋予一个 LABEL(标签)。格式为 LABEL 名后接冒号( :)。下面为 LABEL 的示例。示例中为“XORR r0,r0,r0”指令赋予了一个名为 LABEL 的标签。

      LABEL:
              XORR    r0,r0,r0
      
      

      LABEL 可以用来直接替换 low、high 的地址参数,或是替换分支语句的分支目的地址。

    • 指令的形式

      指令由助记符和操作数组成。助记符和操作数之间需要隔开一个以上的半角空格或 TAB 符号。

      • 助记符

        可以用助记符表示的指令一览,请参见表 3-6。

      • 操作数

        操作数是作为指令操作对象的数据。LABEL、通用寄存器、CPU 控制寄存器以及 常数都可以作为操作数使用。

        使用 LABEL 作为操作数时,操作数处填写程序内声明过的 LABEL 名。LABEL 对应的值为 16 位以上时,要使用 high 或 low 汇编指示进行截取。通用寄存器用 r0~r31 作为操作数记述,形式为 r 加通用寄存器的编号。CPU 控制寄存器用 c0~c7 作为操作数记述,形式为 c 加 CPU 控制寄存器的 Register Address。常数分为整数常数和字符常数。整数常数可以使用八进制、十进制和十六进制。数字最左边开头一位如果为 0 表示该数值为八进制,如果为 0x 则表示该数值为十六进制。字符常数的值需用单引号( ' )包围。表 3-8 为整数常数的表述方法示例。

        表 3-8  整数常数的表述

        进制
        8 0173
        10 123
        16 0x7B

        下面为指令的记述示例。

        LABEL:
                XORR    r0,r0,r0
                ADDUI   r0,r1,0x100
                BE      r0,r1,LABEL
        
    • 注释的形式

      注释是与程序执行无关的文字。写在分号(;)之后的文字会被认为是注释。

3.2.6 第一个程序

作为制作的第一个程序,我们一起实现一个控制 LED 的功能。LED 被分配对应到 AZ Processor 的 GPIO Output Port 的寄存器。GPIO 控制寄存器被映射到内存空间,起始地址为 0x80000000。图 3-70 和表 3-9 为 GPIO Output Port 寄存器的详细信息。

图 3-70 GPIO Output Port 寄存器的结构

表 3-9 GPIO Output Port 寄存器详情

详情

0 ~ 15

控制七段数码管

16

控制 LED1

17

控制 LED2

18 ~ 31

未分配

由于偏移量为 0x4,GPIO Output Port 寄存器的内存映射地址为 0x80000004。AZPR EvBoard 上 LED1 被分配到 GPIO Output Port 寄存器的第 16 位,LED2 被分配到第 17 位。0 到 15 位则分配给了七段数码管。七段数码管将在 3.6 节中详述,此处不作深入介绍。18 到 31 位为空闲未分配状态。

GPIO Output Port 为负逻辑,因此值为 0 时 LED 点亮,值为 1 时 LED 熄灭。代码 3-1 所示的程序实现了点亮 LED1,熄灭其他 LED 的功能。

代码 3-1 LED 控制程序(led.asm)

 1  ;;; 符号定义
 2  GPIO_BASE_ADDR_H    EQU 0x8000      ;GPIO Base Address High
 3  GPIO_OUT_OFFSET     EQU 0x4         ;GPIO Output Port Register Offset
 4
 5  ;;; 点亮LED
 6      XORR    r0,r0,r0
 7      ORI     r0,r1,GPIO_BASE_ADDR_H  ;将GPIO Base Address高16位存入r1
 8      SHLLI   r1,r1,16                ;左移16位
 9      ORI     r0,r2,0x2               ;输出数据设为r2高16位的值
10      SHLLI   r2,r2,16                ;左移16位
11      ORI     r2,r2,0xFFFF            ;输出数据设为r2低16位的值
12      STW     r1,r2,GPIO_OUT_OFFSET   ;输出数据写入GPIO Output Port
13
14  ;;; 无限循环
15  LOOP:
16      BE      r0,r0,LOOP              ;返回LOOP
17      ANDR    r0,r0,r0                ;NOP

  • 符号定义

    程序最开始处为符号的定义。程序中为了方便访问 GPIO Output Port 寄存器,在此处定义了 GPIO 控制寄存器的基地址和 GPIO Output Port 寄存器的偏移量。

  • 控制 LED

    首先将 r0 设为 0,将 r0 作为一直保存 0 值的寄存器使用。后面程序的开头也有同样的记述,请记住这一点。第 7、8 行将 GPIO 控制寄存器的基地址 0x80000000 放入 r1。由于 AZ Processor 的立即数只能为 16 位,需要用图 3-71 所示的方法,先将控制寄存器基地址高 16 位 0x8000 存入 r1,然后使用 SHLLI 指令左移 16 位。

    图 3-71 基地址设置指令和 r1 的值

    第 9~11 行把要输出到 GPIO 的数据 0x2FFFF 放入 r2。控制 LED1 的第 16 位为 0,控制 LED2 的第 17 位和七段数码管的 0 到 15 位为 1。第 12 行处使用 STW 指令将 r2 的值写入 GPIO Output Port 寄存器的地址 0x80000004。

  • 无限循环

    GPIO 访问完成后,就不需要执行其他指令了。但 AZ Processor 还会在每个时钟周期读取下一条指令。因此使用 BE 指令反复跳转到 LOOP 标签处形成无限循环。这种结束的方式称为动态结尾(Dynamic End)。AZ Processor 的包含 BE 指令在内的分支执行后皆为延迟空隙。延迟空隙中的指令,不论其之前分支指令是否跳转,都会被执行。本书中分支指令后都会写入一条作为 NOP 的 ANDR r0,r0,r0 指令。

    NOP 是 No Operation 的简称,指不执行任何操作的指令。分析下上面 ANDR 指令的含义即可明白,r0 与 r0 逻辑与运算后的值存入 r0,结果 r0 中的值与执行 ANDR 指令前没有任何变化。

下面就在 AZPR EvBoard 上验证一下我们的程序。首先按照刚才的代码编写程序文件。启动文本编辑器,输入代码 3-1 的内容,并保存为文本文件。我们这里给这个记述了控制 LED 程序的文本文件起名为 led.asm。

然后使用编译器编译源程序。启动命令行并进入上面制作的源文件的目录。比如源文件放在“D:\azpr\program\”,则执行以下命令:

C:\Users\respon>D:

D:>cd azpr\program

D:\azpr\program>

执行编译器编译源程序的命令如下所示:

D:\azpr\program>azprasm led.asm -o led.bin --coe led.coe

在 led.asm 所在的目录中会生成两个文件,一是可在 AZ Processor 上执行的机器语言文件 led.bin,另一个是在 ISE Project Navigator 的 Block Memory Generator 对话框中用来初始化块 RAM 的 led.coe 文件。AZ Processor 上执行的机器语言文件称为 BIN 文件。由于本次操作流程通过使用 COE 文件初始化块 RAM 来写入程序,因此不使用 led.bin。

接下来制作 BIT 文件。BIT 文件制作流程请参见 3.2.3 节的“生成 BIT 文件”。在生成 x_s3e_sprom 时,导入刚才编译器输出的 led.coe 文件。在 Block Memory Generator 对话框画面中,如图 3-72 所示,勾选 Memory Initialization 的 Load Init File,并单击 Browse 按钮,然后选择 led.coe 文件。

图 3-72 Block Memory Generator

然后使用 BIT 文件生成 SVF 文件。请依据 3.2.3 节中“制作 SVF 文件”的方法生成 led.svf。在 iMPACT 画面的 Create SVF File 中指定 led.svf,在 Add Device 对话框中选择刚才生成的 led.bit。然后选择 Device 上的 Program 即会生成 SVF 文件 led.svf。

最后,使用 UrJTAG 执行 SVF 文件。首先,插上 AZPR EvBoard 电源,使用 USB 线和计算机相连。计算机识别设备后,启动 UrJTAG,按照 3.2.4 节中“FPGA 配置方法”所提的方法进行配置。

jtag> cable jtagkey
jtag> detect
jtag> part 0
jtag> svf led.svf progress

经过以上操作,就完成了包含程序 ROM 的 AZ Processor 的配置。如果前面的操作全部正确执行,AZ Processor 就会按照程序执行,结果如照片 3-3 所示,LED1 点亮且其他 LED 熄灭。

照片 3-3 LED 控制程序执行的样子

从下一节开始,我们将利用前面讲解的工具做进一步开发。因此,在这里确认程序能够正确执行非常重要。如果无法输出期待的结果,请重新回到本节检查操作方法。

目录