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
相关产品推荐
相关产品推荐

