1.实现原理
开发板的频率为50MHz,即一个周期为20ns,实现500ms一次翻转,即计数25_000_000次。每次时钟沿来一次,就计一次。
2. 新建工程
2.1源文件代码
在下面=左边的变量值要变的,就用reg。不涉及的缺省;不加位宽默认为10进制;always后面要跟完整,才不会报错;注意格式用法 reg [24:0]counter,数据类型声明格式。
module led_light(
reset,
clk,
led
);
input reset;
input clk;
output reg led;
reg [24:0]counter;
always@(posedge clk or negedge reset)
if(!reset)
counter<=0;
else if (counter == 25_000_000)
counter<=0;
else
counter<=counter+1'd1;
always@(posedge clk or negedge reset)
if(!reset)
led<=1'b0;
else if(counter == 25_000_000)
led<=!led;
endmodule
点开schematic,可看相关电路图。
2.2添加仿真文件
关于复位信号延时201ns,视频说怕与时钟信号产生冲突,clk的上升沿与复位信号之间的冲突,这点我不是很理解;begin与end必须配套使用;仿真函数名不能与源函数名同名。
`timescale 1ns / 1ns
module led_light_tb();
reg clk;
reg reset;
wire led;
led_light led_light(
.reset(reset),
.clk(clk),
.led(led)
);
initial clk=1;
always #10 clk=~clk;
initial begin
reset =0;
#201;
reset=1;
#2_000_000_000;
$stop;
end
endmodule
点击simulation,观察仿真波形。vivado仿真中默认1ms,点击这个符号让仿真时间延长到程序中所仿真的时间。
点击led选中,然后上面的+图标是增加一根标注线,选中后,点击左箭头图标,标注线会位于测量起始信号位置,再加一根,弄在右边,点击第一根上面的数字,即可测量信号宽度。
2.3 其他步骤
跟之前的一样进行程序烧录。
2.4实验现象
板子上的LED灯按照程序设定时间闪烁,但按复位键没用。