源文件
/*目的:点亮一个LED灯,且以1s频率闪烁(亮灭各500ms)
*实现:通过时钟信号来达到时间定时,T = 1/f;一个时钟周期是固定的,那么就可以通过计数器来达到想要的时间;
*/
//时序逻辑
module led_flash(clk, Reset_n, led);//clk, 表示时钟信号;reset表示复位, _n表示低电平有效
input clk;
input Reset_n;
output reg led;
reg [24:0] counter; //reg,表示一个D触发器,且可以赋值;counter:计数器
// <= 非阻塞赋值
always@(posedge clk or negedge Reset_n) //posedge,表示上升沿;negedge,表示下降沿
if(!Reset_n)
counter <= 0;
else if(counter == 24999999) //计数24999999次,就可以达到500ms;计数的次数 = (需要的时间/时钟周期) - 1;-1是因为溢出也消耗一个时钟周期
counter <= 0;
else
counter <= counter + 1'd1;
//
always@(posedge clk or negedge Reset_n) // always@:相当于C语言的while;括号里面为判断条件
if(!Reset_n)
led <= 0;
else if(counter == 24999999)
led <= ~led;
endmodule
仿真文件
`timescale 1ns / 1ns
module led_flash_tb();
reg clk;
reg Reset_n;
wire led;
led_flash led_flash_inst(
.clk(clk),
.Reset_n(Reset_n),
.led(led)
);
initial clk = 1;
always #10 clk = ~clk;
initial begin
Reset_n = 0;
#201; //原先是200,但是为了错开时钟信号,所以置成201
Reset_n = 1;
#2000000000;
$stop;
end
endmodule