FPGA/CPLD实验教程三(流水灯)
2012-11-07
抽烟的鱼
标签:

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,比如,只有一个灯亮的流水灯,亮过去之后又亮回来等等,就看你的想象力了,通过自己写程序更能有成就感,而且还能把书本的知识用到实际中,何乐而不为呢?是吧?

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号