如何在 Verilog 中一起使用 inout 和 reg
How to use inout and reg together in Verilog
我有以下代码:
module s(clock, direction, readWrite, LA1, LA2, LA3, LA4, LD1, LD2, LD3, LD4, RA1, RA2, RA3, RA4, RD1, RD2, RD3, RD4);
// parameters
input clock, direction, readWrite;
inout reg [7:0] LD1, LD2, LD3, LD4, RD1, RD2, RD3, RD4;
inout reg [11:0] LA1, LA2, LA3, LA4, RA1, RA2, RA3, RA4;
// code
always @(posedge clock) begin
if(direction==1) begin // left to right
assign RA1 = LA1 | LA2 | LA3 | LA4;
assign RD1 = LD1 | LD2 | LD3 | LD4;
assign { RA2, RA3, RA4 } = RA1;
assign { RD2, RD3, RD4 } = RD1;
end else begin
if(direction==1) begin // right to left
assign LA1 = RA1 | RA2 | RA3 | RA4;
assign LD1 = RD1 | RD2 | RD3 | RD4;
assign { LA2, LA3, LA4 } = LA1;
assign { LD2, LD3, LD4 } = LD1;
end
end
end
endmodule
但是,在第 2 行,"inout reg [7:0] LD1, ..." 声明在 VeritakWin 3.84F 中引发语法错误。 (Veritak 允许 "output reg" 在一起,因为我在我的程序中给定代码之后有一个类似的代码)。如果删除 "reg",我会在分配行中收到错误。如果我删除 "inout",我显然会出错。我什至尝试删除 "assign" 关键字,并将“=”替换为“<=”,但仍然存在错误。我究竟做错了什么? (我是 Verilog 新手)
inout
端口不能是 reg
类型。您用来为 inout
端口赋值的 assign
类型称为 程序连续赋值 但这种端口不允许这样做。您必须改用 连续赋值 。在您的代码中:
module s(clock, direction, readWrite, LA1, LA2, LA3, LA4, LD1, LD2, LD3, LD4, RA1, RA2, RA3, RA4, RD1, RD2, RD3, RD4);
// parameters input clock, direction, readWrite;
inout [7:0] LD1, LD2, LD3, LD4, RD1, RD2, RD3, RD4;
inout [11:0] LA1, LA2, LA3, LA4, RA1, RA2, RA3, RA4;
// left to right
assign RA1 = (direction) ? (LA1 | LA2 | LA3 | LA4) : 'bz;
assign RD1 = (direction) ? (LD1 | LD2 | LD3 | LD4) : 'bz;
assign { RA2, RA3, RA4 } = (direction) ? RA1 : 'bz;
assign { RD2, RD3, RD4 } = (direction) ? RD1 : 'bz;
// right to left
assign LA1 = (!direction) ? (RA1 | RA2 | RA3 | RA4) : 'bz;
assign LD1 = (!direction) ? (RD1 | RD2 | RD3 | RD4) : 'bz;
assign { LA2, LA3, LA4 } = (!direction) ? LA1 : 'bz;
assign { LD2, LD3, LD4 } = (!direction) ? LD1 : 'bz;
endmodule
注意不能同时读写inout
端口,所以读的时候设置高阻值。
我有以下代码:
module s(clock, direction, readWrite, LA1, LA2, LA3, LA4, LD1, LD2, LD3, LD4, RA1, RA2, RA3, RA4, RD1, RD2, RD3, RD4);
// parameters
input clock, direction, readWrite;
inout reg [7:0] LD1, LD2, LD3, LD4, RD1, RD2, RD3, RD4;
inout reg [11:0] LA1, LA2, LA3, LA4, RA1, RA2, RA3, RA4;
// code
always @(posedge clock) begin
if(direction==1) begin // left to right
assign RA1 = LA1 | LA2 | LA3 | LA4;
assign RD1 = LD1 | LD2 | LD3 | LD4;
assign { RA2, RA3, RA4 } = RA1;
assign { RD2, RD3, RD4 } = RD1;
end else begin
if(direction==1) begin // right to left
assign LA1 = RA1 | RA2 | RA3 | RA4;
assign LD1 = RD1 | RD2 | RD3 | RD4;
assign { LA2, LA3, LA4 } = LA1;
assign { LD2, LD3, LD4 } = LD1;
end
end
end
endmodule
但是,在第 2 行,"inout reg [7:0] LD1, ..." 声明在 VeritakWin 3.84F 中引发语法错误。 (Veritak 允许 "output reg" 在一起,因为我在我的程序中给定代码之后有一个类似的代码)。如果删除 "reg",我会在分配行中收到错误。如果我删除 "inout",我显然会出错。我什至尝试删除 "assign" 关键字,并将“=”替换为“<=”,但仍然存在错误。我究竟做错了什么? (我是 Verilog 新手)
inout
端口不能是 reg
类型。您用来为 inout
端口赋值的 assign
类型称为 程序连续赋值 但这种端口不允许这样做。您必须改用 连续赋值 。在您的代码中:
module s(clock, direction, readWrite, LA1, LA2, LA3, LA4, LD1, LD2, LD3, LD4, RA1, RA2, RA3, RA4, RD1, RD2, RD3, RD4);
// parameters input clock, direction, readWrite;
inout [7:0] LD1, LD2, LD3, LD4, RD1, RD2, RD3, RD4;
inout [11:0] LA1, LA2, LA3, LA4, RA1, RA2, RA3, RA4;
// left to right
assign RA1 = (direction) ? (LA1 | LA2 | LA3 | LA4) : 'bz;
assign RD1 = (direction) ? (LD1 | LD2 | LD3 | LD4) : 'bz;
assign { RA2, RA3, RA4 } = (direction) ? RA1 : 'bz;
assign { RD2, RD3, RD4 } = (direction) ? RD1 : 'bz;
// right to left
assign LA1 = (!direction) ? (RA1 | RA2 | RA3 | RA4) : 'bz;
assign LD1 = (!direction) ? (RD1 | RD2 | RD3 | RD4) : 'bz;
assign { LA2, LA3, LA4 } = (!direction) ? LA1 : 'bz;
assign { LD2, LD3, LD4 } = (!direction) ? LD1 : 'bz;
endmodule
注意不能同时读写inout
端口,所以读的时候设置高阻值。