Verilog 为什么我不能将值输入到inout类型? 我从这个电路创建了这个代码 这是错误图像 该电路是具有3态输出的四总线收发器
Verilog代码Verilog 为什么我不能将值输入到inout类型? 我从这个电路创建了这个代码 这是错误图像 该电路是具有3态输出的四总线收发器,verilog,system-verilog,xilinx,xilinx-ise,Verilog,System Verilog,Xilinx,Xilinx Ise,Verilog代码 module Q52QuadrupleBus3Stlate(GAB,GBA,A,B); inout [3:0] A,B; input GAB,GBA; reg winA,winB; assign B = (GAB==1&&GBA==0) ? winA : 4'hz; assign A = (GAB==0&&GBA==1) ? winB : 4'hz; always @ (GAB or GBA)
module Q52QuadrupleBus3Stlate(GAB,GBA,A,B);
inout [3:0] A,B;
input GAB,GBA;
reg winA,winB;
assign B = (GAB==1&&GBA==0) ? winA : 4'hz;
assign A = (GAB==0&&GBA==1) ? winB : 4'hz;
always @ (GAB or GBA)
begin
winA <= A;
winB <= B;
end
endmodule
在Verilog中:
必须由实例化模块或wire
语句的assign
(或output
)驱动inout
必须由reg
或始终
块驱动初始
A
和B
由实例化模块(uut
)的输出和初始
块驱动。所以,你有一个两难选择。幸运的是,有一个简单的解决方案,通常在Verilog中使用
要从初始块
或始终
块驱动inout
,除了连接到模块inout
端口的导线之外,还需要一些额外的信号(A
和B
)。您需要一个reg
来对应以下各项:
reg [3:0] Ain;
reg [3:0] Bin;
reg Aen;
reg Ben;
以及使能信号,以对应于每个:
reg [3:0] Ain;
reg [3:0] Bin;
reg Aen;
reg Ben;
然后需要使用assign
语句实现一些三态驱动程序:
assign A = Aen ? Ain : 'bz;
assign B = Ben ? Bin : 'bz;
您需要从initial
块驱动reg
s,而不是从wire
s:
Ain = 0; Bin = 0;
最后,您还需要驱动来自同一初始
块的启用信号:
Aen = 1; Ben = 1;
以下是完整的代码:
`timescale 1ps / 1ps
module Q52TestBench;
reg GAB;
reg GBA;
// Bidirs
wire [3:0] A;
wire [3:0] B;
reg [3:0] Ain;
reg [3:0] Bin;
reg Aen;
reg Ben;
parameter step = 10000;
Q52QuadrupleBus3Stlate uut (GAB,GBA,A,B);
assign A = Aen ? Ain : 'bz;
assign B = Ben ? Bin : 'bz;
initial begin
GAB = 0;
GBA = 0;
Ain = 0; Bin = 0;
Aen = 1; Ben = 1;
#step GAB = 1;
#step GBA = 0;
#step GAB = 0;
#step GBA = 1;
#step GAB = 1;
#step GBA = 0;
#step GAB = 0;
#step GBA = 1;
#(step*10) $finish;
end
endmodule
不能从程序块驱动导线。您需要类似于:
reg A1;分配一个=(某个条件)?A1:'hz代码>并从程序块驱动A1
。非常感谢。verilog太难了。