实现流水灯
- LED简介
发光二极管:直插式和贴片式
2.直接上代码,跳过思维导图和波形图
24999999:板卡晶振5MHz,即sys_clk时钟周期位20ns,计数器计时0.5s需要0.5s/20ns = 25000000个时钟周期
截个波形图
module flow_led(input sys_clk,input sys_rst_n,//低电平有效output [3:0] led);reg [24:0] cnt;//计数器,24999999对应25位二进制//计数器计时0.5s
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt <= 25'd0;else if(cnt < (25'd25000000 - 25'd1))cnt <= cnt + 25'd1;elsecnt <= 25'd0;
end//led移位控制,输出4位LED状态
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)led <= 4'b0001;//即使不按下复位按键,默认初始值也是4'b0001, 电源检测模块会在上电时检测状态
else if(cnt == (25'd25000000 - 25'd1)) //仿真时可改为500ns以加快仿真速度led <= {led[2:0], led[3]};//0001 0010 0100 1000 0001 .... 不能直接移位,否则1000下一个会变成0000
elseled <= led;//保持不变
endendmodule
- tb模块
'timescale 1ns/1ns //仿真单位/精度module tb_flow_led();parameter CLK_PERIOD = 20;//时钟周期reg sys_clk;//需要被赋值,所以定义为reg类型
reg sys_rst_n;wire [3:0] led; //不会被赋值,所以定义为wire型。注意:如果是assign连续赋值,则是对wire类型赋值initial beginsys_clk <= 1'b0;sys_rst_n <= 1'b0;#200 //延时200nssys_rst_n <= 1'b1;
endalways #(CLK_PERIOD/2) sys_clk = ~sys_clk; //每隔10ns取反一次,时间周期20nsflow_led u_flow_led(.sys_clk (sys_clk),.sys_rst_n (sys_rst_n),.led (led))
endmodule
4.仿真
5.下载验证