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

跨模块传数据时UART发送器输出高阻态(z)问题求助

UART发送器跨模块数据传输高阻态问题排查

问题现象

开发UART发送器时,数据在模块内直接初始化时输出正常,但从其他模块传输数据时,所有输出数据都处于z(高阻态)。已简化数据提供模块,问题仍存在,使用ISE Design Suite内置仿真验证。

数据提供模块(Ever_date)

module Ever_date (
    input wire clk,          
    output wire out_date
);

    reg [7:0] date;

    always @(posedge clk) begin
    date <= 8'b0111_1101;
    end
endmodule

UART发送模块(UART_Transmitter)

module UART_Transmitter (
input wire clk, // Clock signal
input wire [7:0] data, // Data to transfer
output reg tx // UART output signal
);
reg wirst = 1'b0;
reg data_ready = 1'b1;
reg reset = 1'b0;

reg [3:0] bit_counter = 4'd0; // Bit counter
reg [10:0] shift_reg = 11'b0; // Shift register for data

always @(posedge clk) begin
    if (reset) begin
        bit_counter <= 4'd0; // Reset the bit counter
        shift_reg <= 11'b0; // Reset the shift register
        tx <= 1'b1; // Setting the logical unit on the transmission line
    end else if (data_ready) begin
        case (bit_counter)
            4'd0: begin // Start bit
            shift_reg <= {1'b1, data}; // Generating the start bit and data
            tx <= 1'b0; // Setting a logical zero on the transmission line
            bit_counter <= bit_counter + 1; // Bit counter increment
            end
            4'd16: begin // The stop bit //16 stands because only the positive clock frequency is considered
                bit_counter <= 4'd0; // Resetting the bit counter for the next byte
            end
            default: begin // Data
                shift_reg <= {shift_reg[9:0], 1'b0}; // Data shift for transmission
                tx <= shift_reg[10]; // Sending data bits
                bit_counter <= bit_counter + 1; // Bit counter increment
            end
        endcase
    end else begin
        tx <= 1'b1; // Setting the logical unit on the transmission line if the data is not ready
    end
end

endmodule

主模块(main)

module main
(
    input wire clkin,  
    output wire DI
);

    Ever_date Ever_date(
        .clk(clk),
        .out_date(in_tx)
    );

   UART_Transmitter uart_transmitter (  //out
         .clk(clk),
         .data(in_tx),      //in
         .tx(out_tx)        //out
    );

  assign DE = out_tx;

endmodule

问题根源分析

  1. 数据模块输出未绑定:Ever_date模块中,out_date作为输出wire,未与内部的date寄存器关联,导致out_date始终处于高阻态,UART模块接收的in_tx为高阻,最终输出异常。
  2. 主模块信号未定义:main模块中clk、in_tx、out_tx、DE均未声明:
    • clk未从输入clkin引出,属于未定义信号;
    • in_tx、out_tx是模块间连线,未声明为wire类型,且in_tx需匹配UART模块的8位数据输入位宽;
    • 输出端口为DI,但代码中赋值给未定义的DE,属于笔误。

修正后的代码

修正Ever_date模块

module Ever_date (
    input wire clk,          
    output wire out_date
);

    reg [7:0] date;

    always @(posedge clk) begin
        date <= 8'b0111_1101;
    end
    assign out_date = date; // 将寄存器值绑定到输出端口
endmodule

修正main模块

module main
(
    input wire clkin,  
    output wire DI
);

    wire clk;
    wire [7:0] in_tx;
    wire out_tx;

    assign clk = clkin; // 连接输入时钟到内部信号

    Ever_date Ever_date(
        .clk(clk),
        .out_date(in_tx)
    );

   UART_Transmitter uart_transmitter (
         .clk(clk),
         .data(in_tx),
         .tx(out_tx)
    );

  assign DI = out_tx; // 修正端口赋值笔误
endmodule

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:12:45