我试图将inout
端口的输入分配给另一个用作输出的inout
端口。通常的做法是,我必须将输入端口设置为High-Z:
inout pin5;
inout pin20;
assign pin20 = 1'bz;
assign pin5 = pin20;
这导致pin5
和pin20
都被路由到高Z.我知道它为什么会在逻辑上发生,但除了将pin20
转变为input
之外,我该如何解决它?
这是我的mapper输出的原理图。
答案 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风格更简单,更清洁。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的功能,需求很少,因此供应商实施与高需求功能的优先级较低。也就是说,它可能适用于您的模拟器,合成器等。