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

请问一下各位这段用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 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失