跨模块传数据时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
问题根源分析
- 数据模块输出未绑定:Ever_date模块中,
out_date作为输出wire,未与内部的date寄存器关联,导致out_date始终处于高阻态,UART模块接收的in_tx为高阻,最终输出异常。 - 主模块信号未定义: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
相关产品推荐
相关产品推荐

