![零点起飞学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=1738845161-bnYK16zZnZTZIPGOnJHIV0TdQyMWMc0B-0-e5d227fe0eab11c7b05e6e34748e1756)
图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=1738845161-dMxWl6J2nNihIPVAH6lPNmuYacIfN75E-0-d06911f94078d4eca54ac06fff22e33f)
图3-57 新建工程
(3)在弹出的对话框中输入工程名和工程存放的目录,这里指定led_test作为工程名,工程存放的路径可以自己选择,如图3-58所示,单击Next按钮。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P74_40899.jpg?sign=1738845161-tMlTyOEYFhTZJqG8M6OtzqzHmdjv4jhJ-0-31ac34cf9bd19a493084c7f6bebc6566)
图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=1738845161-IdehxKF3YcXeeYODMMvrYzUNLO5NFGFJ-0-1261637bcd8f719b8136f8df0c5852d6)
图3-59 工程设置
(5)直接单击Finish按钮完成工程创建,如图3-60所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P75_40911.jpg?sign=1738845161-4KYuCcgJ236a1lWMLs5jgQQaYiRYBBOP-0-5430af0b0bc491e5fcd627e08047972a)
图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=1738845161-uzZgIFR0Xblsu3Xn5SoCGIbtwnUgGdcC-0-06b069d132ebfbd18112d9cb7dce4de3)
图3-61 选择文件类型
(2)在端口定义对话框中可以先不作任何定义,直接单击Next按钮,如图3-62所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P76_40925.jpg?sign=1738845161-3rRWAJ3PaqH9Cq6b2opXXlZXMJKg1jFn-0-4be69432b4a9874e4c7aa73e07505ef5)
图3-62 定义端口
(3)单击Finish按钮完成文件新建工作,如图3-63所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P77_40933.jpg?sign=1738845161-9fgI8swIIKRvMsGbIXZdCfdoI94fQkgv-0-f01e5b0dc62e8294cec68e2aa8df59a8)
图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=1738845161-I56E9KBXLv21Tyclor8aWiZVbbFmaWs5-0-62f0586b62f5c7cb2181dfcd0ea3c879)
(5)编写好代码后保存,led_test.v自动成为工程的顶层文件,如图3-64所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P78_41219.jpg?sign=1738845161-TfT2wg7Awv92t4ZexoEzbOeNj0V0WR4e-0-29fd9518fd3ce441a5c64fba0ca0d0df)
图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=1738845161-P89UJ5RKeDR4QWNhyKn6BRBO6TGaszlk-0-b300c6dffc64ae13ed510043c30f6bd1)
图3-65 选择文件类型
(2)在这个Text文件中添加以下引脚定义代码。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P79_79495.jpg?sign=1738845161-PiFSuZolsESZkARkp89XHjyDsKkxzOVq-0-f2cbf6bef4c09ce34f64a97edb7b2314)
需要注意的是,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=1738845161-a8pD3c6VT1XJlum1rR2m8BQshAkEkU9H-0-cccee6c3a4989aecf3298303c7d9d7a7)
图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=1738845161-2GkZGPFAa863q9k29L34nGZxMeI7Bawm-0-9bdc897f5086f1a39a74dd27c3016640)
图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=1738845161-djPx0LtlNXNu7ZLCxrBg54fqwkQUrHmf-0-173036ac1152de9278cfdf2644e8fa56)
图3-68 仿真设置
如图3-69所示,先确认Simulator的选择为ISim(VHDL/Verilog)。其实此项在新建工程时已经设定好了,为保万无一失,还是确认一下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P81_41326.jpg?sign=1738845161-INO0sXvvNzqAIEx2ylUaukNMZiyrrerB-0-c8e464b720e34467ed0566f93abff815)
图3-69 修改仿真器
(2)接下来编写测试脚本文件。单击Project→New Source命令,如图3-70所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P82_41333.jpg?sign=1738845161-wP7ptEhhiJqOGz7Y7reu8uT0kTzTbCx8-0-e70fcc1cf2c757eb366718f547754599)
图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=1738845161-ZTv0hdQ58usURQysSyEizXoB8Hh1aQ8r-0-8043ce3d0340b30f77fb0fbee86bad5b)
图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=1738845161-a9aYdBtvDrlQUkpWIR0inhsEdT0jhrXs-0-ce0ae850d48890f293f8118bfc8b7cce)
图3-72 关联设置
(5)单击Finish按钮完成设置,如图3-73所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P83_41350.jpg?sign=1738845161-s53V2JKhlhdUIzCHew6DsinRejoWxZaI-0-6fb94a9b6a632c434d06799d1e2e1c6e)
图3-73 工程概要
(6)这里的测试脚本只是一个基本模板,它把设计文件led_test的接口在这个模块里例化声明了,接下来需要手动添加复位和时钟激励。完成后的脚本文件如下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P84_79497.jpg?sign=1738845161-xqBFMuuRjWMD9nbMS6HxHyfIlUmLE6QC-0-9bfe1f03f4763013a416786f886f039a)
(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=1738845161-inTPaXZEJx244zNLeU3bLS3jUrozKerO-0-f9c85c4c96ea693c50c694fda112aea8)
图3-74 ISim界面
(8)将时间单位设置为1μs,多次单击按钮运行,结果如图3-75所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P85_41521.jpg?sign=1738845161-aiwOXNP1vEaiVVyo2GYgqKF3PaqsJJ53-0-f3bfb6de776952000dd511efb0d02a99)
图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=1738845161-Q6fcaaHAdUABNaLNPAxvlMSpDdpzAD10-0-d701cae0ed8b76c61dae3417c6e3ee80)
图3-76 仿真器设置
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P86_41533.jpg?sign=1738845161-E2optoQwplaf49a2MCAtkZPDeTQhmZ2l-0-eeed498c67eeef6bd91f26b8e12c743b)
图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=1738845161-jGBpQIW3OsBEjT57hgI6k2l61aiMb2wV-0-34f726733daa7b8ee743b505a5b22ad4)
图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=1738845161-WvTYwGHUfKk5J7E2gSLSDpuV9mtNsSC3-0-856d905fa037d67c4de7fb9109e83455)
图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=1738845161-tgMtsedrciyUa5nCyddOS2EZ5aICJIKQ-0-ff948a33ed3292488d0704c17b9a46cc)
图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=1738845161-2sEgOQDLie9YC5GkypTj2LFUgubcEJku-0-566115f986bbd137270ad867498a4ef1)
图3-81 仿真代码
(10)在Wave窗格可以看到timer寄存器在复位信号rst_n变高后开始计数,如图3-82所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P89_41562.jpg?sign=1738845161-YmqYgx0Jcz3qftFG7mujZrZddywFU32h-0-1d4e5921a51762f5a3e498a9a0f5cf26)
图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=1738845161-GDQR8vsV9uBX4C3ZOGdTw628iWXIpKr9-0-9e02f7386b6a456828c9b005907af7d1)
图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=1738845161-hD7lmfBeVDx7vWMbRC18c3oLtYVCPpZB-0-e41844215522361a62712076b450d9d4)
图3-84 仿真结果
仿真平台通常选用ModelSim,本书在展示之后的仿真实例时均使用ModelSim。通过学习本实例,读者会对ISE软件的基本用法有初步了解。