清霜一梦

在verilog中关于inout口的两种设计方法

0
阅读(2807)

在学习IIC的时候我们知道这么设计inout 

  inout   scl ; 

  reg    scl_reg ,  scl_en ; 

  scl  = scl_en ?   scl_reg : 1'dz ;  

     当scl_en 有效输出scl_reg 的波形,就是output,否则就是input。

 

  后来在工作中遇到了一个IIC的IP核 ,这个IIC的IP核接口是这样子的

mi2c  U_mi2c(
        .CLK (clock), 
        .NRST (reset), 
        .A (a), 
        .DI (di), 
        .WR (wr), 
        .SEL (sel), 
        .ISCL (iscl), 
        .ISDA (isda),
        .DA (da), 
        .NOE (noe), 
        .INTR (intr), 
        .OSCL (oscl), 
        .OSDA (osda)
        );

这个IP中,将IIC的input 和output分开了。并且没有上面说的使能scl_en。这下子我就懵了,经过一番苦心寻找,终于知道如何合并了,废话不多说,直接上代码,最后变成这个样子。

module mi2c_top (
                clock ,
                reset,
                a,
                di,
                wr,
                sel,
                scl,
                sda,
                da,
                noe,
                intr
                );
input         clock ,reset ;
input [2:0] a ;
input [7:0] di ;
input          wr ,sel ;

output [7:0] da ;
output             noe ,intr ;

inout tri1 scl ;
inout tri1 sda ;

wire isda,iscl,osda,oscl ;

mi2c  U_mi2c(
        .CLK (clock), 
        .NRST (reset), 
        .A (a), 
        .DI (di), 
        .WR (wr), 
        .SEL (sel), 
        .ISCL (iscl), 
        .ISDA (isda),
        .DA (da), 
        .NOE (noe), 
        .INTR (intr), 
        .OSCL (oscl), 
        .OSDA (osda)
        );
        
assign  iscl = scl ;
assign  isda = sda ;
assign  scl  = (oscl == 1'd0) ? 1'd0 : 1'dz ;
assign  sda  = (osda == 1'd0) ? 1'd0 : 1'dz ;        
        
        
endmodule

在modelsim中仿真可以看到,如果是高电平,会显示虚线,也就是弱上拉的意思。

小伙伴儿们,以后再也不用担心inout口了。