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

问题描述 投票:0回答:2

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

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

这导致pin5pin20被路由到高Z.我知道为什么它在逻辑上发生了,但我怎么能绕过它,除了把pin20变成input

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

verilog fpga hdl
2个回答
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

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风格更简单,更清洁。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的功能,需求很少,因此供应商实施与高需求功能的优先级较低。也就是说,它可能适用于您的模拟器,合成器等。

© www.soinside.com 2019 - 2024. All rights reserved.