在之前更新的目录里边,并没有安排这个试验,第一个试验应该是独立按键的检测与消抖。可是,当小梅哥来做按键消抖的试验时,才发现没有做根本的输出设备,因而按键检测的成果无法直观的展现出来。也算是为后续试验做衬托吧,第一个试验就安排成了点亮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灯别离处于“灭 亮 亮 灭”的状况。