广告

原创 小梅哥和你一起深入学习FPGA之点亮LED灯(上)

2017-1-10 13:03 258 0

小梅哥和你一起深入学习FPGA之点亮LED灯


在昨天更新的目录里面,并没有安排这个实验,第一个实验应该是独立按键的检测与消抖。可是,当小梅哥来做按键消抖的实验时,才发现没有做基本的输出设备,因此按键检测的结果无法直观的展示出来。也算是为后续实验做铺垫吧,第一个实验就安排成了点亮LED灯。


一、实验目的


实现4个LED灯的亮灭控制


二、实验原理


LED灯的典型电路如下2-1所示,我们控制led灯的亮灭,实质就是去控制FPGA的IO输给LED负极一个低电平或者高电平。从图中可知,我们给对应的led负极上一个低电平,就会有对应的电流通过 电阻,流过led灯,于是LED灯就会被点亮;当给led负极一个高电平时,led两端电压相等,因此没有电流流过,led则呈熄灭状态。


图2-1 led灯典型电路


三、 硬件设计


本实验的硬件电路即如图2-1所示,读者一看即懂,因此本节内容略。


四、 架构设计


虽然本实验只是一个简单的点亮led灯实验,整个实验代码不过四五行,但是为了遵循小梅哥一直喜欢的那种模块化的设计理念,因此本设计还是将led的驱动做成子模块的形式。


本实验由两个模块组成,分别为led驱动模块和顶层例化模块,可能看过其它开发板资料的同学会觉得这样反而增加了系统的复杂程度,但是,小梅哥如此设计必定有我的道理,图4-1为本实验的模块组织结构


图4-1 led实验模块组织结构图


由图可知本实验仅有n个输出端口,对应了n个led灯(为了代码的可移植性,这里并没有将led的个数限定死,而是采用了参数化的设计,因此,在实际使用过程中,就可根据实际不同的需要,自由的调整led的个数)。在modelsim仿真过程中,所有信号必须要有复位初始值,因此复位信号(Rst_n)必不可少。可能读者这里会发现,与我昨天所写的端口命名规范有出入。如果按照我所出的规范中来命名的话,则应该将复位信号命名为Global_Rst,对于这个问题,暂时小梅哥不做深入解说,其实严格意义上来说,这里的这个Rst_n应该只能算是一个内部信号,该信号在实际工程应用中往往由锁相环产生。这里因为为了配合仿真,因此该信号就暂时被引出来,做了全局复位信号。详细的关于全局复位与内部复位信号的处理,小梅哥在后面涉及到锁相环的使用的实验中会详细解说。



表4-1 led实验端口说明


五、代码组织方式


本实验中,每个模块也就四五行的代码,因此谈不上代码组织方式,因此本节从略。


六、关键代码解读


以下是代码片段:


module LED_Driver #(parameter Width = 1)/定义位宽参数/

(Rst_n,Sig,Led);/定义模块端口/


input ?Rst_n;

input ?[Width-1:0] Sig;


output ?[Width-1:0] Led;


assign Led = (Rst_n)?Sig:{Width{1'b1}};/复位输出全1,否则按照Sig的值输出/


endmodule


以上为LED驱动模块的代码,第1行定义了一个参数“Width”,即位宽,因此在例化(调用)此模块时,根据实际需要给Width赋予不同的值,则可实现不同的LED位宽的设置。第4至7行为输入输出端口定义,具体信号含义见表4-1。第9行为LED输出赋值语句,有关该代码的含义,请读者自行阅读夏宇闻老师的《Verilog数字系统设计教程》一书。小梅哥精力和时间实在太有限,没办法一一帮大家补充Verilog的知识,望见谅。总之,该语句实现了当复位信号为低电平时(系统处于复位状态),所有LED全部熄灭;当复位信号为高电平(系统正常工作)时,led输出对应的Sig信号各位的状态。


以下是代码片段:


module LED_TOP(Rst_n,Led);


input Rst_n;


output [3:0] Led;


LED_Driver


(/参数例化/


.Width (4)

)

LED_Driver_inst(/端口例化/

.Rst_n(Rst_n),

.Sig(4'b1001),/OFF ON ON OFF/

.Led(Led)

);


endmodule


以上为LED实验的顶层模块,其中将位宽参数例化为了4,即4个LED。因为没有其他模块提供Sig信号,因此直接将该信号赋值为4’b1001。则如果下载到实验板上,会看到4个led灯分别处于“灭 亮 亮 灭”的状态。


广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
小梅哥 2019-07-02 08:57
小梅哥FPGA时序分析笔记(五)I/O约束显神威——深入龙潭
大家一定对我上一节的突然结尾表示一脸茫然:我是来学习时序约束的,然后你告诉我时序约束里面IO约束很重要,然我又跟着你的文章继续往下看,本以为你就要讲如何进行IO约束了,结果呢,你一个取反时钟就把我们打...
小梅哥 2019-06-30 11:07
小梅哥FPGA时序分析笔记(四)I/O时序定成败——化险为夷
小梅哥FPGA时序分析从遥望到领悟系列没有遇见过I/O时序问题,没有通过I/O约束方式实际解决过I/O时序问题,就很难明白I/O约束的重要性,也很难相信各种EDA软件真的有那么的傻白甜。 我遇到...
小梅哥 2019-06-22 10:32
小梅哥FPGA时序分析笔记(三)时钟约束真重要——事实说话
小梅哥FPGA时序分析从遥望到领悟系列以前,那是在以前,经常有网友(原谅我行文动不动就是网友说,网友问,毕竟我是卖开发板的,正面接触学FPGA的网友相对多一些,所以这些也都是事实存在的事情)问我:小梅...
小梅哥 2019-06-21 10:33
小梅哥FPGA时序分析笔记(二)时钟质量是生命——初遇时序
小梅哥FPGA时序分析从遥望到领悟系列第一次遇到时序问题并通过相应的手段解决问题,算是2年前做百兆以太网图像传输的时候了吧。当时遇到的问题为:同一个工程,每次编译结果的效果都不一样,有的时候编译了,下...
小梅哥 2019-06-20 11:46
小梅哥FPGA时序分析笔记(一)学了4年才学会——废话连篇
小梅哥FPGA时序分析从遥望到领悟系列 这么取名字,大概率会被人家笑话吧,一个呆头呆脑哈里哈气的憨厚形象跃然纸上。不过呢,仗着自己脸皮不薄,又被人称为IT直男,也就这么写了。 自己...
小梅哥 2018-05-27 22:03
【博客大赛】【小梅哥FPGA】闹心的gcc-linaro-arm-linux-gnueabihf编译器——Floating ...
  今天在继续编写示波器(just for fun)工程,该工程的波形显示和处理界面是在Linux系统上编写程序实现的。应用程序的编写是使用的17.1版本的Quartus软件配套的DS-5软...
我要评论
0
0
广告