笔记一是设计一个周期为10ms的闪烁灯,并且通过仿真测试。
1. 打开VIVADO
2.设计原理
(1) 首先定义一个计数值变量,当它自加到249999时置零。因为主频为50MHz,每个周期为20ns,当主频经过250000个周期后,时长为250000*20ns=5ms,即计数值的周期为5ms。
(2) 然后,当计数器加到249999时,led值就取反一次,即led周期为10ms,频率为10Hz。
3.顶层文件
module counter(
input clk, // 输入时钟
input rst_n, // 输入复位
output led // 输出led
);
reg [24:0] counter; // 定义25位的计数变量
reg led;
always@(posedge clk or negedge rst_n)// 敏感条件为时钟上升沿和复位下降沿
begin
if(!rst_n)
counter <= 1'b0;// 复位值为0时,计数值置零
else if (counter == 249999)
counter <= 1'b0;// 计数值计算到249999时,计数值置零
else
counter <= counter + 1'b1;// 其余情况加1
end
// 主频为50MHz,每个周期为20ns,计数值周期20*250000=5ms,
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
led <= 1'b0;// 复位值为0时,led值置零
else if(counter == 249999)
led <= !led;// 计数值计算到249999时,led值取反
end
// led值每次过了5ms翻转一次,周期为10ms,频率10Hz
endmodule
4.仿真文件
module counter_tb;
reg clk; // 输入时钟
reg rst_n; // 输入复位
wire led; // 输出led
// counter文件例化
counter U1(
.clk(clk),
.rst_n(rst_n),
.led(led)
);
initial clk = 1; // 初始化时钟为高电平
always #10 clk = !clk; // 时钟每隔10ns翻转一次,时钟频率为50MHz
initial begin
rst_n = 0; // 初始化复位为低电平
#201; // 延时201ns
rst_n = 1; // 复位电平为高电平
end
endmodule
5.结果展示
由结果图可以验证复位res_n在201ns后变为高电平,clk周期为20ns。
由结果图可以验证Led周期为10ms。