1791|0

32

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

基于FPGA至简设计法的4位闪烁灯 附件更详细 [复制链接]

4位闪烁灯一、项目背景
LED灯的理论、教学板的原理图,已经在案例1位闪烁灯中有详细的描述,在此不再讲述,有兴趣的读者可以返回去阅读。
二、设计目标
本工程使用4LED---LED1~LED4,实现一个呼吸灯的功能。这4个灯具体的变化情况为:
1个灯隔1秒后,亮1秒;然后第2个灯隔1秒后,亮2秒;然后第3个灯隔1秒后,亮3秒,最后第4个灯隔1秒,亮4秒。如此循环往复。
下面是波形图:

上板效果图如下图所示。


三、模块设计
我们先分析一下板子上的LED灯。每个LED灯都有一个信号来控制,该信号为0,则灯亮,如果该信号为1,则灯来。现在我们要控制4LED灯亮灭,那就需要4个信号,假设分别为led0led1led2led3。这4个信号分别连接到4led灯上。如果要让LED00亮,LED1~3灯来,那FPGA就让led0信号为0led1~3信号都为1
综上所述,我们这个工程需要6个信号:时钟clk,复位rst_nled0led1led2led3
我们再分析一下功能需求,1个灯隔1秒后,亮1秒;然后第2个灯隔1秒后,亮2秒;然后第3个灯隔1秒后,亮3秒,最后第4个灯隔1秒,亮4秒。如此循环往复。
上面的功能需求,也可以翻译成:对于LED0,复位后,先灭1秒,亮1秒,然后再灭12秒,循环往复;对于LED1,复位后,先灭3秒,亮2秒,然后再灭9秒,循环往复;对于LED2,复位后,先灭6秒,亮3秒,然后再灭5秒,循环往复;对于LED3,先灭10秒,亮4秒,循环往复。

再将其翻译成信号来理解:
复位后,让信号led0=1并持续1秒,然后让led0=0并持续1秒,然后让led0=1持续12秒。循环往复。
复位后,让信号led1=1并持续3秒,然后让led1=0并持续2秒,然后让led1=1持续9秒。循环往复。
复位后,让信号led2=1并持续6秒,然后让led2=0并持续3秒,然后让led2=1持续5秒。循环往复。
复位后,让信号led3=1并持续10秒,然后让led3=0并持续4秒。循环往复。

再将其翻译成波形如下图所示。


由图中可看到,信号led0~led3的变化单位最小是1秒,同时4个信号都是经过14秒后就循环一次。由至简设计法的思想,很容易就得出我们需要2个计数器,1个计数器用来计算1秒时间,另1个计数器用来计算14秒。有了这两个计数器,led0~led3的变化时间就有了标准。
我们用1个计数器用来计算1秒时间,该计数器名称为cnt0。本工程的工作时钟是50MHz,即周期为20ns,计数器计数到1_000_000_000/20=50_000_000个,我们就能知道1秒时间到了。该计数器是不停地计数,永远不停止的,可以认为加1条件一直有效,可写成:assignadd_cnt==1。综上所述,该计数器的代码如下。

我们再用1个计数器用来表示14秒,名称为cnt1。该计数器表示次数,自然是每隔1秒就加1,那就是end_cnt0。该计数器一共要数14次。所以代码为:

有了两个计数器,我们来思考输出信号led0的变化。概括起来,led0有两种变化点:变0和变1。变0的原因都是计数到1秒时间,也就是add_cnt1 &&cnt1==1-1时,led00。变1的原因,则是数到2秒时间时,即add_cnt1 &&cnt1==2-1时,led01。所以led0信号的代码如下:


接下来我们思考输出信号led1的变化。概括起来,led1有两种变化点:变0和变1。变0的原因都是计数到3秒时间,也就是add_cnt1 &&cnt1==3-1时,led10。变1的原因,则是数到5秒时间时,即add_cnt1 &&cnt1==5-1时,led11。所以led1信号的代码如下:


接下来我们思考输出信号led2的变化。概括起来,led2有两种变化点:变0和变1。变0的原因都是计数到6秒时间,也就是add_cnt1 &&cnt1==6-1时,led20。变1的原因,则是数到9秒时间时,即add_cnt1 &&cnt1==9-1时,led21。所以led2信号的代码如下:

接下来我们思考输出信号led3的变化。概括起来,led3有两种变化点:变0和变1。变0的原因都是计数到10秒时间,也就是add_cnt1 &&cnt1==10-1时,led30。变1的原因,则是数到14秒时间时,即add_cnt1 &&cnt1==14-1,也就是end_cnt1时,led31。所以led3信号的代码如下:


此次,主体程序已经完成。接下来是将module补充完整。
module的名称定义为huxiled。并且我们已经知道该模块有六个信号:clkrst_nled0led1led2led3。为此,代码如下:


其中clkrst_n是输入信号,led0led1led2led3是输出信号,并且六个信号都是1比特的,根据这些信息,我们补充输入输出端口定义。代码如下:


接下来定义信号类型。
cnt0是用always产生的信号,因此类型为regcnt0计数的最大值为500_000_000,需要用29根线表示,即位宽是29位。因此代码如下:

add_cnt0end_cnt0都是用assign方式设计的,因此类型为wire。并且其值是0或者11个线表示即可。因此代码如下:


cnt1是用always产生的信号,因此类型为regcnt1计数的最大值为8,需要用4根线表示,即位宽是4位。因此代码如下:

add_cnt1end_cnt1都是用assign方式设计的,因此类型为wire。并且其值是0或者11根线表示即可。因此代码如下:

led0led1led2led3是用always方式设计的,因此类型为reg。并且其值是0或者11根线表示即可。因此代码如下:

至此,整个代码的设计工作已经完成。下一步是新建工程和上板查看现象。
四、综合工程和上板新建工程
首先在d盘中创建名为“huxiled”的工程文件夹,将写的代码命名为“huxiled.v,顶层模块名为“huxiled”。


然后打开Quartus Ⅱ,点击File下拉列表中的New Project Wzard...新建工程选项。

3.再出现的界面中直接点击Next



4.之后出现的是工程文件夹、工程名、顶层模块名设置界面。按照之前的命名进行填写,然后点击Next

5.之后是文件添加界面。点击红色箭头处,添加之前写的“huxiled.v”文件,点击右侧的“Add”按钮,之后文件还会出现在黑色箭头处,点击,之后点击“Next”。

器件型号选择界面。在上方红色箭头处选择CycloneE,在中间红色箭头处选择EP4CE6F17C8,然后点击“Next”。


EDA工具界面。直接点击“Next”。

8.之后出现的界面,点击“Finish”。



综合
1.新建工程步骤完成后,就会出现以下界面。选中要编译的文件,点击编译按钮。

2.编译成功后会出现一下界面,点击“OK”。

配置管脚
1.点击箭头所指的管脚配置按钮。

2.下图是我们要用的原理图,其中箭头所指就是我们要配置的六个管脚,分别是clkrstled0led1led2led3

3.在下图箭头处双击填上对应的管脚号,回车即可。

布局布线
管脚配置完成后,在进行一次编译。
连接开发板
图中,下载器接入电脑USB接口,电源接入电源,然后摁下下方蓝色开关。

上板
1.双击箭头所指位置。

2.会出现如下界面,点击“Start”,会在“Progress”出显示进度。

3.进度条中提示成功后,即可在开发板上观察到相应的现象。

4位呼吸灯.pdf

1.6 MB, 下载次数: 9

此帖出自FPGA/CPLD论坛
点赞 关注
个人签名我与fpga的那些事儿http://blog.sina.com.cn/u/5707446562
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表