一、设计目标
让led灯亮0.25s,灭0.5s,亮0.75s,灭1s,循环亮灭
二、设计思路
通过计数器,使计数器计数到2.5s,则计数器应该计数到2.5s/20ns=125000000,第一个次翻转应为1/10T,第二次为3/10T,第三次为6/10T,第四次为T,根据对应不同的计数时间,控制灯的亮灭,以此实现循环亮灭。
三、代码实现
module counter_led2(
clk,
reset_n,
led
);
input clk;
input reset_n ;
output reg led;
reg [26:0]counter ;
parameter MCNT=125_000_000;
always@(posedge clk or negedge reset_n)begin
if(!reset_n)
counter <= 0;
else if(counter==MCNT-1)
counter <= 0;
else
counter <= counter+1'b1;
end
always@(posedge clk or negedge reset_n)begin
if(!reset_n)
led <= 1;
else if(counter==(MCNT/10)-1)
led <= 0;
else if(counter == (MCNT/10+MCNT/5)-1)
led <=1;
else if(counter == (MCNT/2+MCNT/10)-1)
led <=0;
else if(counter == MCNT-1)
led <=1;
else
led <= led;
end
endmodule
四、测试文件代码
`timescale 1ns / 1ns
module counter_led_tb;
reg clk;
reg reset_n;
wire led;
counter_led2 counter_led2(
.led(led),
.clk(clk),
.reset_n(reset_n)
);
initial clk=1;
always #10 clk=~clk;
initial begin
reset_n=0;
#201;
reset_n=~reset_n;
#3000000000;
$stop;
end
endmodule
五、仿真波形
由波形可以看出,led灯亮0.25s,灭0.5s,亮0.75s,灭1s,循环亮灭,功能实现。