![零点起飞学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=1739037849-TU473saM0XWJZCgBRe6TUGg2cR0VVoxL-0-495c0d4d0246dd0d4b4d2b6ee1d49be3)
图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=1739037849-Zpw7vUFGrNZVFzqZJHboFXuJ5dyDADlM-0-c67e7aaa27dba2eacfac7ec9543f27b4)
图3-57 新建工程
(3)在弹出的对话框中输入工程名和工程存放的目录,这里指定led_test作为工程名,工程存放的路径可以自己选择,如图3-58所示,单击Next按钮。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P74_40899.jpg?sign=1739037849-slvUqhleK636l2g15d3U8V0byg0kLQTT-0-eead2b9f88b6a19b39d022f3d458afbc)
图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=1739037849-aUDdqCp8Zm05rVO2L36oLF6ACfAMdste-0-8787cbb9e897ed7e994818a15ef5f57c)
图3-59 工程设置
(5)直接单击Finish按钮完成工程创建,如图3-60所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P75_40911.jpg?sign=1739037849-1xQOcNrDmfORNcVFa65Oj3kO41MnG8GP-0-73341717370d3efac321d6bdda8e00d9)
图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=1739037849-a0Av9fP2iyYSUR51FF3WwLwaDZNEHASE-0-6c946ec0279a46f9632b6490657729e7)
图3-61 选择文件类型
(2)在端口定义对话框中可以先不作任何定义,直接单击Next按钮,如图3-62所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P76_40925.jpg?sign=1739037849-RCJ9mWO3WR2F2SwNDDMUwZx0oIOwb1RC-0-4738d07254821792bb41a2a0077f64c7)
图3-62 定义端口
(3)单击Finish按钮完成文件新建工作,如图3-63所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P77_40933.jpg?sign=1739037849-z5SzmiXjDl6pNeIl92neuYJP13N1h5Ym-0-021fbe3e938b6d13ed19d14670a0ecb4)
图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=1739037849-QdpuFq4hhdbjphaSY3SpSX3svv0Lpy8x-0-5ee8e46647ee9a6af816db06b4e97b0c)
(5)编写好代码后保存,led_test.v自动成为工程的顶层文件,如图3-64所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P78_41219.jpg?sign=1739037849-ueyrErgUNv0IEOW7UTObuEweCl4LZCPo-0-bb0b13e100b3a460de0d6c90fec5495b)
图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=1739037849-71eKIMn7IpjFZltR6u9wtTJjabnITPqn-0-fc8acb2cd978a72eb4ed9af502946c43)
图3-65 选择文件类型
(2)在这个Text文件中添加以下引脚定义代码。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P79_79495.jpg?sign=1739037849-JGkm1E9lY0uzlq4VDzMSrtRgtkoVSCXn-0-e0a892261e5542d427567f86e2a10cb1)
需要注意的是,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=1739037849-z2nlJ0Zz6sXtR2W0tgSm3qDXs3rmKY68-0-fb05cd051dab1190b3cc3cfa8c79b32c)
图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=1739037849-havLZMY95rEnCBbw3s9chVjaOv3NrTSA-0-c94327541b82b869565700c4a9d9d5d0)
图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=1739037849-lOpOkCF0HrZrIVmvOE4nkVrPvZ3Py5Xo-0-20f9648065c5a89ac940d0f83586d693)
图3-68 仿真设置
如图3-69所示,先确认Simulator的选择为ISim(VHDL/Verilog)。其实此项在新建工程时已经设定好了,为保万无一失,还是确认一下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P81_41326.jpg?sign=1739037849-hyIgH9MUYU53yPdRurnvgmecbsPNgYr4-0-d22807552298624055cb4993689e42bf)
图3-69 修改仿真器
(2)接下来编写测试脚本文件。单击Project→New Source命令,如图3-70所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P82_41333.jpg?sign=1739037849-mCOvy9CoAcnDuG9iW5lhb9y0L3Oj5Caz-0-98cb4836cf644adfbd5ddc7b96f1224c)
图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=1739037849-Q5ghi9WWjdsFpv0jNTEFw0gnwKhe1v72-0-65d925048d8f0020de9ef87d5e3c7400)
图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=1739037849-leR0wr1lUnM2I2fZjGa2Op0YTZd1XoRl-0-548a5d3174b2f0a1c06a03059ba52f86)
图3-72 关联设置
(5)单击Finish按钮完成设置,如图3-73所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P83_41350.jpg?sign=1739037849-YfoV1PH5Tep5hTuEbAPBahhsd4rR9v69-0-d1eb42e1e2e6f357c0c857689b18d559)
图3-73 工程概要
(6)这里的测试脚本只是一个基本模板,它把设计文件led_test的接口在这个模块里例化声明了,接下来需要手动添加复位和时钟激励。完成后的脚本文件如下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P84_79497.jpg?sign=1739037849-e2Xl0nqjqgIdSru4TltJJLiwTYdDLvwX-0-3c7bde8146f6917ce2db9236894600d4)
(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=1739037849-QM1qstbwh2ST9uO6SdWLPoRDAXfgEckp-0-fa55a520556c7593039f7f25ef6de952)
图3-74 ISim界面
(8)将时间单位设置为1μs,多次单击按钮运行,结果如图3-75所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P85_41521.jpg?sign=1739037849-VMDdwQFC141P2C4wCW3jsmTE1mAsADb1-0-cc3fa30b9aa6430497e6c7bbedcef6b3)
图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=1739037849-gfMZ0Nfn1l6U1mIx6DrTrn2u1WXrGyfh-0-1c8ef7ca2e1ad7e2632d0c17a99f6060)
图3-76 仿真器设置
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P86_41533.jpg?sign=1739037849-8SS3cvQJRgVrVSEFJik2KHeSbi2oFsdj-0-1f66c62af43f4c5974017fa81322bb90)
图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=1739037849-6hPIoosgabN5EemdvM6BjqUWRLr3lTKT-0-a23a124829778a30d73ac36a4f9e3528)
图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=1739037849-xZR190xB3YAYVgDAKvULB8M93tDIhojt-0-591a8f84c83d8b47028ace7ddc417e13)
图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=1739037849-reDR1dprntu6HaZ7GZEKZWCr3F5mq7so-0-4ccfdca0d55c6c7cc37730f8fb379fbf)
图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=1739037849-iNKS1CjTcIhIHItVCOlj32JWI3ZltZQf-0-8f9a038f40d1ea028d37326512252b14)
图3-81 仿真代码
(10)在Wave窗格可以看到timer寄存器在复位信号rst_n变高后开始计数,如图3-82所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P89_41562.jpg?sign=1739037849-bh9lPL9514mh4GLCFEWlMd9RMtJewldu-0-eef0e034ff56874e988154b702fcfadd)
图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=1739037849-3Fl6tz5HxMl1wZleErX7cpgwHuPp4sy2-0-12eca5dcc932e6050efac03724bae99e)
图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=1739037849-mq2XWVpeHlgZqEXnADs5Zc56pXV5myDa-0-41590ec928cd68f793d16382c66f4bc4)
图3-84 仿真结果
仿真平台通常选用ModelSim,本书在展示之后的仿真实例时均使用ModelSim。通过学习本实例,读者会对ISE软件的基本用法有初步了解。