
3.4 流水灯实例
本节将介绍从新建工程到仿真实现流水灯设计的全过程,即实现4个LED灯像流水一样轮流亮灭。
3.4.1 硬件介绍
本实例选用Xilinx公司推出的Spartan-6系列芯片。开发板上共有8个红色的LED灯,本实例涉及4个LED灯。
4个LED灯对应的FPGA芯片管脚情况如下。
LED0——PIN:P17
LED1——PIN:P16
LED2——PIN:P15
LED3——PIN:P14
3.4.2 创建工程
完成流水灯实验的首要步骤是创建新工程,然后在该工程内进行编写代码、综合和仿真等工作。
【例3-19】创建流水灯工程。
(1)启动ISE Project Navigator开发环境,在开始菜单中选择ISE Design Suite 14.7→ISE Design Tools→Project Navigator(这里选32-bit还是64-bit需要由用户的操作系统是32位还是64位决定),如图3-56所示。

图3-56 开始菜单
(2)在ISE Project Navigator开发环境里选择菜单命令File→New Project,如图3-57所示。

图3-57 新建工程
(3)在弹出的对话框中输入工程名和工程存放的目录,这里指定led_test作为工程名,工程存放的路径可以自己选择,如图3-58所示,单击Next按钮。

图3-58 命名工程及工程存放路径
(4)在接下来的对话框中选择开发板所用的FPGA器件型号并进行工程参数配置。这里Family栏选择Spartan6,Device栏选择XC6SLX9,Package(封装)为TQG144,使用Verilog语言编程,单击Next按钮,如图3-59所示。

图3-59 工程设置
(5)直接单击Finish按钮完成工程创建,如图3-60所示。

图3-60 工程概要
3.4.3 编写Verilog代码
在工程创建完毕后,即可编写相应的Verilog代码。
【例3-20】创建流水灯工程。
(1)新建led_test文件(选择菜单命令Project→New Source),在弹出的New Source Wizard对话框中选择Verilog Module并输入文件名led_test,如图3-61所示。

图3-61 选择文件类型
(2)在端口定义对话框中可以先不作任何定义,直接单击Next按钮,如图3-62所示。

图3-62 定义端口
(3)单击Finish按钮完成文件新建工作,如图3-63所示。

图3-63 工程概要
(4)接下来编写led_test.v程序。这里定义了一个32位的寄存器timer,用于循环计数0~199(4μs),计数到49(1μs)的时候,点亮LED1;计数到99(2μs)的时候,点亮LED2;计数到149(3μs)的时候,点亮LED3;计数到199(4μs)的时候,点亮LED4,依次循环。具体的操作代码如下。

(5)编写好代码后保存,led_test.v自动成为工程的顶层文件,如图3-64所示。

图3-64 顶层文件
3.4.4 UCF管脚约束
ISE的UCF文件主要用于完成管脚、时钟以及组的约束。本例需要将led_test.v程序中的输入/输出端口分配到FPGA的真实管脚上,为此要准备一个FPGA的引脚绑定文件led_test.ucf并添加到工程中。
【例3-21】编写UCF管脚约束。
(1)单击File→New,新建一个空白文件,在弹出的对话框中选择Text File,如图3-65所示。

图3-65 选择文件类型
(2)在这个Text文件中添加以下引脚定义代码。

需要注意的是,UCF文件代码是大小敏感的,端口名称必须与源代码中的名字一致,且端口名字不能和关键字相同。但是关键字NET是不区分大小写的。
(3)将代码保存为文件led_test.ucf,单击Project→Add source命令,把led_test.ucf文件添加到工程中,如图3-66所示。

图3-66 添加UCF文件
3.4.5 编译工程
保存工程并开始编译:单击Generate Programming File项软件自动生成bit文件,用于FPGA的配置。
编译成功后在Console窗格出现编译成功的信息,如图3-67所示。

图3-67 生成bit文件
3.4.6 ISE仿真
接下来让ISE自带的仿真工具输出波形,以验证流水灯程序实现的结果和预想的是否一致。
【例3-22】使用ISE仿真验证流水灯设计。
(1)在使用ISE仿真前需要确认设置,单击菜单命令Project→Design Properties,如图3-68所示。

图3-68 仿真设置
如图3-69所示,先确认Simulator的选择为ISim(VHDL/Verilog)。其实此项在新建工程时已经设定好了,为保万无一失,还是确认一下。

图3-69 修改仿真器
(2)接下来编写测试脚本文件。单击Project→New Source命令,如图3-70所示。

图3-70 新建脚本
(3)如图3-71所示,选择新建源文件类型为Verilog Test Fixture,输入测试脚本文件的名字vtf_led_test和存放路径。

图3-71 选择文件类型
(4)这里Associate Source是所选择测试脚本对应的设计源文件。由于只有一个设计源文件,因此选中led_test.v,然后单击Next按钮,如图3-72所示。

图3-72 关联设置
(5)单击Finish按钮完成设置,如图3-73所示。

图3-73 工程概要
(6)这里的测试脚本只是一个基本模板,它把设计文件led_test的接口在这个模块里例化声明了,接下来需要手动添加复位和时钟激励。完成后的脚本文件如下。

(7)保存后vtf_led_test.v成为这个仿真Hierarchy的顶层文件了,选中vtf_led_test.v文件,然后双击Simulation Behavioral Model,随后启动仿真程序,如图3-74所示。

图3-74 ISim界面
(8)将时间单位设置为1μs,多次单击按钮运行,结果如图3-75所示。

图3-75 仿真运行
3.4.7 ModelSim仿真验证
接下来使用仿真工具ModelSim输出波形,验证流水灯程序实现的结果和预想的是否一致。
【例3-23】使用ModelSim仿真验证流水灯程序。
(1)在使用ISE仿真前需要确认一下设置,单击菜单的Project→Design Properties命令,如图3-76所示。如图3-77所示,将Simulator的选择改为ModelSim-SE Mixed。

图3-76 仿真器设置

图3-77 修改仿真器
(2)先切换到Simulation模式,再选中led_test.v文件,右击依次选择Simulate Behavioral Model和Process Properties,弹出Process Properties对话框,在右边的Compiled Library Directory输入框填入之前编译库时设置的已编译库的路径C:\Xilinx\Xilinx_lib。其他选项使用默认设置即可,单击OK完成设置,如图3-78所示。

图3-78 路径设置
本节(3)~(6)步与3.4.6节(3)~(6)步相同,这里不再赘述。
(7)保存设置后vtf_led_test.v成为这个仿真Hierarchy的顶层了,它下面是设计文件led_test.v。选中文件vtf_led_test.v,然后双击Simulation Behavioral Model,随后启动仿真,如图3-79所示。

图3-79 ModelSim界面
(8)在ModelSim界面,可以打开Wave窗格查看设计效果。ModelSim的使用并不难,如何使用的资料网上也很多,大家要多动手,多尝试,相信很快就会上手。这里把led_test.v程序里的timer计数器放到Wave窗格中观察,如图3-80所示。

图3-80 添加Wave
(9)将时间单位设置为1μs,单击Restart按钮复位,再多次单击Run按钮,ModelSim会运行到$stop的地方,如图3-81所示。

图3-81 仿真代码
(10)在Wave窗格可以看到timer寄存器在复位信号rst_n变高后开始计数,如图3-82所示。

图3-82 计数波形
(11)因为在仿真程序vtf_led_test.v里设置的仿真时间比较短,所以可以屏蔽掉vtf_led_test.v程序中的$stop语句,让程序一直运行。修改vtf_led_test.v文件后保存,如图3-83所示。

图3-83 测试程序
(12)重新打开ModelSim软件,单击Restart按钮和Run all按钮,ModelSim开始运行。多次单击Run按钮,这时可以看到led的信号值会逐个变0,说明LED逐个被点亮,如图3-84所示。

图3-84 仿真结果
仿真平台通常选用ModelSim,本书在展示之后的仿真实例时均使用ModelSim。通过学习本实例,读者会对ISE软件的基本用法有初步了解。