一、设计代码
//采用计数器方法写反向流水灯
`timescale 1ns / 1ps
module water_led_2(
input sys_clk , //系统时钟
input rst_n , //系统复位
output reg[3:0] led //4位流水灯
);
parameter TIME_1s_max=26'd50_000_000; //规定计时器最大值,1s内有50000000个20ns,所以计数50000000次
parameter count_max=3'd6; //6=2^2+2^1 ,因此需要3个位宽
reg[25:0] TIME_1s ;
reg[2:0] count ; // 给3个位宽的存储
//计时器
always@(posedge sys_clk)
if(!rst_n)
TIME_1s <= 0;
else if(TIME_1s==TIME_1s_max-1)
TIME_1s <= 0;
else
TIME_1s <=TIME_1s+1;
//计数器
always@(posedge sys_clk)
if(!rst_n) //if else 是顺序执行,所以千万不能把以下两个else if语句写反
count<=1'd0;
else if(TIME_1s==TIME_1s_max-1 && count==count_max)
count<=1'd0;
else if(TIME_1s==TIME_1s_max-1)
count<=count+1;
else
count<=count;
//利用计数器实现间隔1s的反向流水灯
always@(posedge sys_clk)
if(!rst_n)
led<=4'b1111;
else
case(count)
1'd0 : led<=4'b0001 ;
1'd1 : led<=4'b0010 ;
2'd2 : led<=4'b0100 ;
2'd3 : led<=4'b1000 ;
3'd4 : led<=4'b0100 ;
3'd5 : led<=4'b0010 ;
3'd6 : led<=4'b0001 ;
endcase
endmodule
二、仿真代码
`timescale 1ns / 1ps
module water_led_2_tb();
reg sys_clk ; //系统时钟
reg rst_n ; //系统复位
wire[3:0] led ; //4位流水灯
initial begin
sys_clk = 0 ;
rst_n = 0 ;
#5000 rst_n=1 ;
end
always #10 sys_clk = ~sys_clk ;
water_led_2 u1(
. sys_clk (sys_clk) , //系统时钟
. rst_n (rst_n ) , //系统复位
. led (led ) //4位流水灯
);
endmodule
仿真波形: