![零点起飞学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=1739054095-9FydG6sb6Z6aY3m1btTMOv2rKv4Eq9v0-0-e96d7943065b1bd419d91b97d37321f1)
图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=1739054095-2lEHhg2C7b9BRBtVgGZQEmX0FIdZuijV-0-65591a9cdd7b054e08a0660e776deb42)
图3-57 新建工程
(3)在弹出的对话框中输入工程名和工程存放的目录,这里指定led_test作为工程名,工程存放的路径可以自己选择,如图3-58所示,单击Next按钮。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P74_40899.jpg?sign=1739054095-9og3C8GlZMSqlKdwqVH95f4s4IclcKwT-0-68a2ab340db733500d76cedecf2a4ca4)
图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=1739054095-3Vh5gHSvViEDfSC1dcjPpvcsMEjYuxB3-0-27c1d34a97ca7dcb708c7bc1f44a5ab7)
图3-59 工程设置
(5)直接单击Finish按钮完成工程创建,如图3-60所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P75_40911.jpg?sign=1739054095-9Hb6aqnoxc7SsEoaqymFSA1r5LKchFIJ-0-685758adeb029cd070bfe8fdfed9f8d0)
图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=1739054095-JetBTB0U5w5LmT4BH6y8BobhBK9YkuvN-0-bc2ef8d402f99e43e921f5f5ef061a2a)
图3-61 选择文件类型
(2)在端口定义对话框中可以先不作任何定义,直接单击Next按钮,如图3-62所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P76_40925.jpg?sign=1739054095-Yq7SgYGfIT8pOSf4mINq0uTcjHgcbzJf-0-cf67cfd86ab67d9a5a266c96dd2f9745)
图3-62 定义端口
(3)单击Finish按钮完成文件新建工作,如图3-63所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P77_40933.jpg?sign=1739054095-5B0xdjaGJWOzyitCHPBbETXMcsKOXLMM-0-45f32416c8763421b14bbc1f5d836945)
图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=1739054095-6ZXmFV4yISnULmykqAxFHP2wEHVa2eXl-0-19d42f41fba33a3fb049dee7950b3572)
(5)编写好代码后保存,led_test.v自动成为工程的顶层文件,如图3-64所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P78_41219.jpg?sign=1739054095-NOjk0AZfG3dXp4je4NzrfFNS35rd60s4-0-2d2a1964e1099528a09c8d6c0547888d)
图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=1739054095-pnOOUgD7tOJ7ehleHz9MDlAEZUtHAyfb-0-e5a6da4dd2f1eb4e82143bbe0c1e753d)
图3-65 选择文件类型
(2)在这个Text文件中添加以下引脚定义代码。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P79_79495.jpg?sign=1739054095-DrhmFAc4AcPmA1jHKZEip8JH116xhphf-0-b13c33f49f46f8c976c5626423f716e7)
需要注意的是,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=1739054095-c00RkYQa4PSOczN2yg5rAck9u5F5YLbt-0-ed625e4e896882c1d398b821a0d4bb4e)
图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=1739054095-HVXjJK7djH6RJfUKBcVrxRaZXh2wRBz2-0-7157cc93f94b6bb023bac4b917bd73c2)
图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=1739054095-KjpQIeWPAk9KKUjhWMrnRJAojBUILmlI-0-18005cda11979e6870785a0cde3c6c93)
图3-68 仿真设置
如图3-69所示,先确认Simulator的选择为ISim(VHDL/Verilog)。其实此项在新建工程时已经设定好了,为保万无一失,还是确认一下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P81_41326.jpg?sign=1739054095-5rKJyUcY2k5h7HFFF4c6Omt9iMacTZv2-0-4b60a0e78eb3ac3287c3bbd078334fa3)
图3-69 修改仿真器
(2)接下来编写测试脚本文件。单击Project→New Source命令,如图3-70所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P82_41333.jpg?sign=1739054095-63PJ9FxJKCCHaaz7Zp7UE9yySHPCoyxJ-0-6e8c686ae79d204bf86552b75b2348e8)
图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=1739054095-s1UlzB5FSUO9jvPYFt4cN5xtT3CBWoJ3-0-b7a4afc76bb7680b07873f6332436e6d)
图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=1739054095-tqMbh0Qw10U5YnOTivc1kFukV8BCPzO9-0-2f09d7ea3f3109a3087a218a91b74388)
图3-72 关联设置
(5)单击Finish按钮完成设置,如图3-73所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P83_41350.jpg?sign=1739054095-oD5bVDFend6UXQPzUjHH9hLrKH7NU4XP-0-0f7f2e1090007fbc804b950714869cf5)
图3-73 工程概要
(6)这里的测试脚本只是一个基本模板,它把设计文件led_test的接口在这个模块里例化声明了,接下来需要手动添加复位和时钟激励。完成后的脚本文件如下。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P84_79497.jpg?sign=1739054095-9vvynWlrO9EQaB39dERKyoc7RmoiuMaE-0-5d33f211d285093905a4f81d329cfbdf)
(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=1739054095-ba29TSk5BU3Bs7gBRKOUAntyKafURVT4-0-ca220be91702353a6e9433c30a4da726)
图3-74 ISim界面
(8)将时间单位设置为1μs,多次单击按钮运行,结果如图3-75所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P85_41521.jpg?sign=1739054095-36uComK0C4DljeTzjWiBOWkRMOqq6CNG-0-2cad07d7b42202e81572e84bb7e0ba56)
图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=1739054095-EIUp8e7TL0pjpz5fctVhXObWOsgYYECp-0-ea15913bd338d70b4f895fd4ebca2e5d)
图3-76 仿真器设置
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P86_41533.jpg?sign=1739054095-AfvWusTJ8sOh6SApHbykEvUCsfjqNeRX-0-30cb1e94b3b041e254f270bba359c05a)
图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=1739054095-MreBcAdAWO4AvWAe5MYD4WHOnKtXxMqv-0-fb416ff12b5b0b5deeaca7cf6d8a44ba)
图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=1739054095-nLkhaRcRPKm8y9c018iHQp2Wmbr9Pq3f-0-38eeb0ba3593a8213088d439988f90af)
图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=1739054095-KvMQtOaQfl5MY0pkDLpngw5bIKNcIAeI-0-0e22d95a64b9aecd4f1f77caed13a165)
图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=1739054095-p3q4zj7HRJHmVF8bAHXH1IfH9fsilPyZ-0-46a238dd0ab250d036a70550ef3364ee)
图3-81 仿真代码
(10)在Wave窗格可以看到timer寄存器在复位信号rst_n变高后开始计数,如图3-82所示。
![](https://epubservercos.yuewen.com/B73CF9/17214368205514206/epubprivate/OEBPS/Images/Figure-P89_41562.jpg?sign=1739054095-vY3CUjyOqbw6J0LQNJuBi8N4koVMzfnI-0-7c79a9754ef20e446f3580c87944f4ae)
图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=1739054095-gX9eJRD5eNQGvp1V3NpSuugPC1rBvAoj-0-8f332046290abb15621ce89f7cdd8cbc)
图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=1739054095-D5tc7DY0wPrOXB5wSqXwvO1O66C9Hk5P-0-fe2e92a2cb1d4fc1310d4fdda717f3ed)
图3-84 仿真结果
仿真平台通常选用ModelSim,本书在展示之后的仿真实例时均使用ModelSim。通过学习本实例,读者会对ISE软件的基本用法有初步了解。