You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Verilog代码BCD转二进制正常但microwave模块未触发、倒计时不生效求助

代码问题分析
  • 多驱动冲突:你在microwave模块中用两个独立的always块同时对寄存器bintimeout赋值,属于典型的多驱动错误,Verilog不允许同一个reg变量被多个过程块驱动,仿真会出现未知值、赋值被覆盖的问题。
  • 过程性assign滥用:always @(posedge Start)内部使用assign属于过程连续赋值,该语法在可综合设计中完全不推荐,会导致逻辑行为不可控。
  • 无倒计时使能逻辑:既没有控制倒计时启动/停止的开关,也没有倒计时到0后停止减计数的判断逻辑,同时未使用输入的Stop信号。
  • 时序逻辑未使用非阻塞赋值:时序逻辑块内对寄存器赋值应该使用非阻塞赋值符<=,避免仿真时出现竞争冒险。
修正后的代码

仅需要修改microwave模块即可,其余模块和测试激励无需调整:

module microwave(bintimeout, Clk, Start, Stop, bintime, status);
    input [7:0] bintime;
    input Clk, Start, Stop;
    output reg [7:0] bintimeout;
    output reg status;  
    
    reg cnt_en; // 倒计时使能信号

    always @(posedge Clk) begin
        // 优先响应Start信号,加载初始值并启动倒计时
        if(Start) begin
            bintimeout <= bintime;
            cnt_en <= 1'b1;
            status <= 1'b1;
        end
        // 响应Stop信号,暂停倒计时
        else if(Stop) begin
            cnt_en <= 1'b0;
            status <= 1'b0;
        end
        // 使能开启且未到0时执行倒计时
        else if(cnt_en && bintimeout > 8'd0) begin
            bintimeout <= bintimeout - 1'd1;
        end
        // 倒计时到0后停止,更新状态
        else if(bintimeout == 8'd0) begin
            cnt_en <= 1'b0;
            status <= 1'b0;
        end
    end
endmodule

内容的提问来源于stack exchange,提问作者Jmerlok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:04