06分频计数器之LED闪烁1

一设计功能是:让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;
原文地址:https://www.cnblogs.com/Xwangzi66/p/12845041.html