清霜一梦

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

0
阅读(2639)

在学习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口了。


Baidu
map