要求:流水灯,每隔0.5秒,四个灯由右向左依次循环亮
module water_led
#(
parameter clk_max = 25'd24_999_999
)
(
input wire sys_clk,
input wire rst_n,
// output reg [3:0] led //方式1
output wire [3:0] led //方式2
);
reg clk_flag;
reg [24:0] count;
reg [3:0] led_1;
always @(posedge sys_clk or negedge rst_n)
if(~rst_n)
count <=1'b0;
else if (count == clk_max)
count <= 1'b0;
else
count <= count + 25'd1;
always @(posedge sys_clk or negedge rst_n)
if (~rst_n)
clk_flag <=1'b0;
else if (count == clk_max-1'b1) //减1,使led变换和计数能对上 (时序延迟)
clk_flag <= 1'b1;
else
clk_flag <= 1'b0;
//方式1
//always@(posedge sys_clk or negedge rst_n)
// if (~rst_n)
// led <= 4'b1110; //如果要用下面直接循环,那么这里就不能是1111,不然一直亮啊
// else if (clk_flag == 1'b1)
// led <= {led[2:0],led[3]}; //循环左移 方式不错 //数组某位用的是[]
// else
// led <=led;
//方式2
always@(posedge sys_clk or negedge rst_n)
if (~rst_n)
led_1 <= 4'b0001;
else if ((clk_flag==1'b1)&&(led_1==4'b1000))
led_1 <= 4'b0001;
else if (clk_flag == 1'b1)
led_1 <= led_1<<1; //左移 左移右移是补0的 所以有上面一个else if,并且还要有后面的取反才行
else
led_1 <=led_1;
assign led =~led_1;
endmodule
module vtf_water_led;
// Inputs
reg sys_clk;
reg rst_n;
// Outputs
wire [3:0] led;
// Instantiate the Unit Under Test (UUT)
water_led
#(
.clk_max(25'd24) //注意写法,具体怎样的,没;号,实例化名称要在下面
)
uut
(
.sys_clk(sys_clk),
.rst_n(rst_n),
.led(led)
);
initial begin
// Initialize Inputs
sys_clk = 0;
rst_n = 0;
// Wait 100 ns for global reset to finish
#100;
rst_n <= 1'b1;
// Add stimulus here
end
always #10 sys_clk=~sys_clk;
endmodule