![零点起飞学Xilinx FPG](https://wfqqreader-1252317822.image.myqcloud.com/cover/469/31794469/b_31794469.jpg)
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所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P73_40880.jpg?sign=1739535192-BV2COjBQxMQCx85hGznuO8iqbHAwGJd6-0-0d93a14e2dbbea0abcac6eae9105fc51)
图3-56 开始菜单
(2)在ISE Project Navigator开发环境里选择菜单命令File→New Project,如图3-57所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P74_40895.jpg?sign=1739535192-WLbjX4U6HFZwJRAcW8YuDxJH40VtsMJJ-0-644f542698af3c81bbc9c86f8577e692)
图3-57 新建工程
(3)在弹出的对话框中输入工程名和工程存放的目录,这里指定led_test作为工程名,工程存放的路径可以自己选择,如图3-58所示,单击Next按钮。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P74_40899.jpg?sign=1739535192-1DPMb9LyAnL9DGiD1EdFvXCwJ9kmfAku-0-65863e58fca6f77a5655fad69faa08de)
图3-58 命名工程及工程存放路径
(4)在接下来的对话框中选择开发板所用的FPGA器件型号并进行工程参数配置。这里Family栏选择Spartan6,Device栏选择XC6SLX9,Package(封装)为TQG144,使用Verilog语言编程,单击Next按钮,如图3-59所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P75_40907.jpg?sign=1739535192-sgEGiHLBYJ2mJdxJ0XTgCPUd6JnTsEk9-0-8d388d04deb76935a211116a99f6c8d5)
图3-59 工程设置
(5)直接单击Finish按钮完成工程创建,如图3-60所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P75_40911.jpg?sign=1739535192-sWDTw5rErZegYHI9YzmoiSKmsHUoADh2-0-e684ce257423684a94f4a1fb144b9900)
图3-60 工程概要
3.4.3 编写Verilog代码
在工程创建完毕后,即可编写相应的Verilog代码。
【例3-20】创建流水灯工程。
(1)新建led_test文件(选择菜单命令Project→New Source),在弹出的New Source Wizard对话框中选择Verilog Module并输入文件名led_test,如图3-61所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P76_40921.jpg?sign=1739535192-fWA38m5Ld0TUXLoAYlRXzBIFkAPqegLa-0-409bd262cccd0b0edeeadb91e4945ef9)
图3-61 选择文件类型
(2)在端口定义对话框中可以先不作任何定义,直接单击Next按钮,如图3-62所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P76_40925.jpg?sign=1739535192-tnK2ljNamcDQp0AU786RtH9w7NDxy81V-0-fa5a1363cc1c0be62e62ced591919160)
图3-62 定义端口
(3)单击Finish按钮完成文件新建工作,如图3-63所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P77_40933.jpg?sign=1739535192-2wB1hLOBxkxC6gQsfRDQWltJUUmidO8P-0-da57cec62a813649ef0d04323477f97a)
图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,依次循环。具体的操作代码如下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P77_79493.jpg?sign=1739535192-vdRSKjC7FzBGv5pvINXjga7VzFEg51ym-0-5298b6c3f73cfbdb5f0b6f09a4f4a032)
(5)编写好代码后保存,led_test.v自动成为工程的顶层文件,如图3-64所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P78_41219.jpg?sign=1739535192-XaeyDmzbM7fIC6P7Ad0oz5ezbJma9QXf-0-d4dab862ab5fd97ea0e7a1285d9451c5)
图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所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P79_41305.jpg?sign=1739535192-Hdk9jMc2BJ8TVIHf4d1ofuOyCSGuHpLW-0-17a3b7972be185e979fcfc1600f3eb66)
图3-65 选择文件类型
(2)在这个Text文件中添加以下引脚定义代码。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P79_79495.jpg?sign=1739535192-ZNytVUi4dtMCylDSPC1SVnT6VcRg55uz-0-be50d0142fc50f7581a6610d1b637bb8)
需要注意的是,UCF文件代码是大小敏感的,端口名称必须与源代码中的名字一致,且端口名字不能和关键字相同。但是关键字NET是不区分大小写的。
(3)将代码保存为文件led_test.ucf,单击Project→Add source命令,把led_test.ucf文件添加到工程中,如图3-66所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P79_41302.jpg?sign=1739535192-HkXC7X9v14nNBgfiZxplCkY6MyJzMeQp-0-089e587bbd5536db2616819bbdbddb63)
图3-66 添加UCF文件
3.4.5 编译工程
保存工程并开始编译:单击Generate Programming File项软件自动生成bit文件,用于FPGA的配置。
编译成功后在Console窗格出现编译成功的信息,如图3-67所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P80_41314.jpg?sign=1739535192-bNHWhNph7Ysph6UwWYLOdCNWF3DLAw3w-0-8945071039b52482a30043bf42f1a98b)
图3-67 生成bit文件
3.4.6 ISE仿真
接下来让ISE自带的仿真工具输出波形,以验证流水灯程序实现的结果和预想的是否一致。
【例3-22】使用ISE仿真验证流水灯设计。
(1)在使用ISE仿真前需要确认设置,单击菜单命令Project→Design Properties,如图3-68所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P81_41323.jpg?sign=1739535192-yfxmPrbWmrgcFIYz0WEUwMzG1CxqPzdA-0-8fcf725ce0301e6b31717ba61cc12922)
图3-68 仿真设置
如图3-69所示,先确认Simulator的选择为ISim(VHDL/Verilog)。其实此项在新建工程时已经设定好了,为保万无一失,还是确认一下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P81_41326.jpg?sign=1739535192-xN1ubKFVyOW8OZ9PkhGKqdvDOARkEcug-0-dea20a1b36e9d1745befa3f4db12bed6)
图3-69 修改仿真器
(2)接下来编写测试脚本文件。单击Project→New Source命令,如图3-70所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P82_41333.jpg?sign=1739535192-0KblGIIvZgPdTyg6BXmMASLSGxyHepPG-0-04cb46edb0b0108a2f553ce08b1c4972)
图3-70 新建脚本
(3)如图3-71所示,选择新建源文件类型为Verilog Test Fixture,输入测试脚本文件的名字vtf_led_test和存放路径。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P82_41337.jpg?sign=1739535192-jttpTcGFlm00WX9McWanjr7EURFkwjgJ-0-0365b78b50b75dcb6435c635497b89e1)
图3-71 选择文件类型
(4)这里Associate Source是所选择测试脚本对应的设计源文件。由于只有一个设计源文件,因此选中led_test.v,然后单击Next按钮,如图3-72所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P83_41346.jpg?sign=1739535192-3q30jW48NwkXm041GDLVdA4Ne22eUaUa-0-89c2f35ec39332190eee314fe2771ef8)
图3-72 关联设置
(5)单击Finish按钮完成设置,如图3-73所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P83_41350.jpg?sign=1739535192-wGjd2AYQ8nqIZexUo9VwlLKLN4MPWvAv-0-5fe0f814b2f87587d096ae590c1355c2)
图3-73 工程概要
(6)这里的测试脚本只是一个基本模板,它把设计文件led_test的接口在这个模块里例化声明了,接下来需要手动添加复位和时钟激励。完成后的脚本文件如下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P84_79497.jpg?sign=1739535192-0hApFyXdjKrOeAmWIylUcsydf6UpWnJH-0-9fe7a0ac4e3de1f93c26213cc1f62629)
(7)保存后vtf_led_test.v成为这个仿真Hierarchy的顶层文件了,选中vtf_led_test.v文件,然后双击Simulation Behavioral Model,随后启动仿真程序,如图3-74所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P84_41510.jpg?sign=1739535192-5NlAwA2mGJ4Cl05g73OB9M0ZYc1Jof1G-0-0e425061c9072f90b67d7736c58e192a)
图3-74 ISim界面
(8)将时间单位设置为1μs,多次单击按钮运行,结果如图3-75所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P85_41521.jpg?sign=1739535192-xETUZmfSDW58VDz2m5kEnbMYOFUaMae3-0-e3645aaa88b8d58e5094f2adaab910c4)
图3-75 仿真运行
3.4.7 ModelSim仿真验证
接下来使用仿真工具ModelSim输出波形,验证流水灯程序实现的结果和预想的是否一致。
【例3-23】使用ModelSim仿真验证流水灯程序。
(1)在使用ISE仿真前需要确认一下设置,单击菜单的Project→Design Properties命令,如图3-76所示。如图3-77所示,将Simulator的选择改为ModelSim-SE Mixed。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P86_41530.jpg?sign=1739535192-PFXKse4sf2vswA8X9UNwOK2K4pFmR3SM-0-14038ed991e389544b2989ec0488b4dd)
图3-76 仿真器设置
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P86_41533.jpg?sign=1739535192-jy3VPh7luc1wvLfd01XEox3l5LbPFvSW-0-9181cb16f8ad68c85ac2ec069e2d001b)
图3-77 修改仿真器
(2)先切换到Simulation模式,再选中led_test.v文件,右击依次选择Simulate Behavioral Model和Process Properties,弹出Process Properties对话框,在右边的Compiled Library Directory输入框填入之前编译库时设置的已编译库的路径C:\Xilinx\Xilinx_lib。其他选项使用默认设置即可,单击OK完成设置,如图3-78所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P87_41542.jpg?sign=1739535192-27kQlEpgFvAa5Sa8mhkVPo6zbUuV2EA4-0-2d22a4d0c9bfc981c829cf33a15b613c)
图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所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P87_41545.jpg?sign=1739535192-QNsrPPyuS1OgaKtyFLSVXpQmZPVpEAWu-0-4374f677b3b393ebe02a6f23a3fbe0a0)
图3-79 ModelSim界面
(8)在ModelSim界面,可以打开Wave窗格查看设计效果。ModelSim的使用并不难,如何使用的资料网上也很多,大家要多动手,多尝试,相信很快就会上手。这里把led_test.v程序里的timer计数器放到Wave窗格中观察,如图3-80所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P88_41552.jpg?sign=1739535192-8pfb3x7ivM52dl7hifzkABcjB9rDjoGf-0-026657f21cb63313517878689ad16e62)
图3-80 添加Wave
(9)将时间单位设置为1μs,单击Restart按钮复位,再多次单击Run按钮,ModelSim会运行到$stop的地方,如图3-81所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P88_41555.jpg?sign=1739535192-CU16x7yRRYGRJxfEWzi3SM9zT4SreWzw-0-2443c543f15a37122a9f81ea92ed0a2a)
图3-81 仿真代码
(10)在Wave窗格可以看到timer寄存器在复位信号rst_n变高后开始计数,如图3-82所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P89_41562.jpg?sign=1739535192-IViq0kqbOFUwSd9ElfffulN1al2hKPrP-0-99ae5b087677753b5022c5defa2c7cfe)
图3-82 计数波形
(11)因为在仿真程序vtf_led_test.v里设置的仿真时间比较短,所以可以屏蔽掉vtf_led_test.v程序中的$stop语句,让程序一直运行。修改vtf_led_test.v文件后保存,如图3-83所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P89_41566.jpg?sign=1739535192-2bmBcXyrWKpwZCQuB05tDJvZCv4bzH3O-0-ae74acd883b369e20f5c8d9ea7fe2f39)
图3-83 测试程序
(12)重新打开ModelSim软件,单击Restart按钮和Run all按钮,ModelSim开始运行。多次单击Run按钮,这时可以看到led的信号值会逐个变0,说明LED逐个被点亮,如图3-84所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P90_41574.jpg?sign=1739535192-icmy74vo1zf9NfDJi0g832KmAZoamh6L-0-914458d488b42f403d085cbe36acdf44)
图3-84 仿真结果
仿真平台通常选用ModelSim,本书在展示之后的仿真实例时均使用ModelSim。通过学习本实例,读者会对ISE软件的基本用法有初步了解。