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

请问一下各位这段用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日

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)