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

Verilog调试求助:ld_tx_data_scope信号无法按预期拉高

UART代码调试问题解决

问题根源分析

你的ld_tx_data_scope信号始终未拉高,核心原因有三点:

  1. 寄存器无初始化/复位:ld_tx_counter_debug、ld_tx_toggle、ld_tx_data_scope_uptime等寄存器在仿真初始状态为未知值x,导致ld_tx_counter_debug == 5这类条件判断永远不成立,无法触发ld_tx_data置1。
  2. 错误的组合逻辑写法:第一个无敏感列表的always块属于非法组合逻辑定义,且使用非阻塞赋值<=,易引发驱动冲突或综合异常。
  3. 赋值风格不统一:时序块中混用阻塞赋值=和非阻塞赋值<=,可能导致仿真与硬件行为不一致。

修正后的代码

module Uart_Proj(
    clk_50,
    tx_out,
    tx_empty,
    uld_rx_data,
    rx_in,
    rx_empty,
    my_rx_data,
    reset,
    my_rx_clk,
    my_tx_clk,
    ld_tx_data_scope
);

input clk_50;
reg ld_tx_data;
input uld_rx_data;
input rx_in;
input reset;

output tx_out;
output rx_empty;
output wire [7:0] my_rx_data; 
output tx_empty;
output reg ld_tx_data_scope; 

output wire my_rx_clk;
output wire my_tx_clk;

reg tx_enable; 
reg [7:0] my_tx_data;
reg rx_enable;
reg [16:0] ld_tx_counter_debug; //for debugging
reg ld_tx_toggle;
reg [16:0] ld_tx_data_scope_uptime;

// 修正组合逻辑:添加敏感列表,使用阻塞赋值
always @* begin
    tx_enable = 1;
    rx_enable = 0;
    my_tx_data = 8'b01010101;
    ld_tx_data_scope = ld_tx_data;
end

// 修正时序逻辑:添加复位,统一非阻塞赋值
always@(posedge clk_50 or posedge reset) begin
    if(reset) begin
        ld_tx_counter_debug <= 17'd0;
        ld_tx_data <= 1'b0;
        ld_tx_toggle <= 1'b0;
        ld_tx_data_scope_uptime <= 17'd0;
    end else begin
        ld_tx_counter_debug <= ld_tx_counter_debug + 17'd1;

        if(ld_tx_counter_debug == 17'd5 && ld_tx_toggle == 1'b0) begin
            ld_tx_counter_debug <= 17'd0;
            ld_tx_data <= 1'b1;
            ld_tx_toggle <= 1'b1;
        end
        
        if (ld_tx_toggle == 1'b1) begin
            ld_tx_data_scope_uptime <= ld_tx_data_scope_uptime + 17'd1;
            
            if (ld_tx_data_scope_uptime == 17'd5) begin
                ld_tx_data <= 1'b0;
                ld_tx_data_scope_uptime <= 17'd0;
            end
        end
    end
end

Baud_Generator inst_BG( 
    .clk(clk_50), 
    .txclk(my_tx_clk),
    .rxclk(my_rx_clk)
);

uart inst_uart(
    .reset(reset),
    .txclk(my_tx_clk),
    .ld_tx_data(ld_tx_data),
    .tx_data(my_tx_data),
    .tx_enable(tx_enable),
    .tx_out(tx_out),
    .tx_empty(tx_empty),
    .rxclk(my_tx_clk),
    .uld_rx_data(uld_rx_data),
    .rx_data(my_rx_data),    
    .rx_enable(rx_enable),
    .rx_in(rx_in),
    .rx_empty(rx_empty)
);
    
endmodule

关键修改说明

  • 复位逻辑:在时序块中添加复位分支,将所有控制寄存器初始化为0,确保启动后状态明确,解决仿真初始值未知的问题。
  • 组合逻辑修正:将无敏感列表的always块改为always @*组合逻辑块,使用阻塞赋值,符合Verilog编码规范,避免锁存器生成。
  • 赋值风格统一:时序块内全部使用非阻塞赋值<=,保证时序逻辑的仿真与综合行为一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:47:28