【问题标题】:Assign inout to inout (SystemVerilog)将 inout 分配给 inout (SystemVerilog)
【发布时间】:2021-05-12 11:28:01
【问题描述】:

我需要在 FPGA 中制作 I2C 多路复用器。 从主到从的SCL信号应该通过多路复用器连接,没有问题。 SDA信号呢?它应该在两个方向上都起作用。直接连接,无需高阻或时钟同步。 分配 sda_slave0 = sda_master ;`

module i2c_mux
(
    inout       wire            sda_master,
    input       wire            scl_master,
    inout       wire            sda_slave0,
    output      bit             scl_slave0,
    inout       wire            sda_slave1,
    output      bit             scl_slave1
    inout       bit [1:0]       select
    
)

always_comb
begin
    unique case (select)
    2'b00 : { scl_slave1, scl_slave0 } = { 1, scl_master };
    2'b01 : { scl_slave1, scl_slave0 } = { scl_master, 1 };
    2'b10 : { scl_slave1, scl_slave0 } = { 1, 1 };
    2'b11 : { scl_slave1, scl_slave0 } = { 1, 1 };
end

assign sda_master = sda_slave0; // ?????????????????????
assign sda_slave0 = sda_master; // ?????????????????????


    
endmodule

【问题讨论】:

  • 您的问题到底是什么?在任何情况下,您都不能为 always_comb 中的网络分配值。 Inouts 必须是 net,而不是 var。 (不要在那里使用位)。在进行任何 fpga 工作之前,您应该编译、模拟和验证您的模型。

标签: verilog system-verilog iverilog


【解决方案1】:

由于您的目标是 FPGA,因此您需要检查您的板上支持的内容。内部双向帐篷对 FPGA 的支持有限或不支持。他们可能有特殊的宏模块。

通常,输入输出应该有一个确定性驱动程序assign io = drv_en ? data : 'z;。但看起来您希望连接逻辑来确定行驶方向。这可以在模拟中完成;合成有问题。

使用 SystemVerilog,您可以使用 alias(假设您的工具集支持它)

alias sda_master = sda_slave0 = sda_slave1;

在 Veriog 和 SystemVerilog 中,您可以使用 tran 原语(通常不可合成)

tran (sda_master,sda_slave0); 
tran (sda_master,sda_slave1); 

您还可以使用别名端口创建自己的模块。这与 Verilog-95 及更高版本兼容。我不确定它对合成的友好程度。

module conn3( .a(io), .b(io), .c(io) );
  inout io;
endmodule

module i2c_mux( /*your port list*/ );
// ... other code

  conn3 link_io(sda_master, sda_slave0, sda_slave1);
endmodule

如果需要有条件的连接,可以使用 Verilog 原语tranif(一般不可综合)

tranif1 (sda_master,sda_slave0, select==2'b00); 
tranif1 (sda_master,sda_slave1, select==2'b01); 

再次检查您的 FPGA 支持什么,因为这将是限制因素。

【讨论】:

  • 我以任何方式找到了有关此案的一些信息。使用 alt_bidir_buf 可以解决这个问题。我用的是 max10 系列,不支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多