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

RS232收发器与顶层模块互联求助:寄存器与线网数据传输障碍

嘿,我刚好碰到过类似的RS232模块互联问题,给你几个实用的方案,完全不用inout类型就能解决reg到wire的传输困扰:

核心思路:拆分单向路径,利用Verilog端口规则

RS232的发送和接收本身就是独立的单向链路,根本不需要复用同一组信号。先明确一个关键规则:Verilog中reg类型的信号可以直接驱动wire类型的输入端口,你之前的卡壳大概率是没找对端口映射的正确姿势。

方案1:基础独立互联(收发分离)

直接给发送器、接收器分配各自独立的数据信号,顶层模块只需要做简单的端口映射就行:

module top_rs232 (
    input        clk,
    input        rst_n,
    // 发送路径
    input  [7:0] tx_data_in,  // 顶层可直接用reg或wire驱动
    input        tx_en,
    output       tx_pin,
    // 接收路径
    output [7:0] rx_data_out, // wire类型,由接收器的reg输出驱动
    output       rx_valid,
    input        rx_pin
);

// 例化发送器:wire类型的input端口直接接外部驱动(reg/wire都可以)
rs232_tx u_tx (
    .clk    (clk),
    .rst_n  (rst_n),
    .data_i (tx_data_in),
    .en     (tx_en),
    .tx_o   (tx_pin)
);

// 例化接收器:reg类型的output端口直接连顶层wire输出
rs232_rx u_rx (
    .clk    (clk),
    .rst_n  (rst_n),
    .rx_i   (rx_pin),
    .data_o (rx_data_out),
    .valid  (rx_valid)
);

endmodule

这里要划重点:接收器的data_o(reg类型)可以直接赋值给顶层的rx_data_out(wire类型),发送器的data_i(wire类型的input)也可以直接接顶层的tx_data_in(不管是reg还是wire),完全符合Verilog的语法规则。

方案2:回环测试场景(接收数据直接转发发送)

如果你的需求是把接收器收到的数据直接传给发送器做回环测试,只需要在顶层加一个中间寄存器缓存接收数据即可:

module top_rs232_loopback (
    input  clk,
    input  rst_n,
    output tx_pin,
    input  rx_pin
);

reg  [7:0] loopback_buf;
wire [7:0] rx_data;
wire       rx_valid;

// 例化接收器
rs232_rx u_rx (
    .clk    (clk),
    .rst_n  (rst_n),
    .rx_i   (rx_pin),
    .data_o (rx_data),
    .valid  (rx_valid)
);

// 用接收有效信号触发,缓存数据到中间reg
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        loopback_buf <= 8'd0;
    end else if (rx_valid) begin
        loopback_buf <= rx_data;
    end
end

// 例化发送器:中间reg直接驱动发送器的wire input端口
rs232_tx u_tx (
    .clk    (clk),
    .rst_n  (rst_n),
    .data_i (loopback_buf),
    .en     (rx_valid),  // 用接收有效信号触发发送动作
    .tx_o   (tx_pin)
);

endmodule

排查你之前的问题

如果还是连不通,建议检查这几点:

  • 确认接收器的data_o是在时钟沿触发的reg赋值(组合逻辑赋值的reg可能会有时序问题)
  • 确认发送器的data_i是input方向(input端口默认是wire类型,接受reg驱动完全合法)
  • 检查例化时的端口映射有没有写错,比如是不是把data_o连到了错误的信号上

内容的提问来源于stack exchange,提问作者J. White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:44:30