功能分析
//时序逻辑
//以1s频率闪烁的led灯,亮灭各500ms
设计输入
module led_flash(
Clk,
Reset_n,
Led
);
input Clk;
input Reset_n;
output reg Led;
reg [24:0]counter;
//计数器计数半个周期,即500ms,500_000_000ns/20ns=25_000_000次
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter<=0;
//else if (counter == 24999999)
else if (counter == 24999)//为了便于仿真,缩短仿真时间
counter <= 0;
else
counter <= counter + 1'd1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
Led <= 0;
//else if(counter==24999999)
else if (counter == 24999)
Led<=!Led;
else
Led=Led;
endmodule
功能仿真代码
`timescale 1ns/1ns
module led_flash_tb;
reg Clk;
reg Reset_n;
wire Led;
led_flash led_flash(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led)
);
initial Clk=1;
always #10 Clk=!Clk;
initial begin
Reset_n=0;
#201;
Reset_n=1;
#2000000000;
$stop;
end
endmodule
功能仿真结果
小结
计数器问题:
若要计数500ms,即500_000_000ns/20ns=25_000_000次;
则需要设置计数器计数次数为25_000_000 - 1次