【问题标题】:How to use inout and reg together in Verilog如何在 Verilog 中同时使用 inout 和 reg
【发布时间】:2016-02-22 09:43:32
【问题描述】:

我有以下代码:

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 允许一起“输出 reg”,因为在我的程序中给定代码之后有一个类似的代码)。如果我删除“reg”,我会在分配行中收到错误。如果我删除“inout”,我显然会得到一个错误。我什至尝试删除“assign”关键字,也尝试将“=”替换为“

【问题讨论】:

  • 输入端口是双向端口,表示它是一个输入端口,其中包含您设计的某些部分,但也是输出端口 设计的其他部分,并且您不能为设计输出端口分配任何值,因为它们的值是直接从其他输入端口的值计算的。 inout 端口不能声明为 reg,因为它们可以用作输入端口(作为线)或输出端口(作为 reg 或线)。

标签: verilog


【解决方案1】:

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端口不能同时读写,所以读取时设置高阻抗值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多