题目:
流水灯设计(有两种以上设计方案)
设计要求:控制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