【问题标题】:Verilog: How to assign the an inout to another inout?Verilog:如何将一个输入分配给另一个输入?
【发布时间】:2017-11-09 04:43:45
【问题描述】:

我正在尝试将来自inout 端口的输入分配给另一个用作输出的inout 端口。按照惯例,我必须将输入端口设置为 High-Z:

inout pin5;
inout pin20;
assign pin20 = 1'bz;
assign pin5 = pin20;

这导致pin5 和pin20 都被路由到高阻态。我知道为什么它在逻辑上会发生,但是除了将 pin20 变成 input 之外,我还能如何绕过它?

这是我的映射器输出的示意图。

【问题讨论】:

  • 您期待什么?您需要将它们连接到o。是吗?
  • @Serge 我希望将pin20 的输入缓冲到pin5,就好像我将pin20 设置为输入一样。有没有办法在 Verilog 中显式创建缓冲区?
  • 输入(或输入输出)必须由其他东西驱动,是吗?
  • @Serge 是的,pin20 是我物理连接到源的物理引脚。我希望pin5 将我的输入复制(缓冲)到pin20,但我的pin20 没有这样做,而是直接连接到High-Z,因此无法完成它的工作。
  • 您使用哪种硬件?现代 FPGA 没有内部三态总线……

标签: verilog fpga hdl


【解决方案1】:

您的代码中没有缓冲区。但是您显示的图片对我来说如下所示。 “测试”模块有 2 个引脚并分配“z”。如果您将它们挂起,则将保持此值。在下面的示例中,“top”模块模拟引脚上的活动并为其分配“val”。现在“pin2”将遵循“val”的模式(如果启用)或保持在“z”。 val 实际上是您一直在谈论的缓冲区。

module top();
   reg val, en;
   wire pin1, pin2;
   // do something with val and en 

   test t(pin1, pin2);
   assign pin2 = en ? 1'bz : val;
endmodule // top

module test(inout pin1, pin2);
   assign pin1 = 1'bz;
   assign pin2 = pin1;
endmodule // test

【讨论】:

    【解决方案2】:

    这样连接两个 IO 引脚并不常见。如果只是为了模拟,您可以将引脚与 Verilog 原语tran 连接。

    module linked_io ( inout io_A, io_B, input i, c );
      tran link(io_A, io_B);
      assign io_A = c ? i : 1'bz;
    endmodule
    

    tran 通常无法被合成器识别。一些供应商有一个自定义宏,它在功能上等同于tran,它只适用于自己的工具集。您需要查看用户手册或直接询问您的供应商是否存在此类宏。

    另一种方法是使用下面的示例选择性地将端口别名到同一网络。这是在 Verilog-2001 中添加的,并在 IEEE1364-2001 § 12.3.3 端口声明 中添加了一个示例(SystemVerilog 的IEEE1800-2012 § 23.2.2.1 中的相同示例非 ANSI 样式端口声明 em>)。

    module linked_io ( .io_A(io), .io_B(io), i, c );
      inout io;
      input i, c;
      assign io = c ? i : 1'bz;
    endmodule
    

    这是我使用 Non-ANSI 样式的唯一条件; ANSI 风格更简单、更干净。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的功能,需求很少,因此对于供应商来说,实现与高需求功能相比,它的优先级较低。也就是说,它可能适用于您的模拟器、合成器等。

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2015-06-28
      • 2013-10-20
      相关资源
      最近更新 更多