卧槽你有120斤 2024-10-10 15:08 采纳率: 100%
浏览 6
已结题

Verilog/FPGA

Verilog 中三态双向驱动器设计

我在参考Verilog数字系统设计第四版(夏宇闻)中例13.10(Page:186),他给出的参考设计为

module bidir(tri_inout, out, in, en, b);

inout    tri_inout;
output    out;
input    in, en, b;

assign    tri_inout = en ? in : 1'bz;
assign    out = tri_inout ^ b;

endmodule

我无法理解这个设计中b的实际作用,似乎和en信号无关,在b=0时输出tri_out信号,在b=1时输出~tri_out信号,使得输出端口一直有信号输入,而en端口实际控制的只有是否为输出模式,即使在输出模式,out端口仍然有效并且存在输出;我对这个设计的合理性和应用场景存疑。
我自己编写了一个我理解下的三态驱动器代码设计实例,附带verilog代码和RTL Viewer。我的设计是否合理,和考虑不周的地方。

module bidir(tri_inout, out, in, en, b);

inout    tri_inout;
output    out;
input    in, en, b;

assign    tri_inout = (en == 1'b1 && b == 1'b1) ? in : 1'bz;
assign    out = (en == 1'b1 && b == 1'b0) ? tri_inout : 1'bz;

endmodule

RTL Viewer如下所示:

img

  • 写回答

1条回答 默认 最新

  • 老皮芽子 2024-10-10 16:23
    关注
    
    // 这个例子中 tri_inout 是芯片的引脚,可以输入、输出,当
    // tri_inout 是高阻是,表示 tri_inout 是输入信号
    // 在这个例子中 out 是信号输出,一般只有 0,1 输出,不输出高阻状态
    // 在 FPGA 中,双向的或高阻状态只能存在芯片的管脚。
    // 在 FPGA 芯片内部,是没有双向的,没有高阻的信号。
    module bidir(tri_inout, out, in, en, b);
    inout    tri_inout;        //双向三态
    output    out;            //
    input    in;
    input    en;                //控制 tri_inout 的方向
                            //en = 1 ---> tri_inout 输出;
                            //en = 0 ---> tri_inout 输出高阻,此时 tri_inout 为输入
    input    b;
     
    assign    tri_inout = en ? in : 1'bz;    //en = 1 ---> tri_inout 输出 in;
                                            //en = 0 ---> tri_inout 输出高阻,此时 tri_inout 为输入
    assign    out = tri_inout ^ b;            //en = 1 ---> out = in ^ b;
                                            //en = 0 ---> out = tri_inout ^ b; 此时 tri_inout 为输入
    endmodule
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // 下面是个实际的使用,用 3 个信号来描述驱动一个双向的芯片管脚
    // 在实际使用中,比如 I2C 的信号,都是用这样的模块用 3 个信号来实现的。
    
    module bidir(tri_inout, out, in, en);
    inout    tri_inout;        //双向三态,FPGA的管脚
    output    out;            //FPGA 内部信号
    input    in;                //FPGA 内部信号
    input    en;                //控制 tri_inout 的方向
                            //en = 1 ---> tri_inout 输出;
                            //en = 0 ---> tri_inout 输出高阻,此时 tri_inout 为输入
     
    assign    tri_inout = en ? in : 1'bz;    //en = 1 ---> tri_inout 输出 in;
                                            //en = 0 ---> tri_inout 输出高阻,此时 tri_inout 为输入
    assign    out = tri_inout;                //en = 1 ---> out = in;
                                            //en = 0 ---> out = tri_inout; 此时 tri_inout 为输入
    endmodule
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月23日
  • 已采纳回答 10月15日
  • 创建了问题 10月10日