大家好,下面是我对于一个问题的Verilog编码,大家能帮我看看有什么问题吗?还有,如何在程序中设定延时时间?

题目:
流水灯设计(有两种以上设计方案)
设计要求:控制8只LED灯,周而复始地从LED1~LED8,延时点亮,产生流水效果。需设定合适的延时时间:延时时间太短,由于人眼视觉暂留,看到的是8个LED同时点亮;延时时间太长,8个LED断续点亮,没有流水的效果。比较各种设计方案。
输入:clk,//内部时钟
输出:【7:0】LEDS,//控制实验板上8个LED灯

代码:
module led
#(
parameter CNT_MAX = 25'd24_999_999 //声明计数最大值参数,24999999二进制为25位
)
(
input wire sys_clk,
input wire sys_rst_n,

output reg [8:0] LEDS //端口列表
);
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 == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt + 25'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 - 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)
LEDS <= 8'b11111110
else if(cnt_flag == 1'b1)
LEDS <= {LEDS[6:0],LEDS[7]}; //拼接运算符(例如上一状态为11111110,现状态为11111101,将上一状态的后七位110放在现状态的前七位,
else //上一状态的第一位1放在现状态的最后一位,再将1111110与1进行拼接运算,即可得到现状态11111101)
LEDS <= LEDS;

endmodule

代码看着没啥问题。
例化led时,可以代入CNT_MAX参数,这个参数的值改小点led流水就快,改大流水就慢。相当于延时时间了

看不出来有什么问题,至于设置延时,可以通过对外部时钟输入信号进行计数,同时在写代码时用需要延长的时间除时钟周期可以得到需要计的数量,计时模块就是这个代码的第二和第一个always块

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632