时序图(野火)
代码
water_led.v文件
module water_led
#(
parameter CNT_MAX = 28'd24_999
)
(
input wire sys_clk ,
input wire sys_rst_n ,
output reg [3:0] led_out
);
reg [27:0] cnt;
reg cnt_flag;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 28'd0;
else if(cnt == CNT_MAX)
cnt <= 28'd0;
else
cnt <= cnt + 28'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_flag <= 1'b0;
else if(cnt == CNT_MAX - 1'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(led_out == 4'b0111 && cnt_flag == 1'b1)
led_out <= 4'b1110;
else if(cnt_flag == 1'b1)
led_out <= (led_out << 1) + 1'd1;
else
led_out <= led_out;
endmodule
实现 led_out 信号的变换,给低电平时,led点亮,假定实现4个流水灯
4‘b1110 -> 4‘b1101 -> 4‘b1011 -> 4‘b0111
1.野火的实现方式 , 设置一个 led_out_reg 变量,让 led_out_reg 实现不带进位的左移
4‘b0001 -> 4‘b0010 -> 4‘b0100 -> 4‘b1000
然后取反即可
assgin led_out = ~led_out_reg;
2.即上图的实现
在给定好初始 4‘b1110 和 4‘b0111之后,左移的时候直接 加1
led_out <= (led_out << 1) + 1'd1;
3.直接取反,左移,再取反
led_out <= ~((~led_out)<<1)
下面这个还没理解
led_out <= { led_out[2:0],led_out[3] }//循环左移就好了
tb_water_led.v文件
`timescale 1ns/1ns
module tb_water_led();
//声明变量
reg sys_clk;
reg sys_rst_n;
wire [3:0] led_out;
//初始化
initial
begin
sys_clk = 1'b0;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
//初始化系统时钟
always #10 sys_clk = ~sys_clk;
//实例化
water_led
#(
.CNT_MAX (28'd24)
)
water_led_inst
(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.led_out (led_out)
);
endmodule
vivado时序