一设计功能是:让LED灯每1秒亮一次,再灭一秒,闪烁时间周期为2秒。
二分频的介绍:
(一)设计方式:IP核和自己动手写。
(二)对于分频的构成:一个是计数器,还有时钟翻转。方法一是计满整个周期,一半周期为高,一半为低。第二种是,计满半个时钟周期,就反转。
三设计输入:
(一)分频计数器模块
功能是产生一个1秒的计数器:参数化设计方便修改和仿真时间缩小
parameter T1S = 28'd49_999_999; //div counter reg [27:0]div_cnt; always@(posedge clk)begin if(rst==0) div_cnt<=28'd0; else if(div_cnt==T1S) div_cnt<=28'd0; else div_cnt<=div_cnt+1'b1; end |
(二)1秒脉冲的标志信号的产生模块
由于LED灯的一秒灭和一秒亮,等效为一个占空比为50%的方波的高电平控制LED灯亮。所以只需让LED的一秒脉冲标志信号,每计时到1秒反转一次,就能
控制LED的一秒闪烁。
//the flag of one_s_flag reg one_s_flag; always@(posedge clk)begin if(rst==0) one_s_flag<=1'b0; else if(div_cnt==(T1S-1))begin one_s_flag<=1'b1; end else begin one_s_flag<=1'b0; end end |
(三)1秒脉冲的标志信号控制LED亮灭
由第二部分的介绍可知,LED灯的亮灭与脉冲标志信号的电平状态一致。
//the control of led always@(posedge clk)begin if(rst==0)begin led<=1'b0; end else if(one_s_flag==1)begin led<=~led; end else begin led<=led; end end |
(四:仿真波形)
四设计总结:
(一)设计:照图施工。根据下面各个信号的时序图,直接设计各模块即可。
(二)关键点仿真时间缩小:一是仿真中参数缩小。二是在功能模块,修改参数为小的。三是在modelsim中仿真运行时间修改大单位:ns--us-ms.(当仿真时间为2秒等)
led_flash #(.T1S(99)) led_flash_m0(
.clk(Clk),
.rst(Rst),
.led(led)
);
(三)遇到问题:问题一是在仿真文件testbench中,仿真时间没有达到2秒,仿真中LED灯未翻转。
解决方法:使复位信号rst为高的仿真时间达到2秒
问题二是在ISE中工程烧写到赛灵思的开发板,没有闪烁。
解决方法:修改管脚约束条件和让复位信号为低时复位,成功实现闪烁功能(原因是,管脚约束条件的格式错误,LED与按键相连,那个按键的电平状态与rst一样。按键默认为高,则一直处于复位状态对于高电平复位来说。)
下面是管脚约束条件:
NET "clk" LOC=p24 | IOSTANDARD=LVCMOS33; NET "rst" LOC=p94| IOSTANDARD=LVCMOS33; NET "led" LOC=p92| IOSTANDARD=LVCMOS33; |