Verilog:如何将inout分配给另一个inout?

时间:2017-11-09 04:43:46

标签: verilog fpga hdl

我试图将inout端口的输入分配给另一个用作输出的inout端口。通常的做法是,我必须将输入端口设置为High-Z:

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

这导致pin5pin20都被路由到高Z.我知道它为什么会在逻辑上发生,但除了将pin20转变为input之外,我该如何解决它?

这是我的mapper输出的原理图。

2 个答案:

答案 0 :(得分:0)

代码中没有缓冲区。但是你展示的图片对我来说就像以下一样。 'test'模块获得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

答案 1 :(得分:0)

这样连接两个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样式端口声明中的相同示例)。

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

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