流水灯
功能目标:Led灯逐次点亮,实现流水效果。
1.波形图
在这里,cnt实现1s计数器,cnt_flag为脉冲标识信号,当计数器达到最大值时,由低电平转为高电平。当检测到cnt_flag为高电平时,led灯实现依次点亮效果。
2. RTL代码
module water_flow_lamp
#(
parameter MAX_CNT = 25'd24_999_999
)
(
input wire sys_clk ,
input wire sys_rst_n ,
output reg [3:0] led_out
);
reg [24:0] cnt ;
reg cnt_flag ;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 25'd0 ;
else if(cnt == MAX_CNT )
cnt <= 25'd0 ;
else
cnt <= 25'd1 + cnt ;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_flag <= 1'b0 ;
else if(cnt == MAX_CNT -25'd1)
cnt_flag <= 1'b1 ;
else
cnt_flag <= 1'b0 ;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
led_out <= 4'b1110 ;
else if(cnt_flag == 1'b1)
led_out <= {led_out[2:0], led_out[3]}; //将高位补到末位
else
led_out <= led_out ;
endmodule
仿真代码:
`timescale 1ns/1ns
module tb_water_flow_lamp();
reg sys_clk;
reg sys_rst_n;
wire [3:0] led_out;
initial
begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
always #10 sys_clk = ~sys_clk; //clk frequency
water_flow_lamp
#(
.MAX_CNT(25'd24)
)
water_flow_lamp_inst
(
.sys_clk (sys_clk) ,
.sys_rst_n(sys_rst_n) ,
.led_out (led_out)
);
endmodule
3.modelsim仿真