1. 实验要求及目的:
这次的实验我们要做的是流水灯,顾名思义就是要LED象水一样的点亮(好像有点不怎么顾名思义啊),这样说吧,就是先单独点亮第一个,然后点亮第二个(这个时候有两个灯亮了),然后……
这一个实验主要教会大家一个比较方便的锁定引脚的办法,另外就是使用移位运算符。
使用软件:Quartus II 5.0。
2. 硬件原理图:
这个是我自己制作的开发板上的LED的原理图,一共有8个,IO和别的共用的,使用八个LED的时候板上的JP1和JP5全部戴上短接帽,JP2则空出。如果要点亮这些LED,只需要把与其相连接的FPGA管脚输出低电平“0”就可以实现这个功能了。(我焊板子的时候把LED1弄坏了,不能用。)
LED管脚对应的情况如下:
D1------PIN_97
D2------PIN_94
D3------PIN_91
D4------PIN_84
D5------PIN_82
D6------PIN_78
D7------PIN_76
D8------PIN_74
另外,本实验需要用到时钟计数,时钟对应的引脚为PIN_16。
本文均采用输出“0”点亮的模式,以下就不再另外再说明了。
——这几句话我直接抄袭上第一个实验的了,因为是一样的。
3. 程序设计
(1)设计分析:我们要求这次8个灯流水一样的点亮(如果实在我讲解的不清楚,可以先看看最后的实验录像)。
具体分析一下,我们需要每个1秒钟的时间点亮一个灯,从D1开始,然后点亮D2(这个时候点亮了D1和D2),依此类推,直到点亮八个灯,然后熄灭;然后又从头开始……
FPGA输出的数据就应该首先是11111110,隔1秒钟变成11111100……一直变化到00000000,这就可以实现流水灯了。
基本上看明白了吧,那就来看看源程序吧。
(2)源程序 exp2.v
程序代码:
// Light 8 LED (water light)
// Designed By Smokingfish @ www.51FPGA.com zhiyuh@163.com
module exp3(LED,CLK,reset);
output[7:0] LED;
input CLK,reset;
reg [7:0] LED;
reg [24:0] counter;
//initial
//LED=8'b11111111;
always@(posedge CLK) //
begin
counter<=counter+1; //
if(counter==25'b1_0111_1101_0111_1000_0100_0000) //25M
// 1_0111_1101_0111_1000_0100_0000
begin
LED<=LED<<1;
counter<=0;
if(LED==8'b0000000)
LED<=8'b11111111;
end
end
endmodule
这里我们运用了“<<“这个移位运算符,至于这个运算符的用法,你可以参看夏老师的书31页,有比较详细的说明。当然,你也可以采用case语句,方法不一样,只要实现的功能一致就行——你可以比较一下两种方法代码的长度以及编译后占用的资源情况,看看有什么不一样的地方。在这里我就不多讲语法了,我着重讲的是实践。
中间有两行注释,这个是周立功那本书里写的(我参考了他的设计,呵呵)。我认为这两句是不能综合的,只能用于测试模块,相关的说明可以参看Verilog HDL的语法说明。所以我认为他书里写错了,于是我向夏老师求证,他也认同了我的看法。所以有时候还是不能尽信书。一般情况下,如果需要对寄存器进行初始化,需要加入reset信号。如果一定不能用 reset信号,对FPGA来说综合后的电路应该上电就能复位。
4. 实验步骤
(1)打开Quartus II软件,进入集成开发环境,点击File->New project wizard..新建工程项目exp3,直接点击Finish。
(2)点击File->New..在该项目下新建Verilog HDL源程序文件exp3.v,输入上面的源程序代码并保存。
(3)选择所用的FPGA器件----EP1C3T144C8,以及进行一些配置。
选择配置器件,如果要下载程序到EPCS1的话。
选择不需要使用的IO功能。选择As inputs,tri-stated。
点击两次ok,回到主界面。
(4)为工程项目锁定引脚:(这里教大家一个新的办法,比较方便快捷)
首先建立一个TCL Script文件:点File->New…选择Other Files选项卡里面的Tcl Script File,如下图:
点击ok,输入下面的代码:
程序代码:
#Pin_Setup.tcl
# Setup pin setting
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT ON
set_location_assignment PIN_16 -to CLK
set_location_assignment PIN_97 -to LED\[0\]
set_location_assignment PIN_94 -to LED\[1\]
set_location_assignment PIN_91 -to LED\[2\]
set_location_assignment PIN_84 -to LED\[3\]
set_location_assignment PIN_82 -to LED\[4\]
set_location_assignment PIN_78 -to LED\[5\]
set_location_assignment PIN_76 -to LED\[6\]
set_location_assignment PIN_74 -to LED\[7\]
比较简单的代码,简单的讲解一下,第一行和第二行是注释,第四行的意思是设置不用的引脚为三态输入(这个前面其实我们已经做过了),第五行的意思是打开INIT_DONE输出。后面的几行分别是锁定CLK和8个LED的引脚。(如果想应用更多的东东,可以自己查阅一下相关的文档,我这里就是让你知道有这么一个东西,会用了就行,至于提高就是自己的事情咯,呵呵)。
保存这个文档(Pin_Setup.tcl),软件会自动把你加到项目里面(但是你关闭项目之后第二次打开又会没有,我也不知道是为什么,奇怪)。
然后点Tools->TCL Scripts…,出现下面这个界面:
选中你刚才建好的Tcl文件,点击Run。这个时候你可以在Quartus II软件下方的Message框里面看到这么一个信息:Info: Successfully loaded and ran Tcl Script File "F:\VerilogHDL Exp\exp3\pin_setup.tcl""。你也可以确认一下是否正确分配了,分配的情况如下图:
怎么样,是不是快多了,不用点那么多次鼠标(鼠标的寿命又可以增加一点了,哈哈)。这个文件你可以适当修改用于别的项目,如果引脚一样也可以直接在别的项目中加入这个文件然后执行,可以省很多事情。如果只有几个引脚,一个一个锁定还就罢了,要是一个工程用到上百个引脚,那就要死人了。
其实Tcl脚本文件不仅仅是可以锁定引脚,还有其他很多的功能,比如(抄的是Quartus的使用手册):
工程与分配功能
器件功能
高级器件功能
流程功能
时序功能
高级时序功能
Simulator 功能
报告功能
时序报告功能
反标功能
LogicLock 功能
Chip Editor 功能
其它功能
其他的功能我就不一一讲了,你可以参考以下的文档:
Quartus II Help 中的“Overview: Using Tcl Scripting” 和“API Functions for Tcl”以及Altera的Quartus II Handbook 第2 卷“Tcl Scripting”:http://www.altera.com.cn/literature/hb/qts/qts_qii52003.pdf,还有就是Quartus II Scripting Reference Manual:http://www.altera.com.cn/literatur... #083;criptRefMnl.pdf
(5)编译工程项目:点击Processing->Start Compilation。
(6)仿真: 自己建立仿真文件检查自己的设计是否正确。
(7)下载目标文件到板子上:点击Tools->Programmer,选中Jtag模式,并且选中目标文件,然后点Start。
很快就完成了第三个实验,是不是觉得有所收获?没有?——那我就太失败咯。
你也可以试着别的花样来点亮LED,比如,只有一个灯亮的流水灯,亮过去之后又亮回来等等,就看你的想象力了,通过自己写程序更能有成就感,而且还能把书本的知识用到实际中,何乐而不为呢?是吧?