m0_56917844 2022-06-21 09:37 采纳率: 100%
浏览 130
已结题

请问一下各位这段用Verilog写的呼吸灯代码怎么修改呼吸灯频率

问题遇到的现象和发生背景

使用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

我想要达到的结果

想请各位有时间的话给我大致讲解一下这段代码 哪里是控制闪烁频率的

  • 写回答

1条回答 默认 最新

  • 离离离谱 2022-06-22 17:22
    关注

    用你的时钟

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月30日
  • 已采纳回答 6月22日
  • 创建了问题 6月21日

悬赏问题

  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果