问题遇到的现象和发生背景
使用Verilog语言编写了按键控制呼吸灯程序,但是不知道怎么修改相关参数来控制呼吸灯的闪烁频率
问题相关代码,请勿粘贴截图
module led_breath_1(
input wire clk,
input wire rst_n,
input wire flag_state_change, // 状态切换标志
output reg[3:0] led_a
);
parameter TIME_US = 50; // 1us (微秒)
parameter TIME_MS = 1000; // 1000次us --- 1ms
parameter TIME_S = 1000; // 1000次毫秒 --- 1s
// 信号定义
reg [5:0] cnt_us; // 微秒计数器
reg [9:0] cnt_ms; // 毫秒计数器
reg [9:0] cnt_s; // 秒计数器
wire add_cnt_us;
wire end_cnt_us;
wire add_cnt_ms;
wire end_cnt_ms;
wire add_cnt_s;
wire end_cnt_s;
reg flag; // 满1s时,flag取反, flag 为0 时由灭变亮,flag为1时由亮变灭
// us计数器
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt_us <= 6'd0;
else if (flag_state_change)
cnt_us <= 6'd0;
else if (add_cnt_us) begin
if (end_cnt_us)
cnt_us <= 6'd0;
else
cnt_us <= cnt_us + 1'd1;
end
end
assign add_cnt_us = 1'b1;
assign end_cnt_us = ((cnt_us==TIME_US-1) && add_cnt_us);
// ms 计数器
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt_ms <= 10'd0;
else if (flag_state_change)
cnt_ms <= 6'd0;
else if (add_cnt_ms) begin
if (end_cnt_ms)
cnt_ms <= 10'd0;
else if(end_cnt_us) // 每1us,+1
cnt_ms <= cnt_ms + 1'd1;
end
end
assign add_cnt_ms = 1'b1;
assign end_cnt_ms = ((cnt_ms==TIME_MS-1) && add_cnt_ms);
// s 计数器
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt_s <= 10'd0;
else if (flag_state_change)
cnt_s <= 6'd0;
else if (add_cnt_s) begin
if (end_cnt_s)
cnt_s <= 10'd0;
else if(end_cnt_ms) // 每1ms,+1
cnt_s <= cnt_s + 1'd1;
end
end
assign add_cnt_s = 1'b1;
assign end_cnt_s = ((cnt_s==TIME_S-1) && add_cnt_s);
// flag判断
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
flag <= 1'b0;
else if (flag_state_change)
flag <= 1'b0;
else if(end_cnt_s)
flag <= ~flag;
end
// led判断
// flag 为0 时由灭变亮,flag为1时由亮变灭
integer i;
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
led_a <= 4'b0000;
else if (flag_state_change)
led_a <= 4'b0000;
else begin
led_a <= {4{(cnt_s > cnt_ms) ? ~flag : flag}};
end
end
endmodule
我想要达到的结果
想请各位有时间的话给我大致讲解一下这段代码 哪里是控制闪烁频率的