1. 需求分析
实现四个led灯每500ms流水循环闪烁
2. 设计关键
a. 计数器实现500ms间隔
//时间参数定义
parameter TIME_500MS = 25_000_000;//500ms
//内部信号定义
reg [24:0] cnt_500ms ;//500ms计数器计数值
wire add_cnt_500ms ;//加1条件
wire end_cnt_500ms ;//结束条件
//计数器
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_500ms <= 25'd0;
end
else if(add_cnt_500ms)begin
if(end_cnt_500ms)begin
cnt_500ms <= 25'd0;
end
else begin
cnt_500ms <= cnt_500ms + 1'b1;
end
end
end
assign add_cnt_500ms = led_en_1;
assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == TIME_500MS - 1;
b. 移位寄存器实现流水灯
always @(posedge clk ,negedge rst_n)begin
if(!rst_n)begin
led_out <= 4'b0001;
end
else if(end_cnt_500ms)begin
led_out <= {led_out[2:0],led_out[3]};
end
end
c. 移位运算符实现流水灯
//移位运算符
always @(posedge clk ,negedge rst_n)begin
if(!rst_n)begin
led_out <= 4'b0001;
end
else if(end_cnt_500ms)begin
led_out <= led_out << 1;
end
end
3. 完整代码
//流水灯,间隔500ms
module flow_led(
input clk ,//输入时钟信号,50MHz
input rst_n ,//输入复位信号,低有效
input led_en_1,
output reg [3:0] led_out //输出led驱动信号
);
//时间参数定义
parameter TIME_500MS = 25_000_000;//500ms
//内部信号定义
reg [24:0] cnt_500ms ;//500ms计数器计数值
wire add_cnt_500ms ;//加1条件
wire end_cnt_500ms ;//结束条件
//描述输出(时序逻辑、组合逻辑)
//计数器
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_500ms <= 25'd0;
end
else if(add_cnt_500ms)begin
if(end_cnt_500ms)begin
cnt_500ms <= 25'd0;
end
else begin
cnt_500ms <= cnt_500ms + 1'b1;
end
end
end
assign add_cnt_500ms = led_en_1;
assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == TIME_500MS - 1;
//循环移位寄存器
// always @(posedge clk ,negedge rst_n)begin
// if(!rst_n)begin
// led_out <= 4'b0001;
// end
// else if(end_cnt_500ms)begin
// led_out <= {led_out[2:0],led_out[3]};
// end
// end
//移位运算符
always @(posedge clk ,negedge rst_n)begin
if(!rst_n)begin
led_out <= 4'b0001;
end
else if(end_cnt_500ms)begin
led_out <= led_out << 1;
end
else if(led_out == 4'b0000)begin
led_out <= 4'b0001;
end
end
endmodule
4. 上板验证
代码比较简单,不进行仿真了
流水灯效果实现如下:
led流水灯