Verilog:如何将一个输入分配给另一个输入?
Verilog: How to assign the an inout to another inout?
我正在尝试将来自 inout
端口的输入分配给用作输出的另一个 inout
端口。作为惯例,我必须将输入端口设置为高阻:
inout pin5;
inout pin20;
assign pin20 = 1'bz;
assign pin5 = pin20;
这导致 pin5
和 pin20
都被路由到高阻抗。我知道为什么它在逻辑上会发生,但除了将 pin20
变成 input
?
之外,我该如何绕过它
这是我的映射器输出的原理图。
您的代码中没有缓冲区。但是您显示的图片对我来说如下所示。 'test' 模块获得 2 个引脚并分配 'z's。如果你让它们挂起,它们将保持在这个值。在下面的示例中,'top' 模块模拟引脚上的 activity 并将 '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
像这样连接两个 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 Port declarations 中有一个示例(SystemVerilog 的 IEEE1800-2012 § 23.2.2.1 Non 中的示例相同-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 样式更简单、更清晰。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的特性,需求很少,因此与高需求特性相比,供应商实现它的优先级较低。也就是说,它可能适用于您的模拟器、合成器等。
我正在尝试将来自 inout
端口的输入分配给用作输出的另一个 inout
端口。作为惯例,我必须将输入端口设置为高阻:
inout pin5;
inout pin20;
assign pin20 = 1'bz;
assign pin5 = pin20;
这导致 pin5
和 pin20
都被路由到高阻抗。我知道为什么它在逻辑上会发生,但除了将 pin20
变成 input
?
这是我的映射器输出的原理图。
您的代码中没有缓冲区。但是您显示的图片对我来说如下所示。 'test' 模块获得 2 个引脚并分配 'z's。如果你让它们挂起,它们将保持在这个值。在下面的示例中,'top' 模块模拟引脚上的 activity 并将 '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
像这样连接两个 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 Port declarations 中有一个示例(SystemVerilog 的 IEEE1800-2012 § 23.2.2.1 Non 中的示例相同-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 样式更简单、更清晰。但是,我发现此端口别名功能的支持有限。这是一个有点模糊的特性,需求很少,因此与高需求特性相比,供应商实现它的优先级较低。也就是说,它可能适用于您的模拟器、合成器等。