zoukankan      html  css  js  c++  java
  • 在verilog中关于inout口的设计方法

    方法一:  

            在学习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核接口是这样子的

     1 mi2c  U_mi2c(
     2         .CLK (clock), 
     3         .NRST (reset), 
     4         .A (a), 
     5         .DI (di), 
     6         .WR (wr), 
     7         .SEL (sel), 
     8         .ISCL (iscl), 
     9         .ISDA (isda),
    10         .DA (da), 
    11         .NOE (noe), 
    12         .INTR (intr), 
    13         .OSCL (oscl), 
    14         .OSDA (osda)
    15         );

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

     1 module mi2c_top (
     2                 clock ,
     3                 reset,
     4                 a,
     5                 di,
     6                 wr,
     7                 sel,
     8                 scl,
     9                 sda,
    10                 da,
    11                 noe,
    12                 intr
    13                 );
    14 input         clock ,reset ;
    15 input [2:0] a ;
    16 input [7:0] di ;
    17 input          wr ,sel ;
    18 
    19 output [7:0] da ;
    20 output             noe ,intr ;
    21 
    22 inout tri1 scl ;
    23 inout tri1 sda ;
    24 
    25 wire isda,iscl,osda,oscl ;
    26 
    27 mi2c  U_mi2c(
    28         .CLK (clock), 
    29         .NRST (reset), 
    30         .A (a), 
    31         .DI (di), 
    32         .WR (wr), 
    33         .SEL (sel), 
    34         .ISCL (iscl), 
    35         .ISDA (isda),
    36         .DA (da), 
    37         .NOE (noe), 
    38         .INTR (intr), 
    39         .OSCL (oscl), 
    40         .OSDA (osda)
    41         );
    42         
    43 assign  iscl = scl ;
    44 assign  isda = sda ;
    45 assign  scl  = (oscl == 1'd0) ? 1'd0 : 1'dz ;
    46 assign  sda  = (osda == 1'd0) ? 1'd0 : 1'dz ;        
    47         
    48         
    49 endmodule 

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

    方法三:

    还有一种情况就是,如果是多bit线呢。我这里就有一个例子

    wire [7:0]    IPMC_CPLD_D_O; 
    wire [7:0]    IPMC_CPLD_D_I;
    wire         DATA_OUT_ENA ; 
    wire         DATA_INP_ENA ; 
    wire         DATA_IOP_ENA ; 

    wire [7:0] IPMC_CPLD_D_O;  输出
    wire [7:0] IPMC_CPLD_D_I;  输入
    wire DATA_OUT_ENA ;         输出使能
    wire DATA_INP_ENA ;          输入使能
    wire DATA_IOP_ENA ;          片选使能

    以上使能都是1有效

    那么就需要这么干:

    1 reg [7:0]    IPMC_CPLD_D_I_reg;
    2 assign IPMC_CPLD_D = (DATA_IOP_ENA&DATA_OUT_ENA)?IPMC_CPLD_D_O:8'dz ; 
    3 assign IPMC_CPLD_D_I = IPMC_CPLD_D_I_reg; 
    4 always @ (posedge CLOCK or negedge RST_N)
    5     if (!RST_N)
    6             IPMC_CPLD_D_I_reg <= 8'd0; 
    7     else if(DATA_IOP_ENA&DATA_INP_ENA)
    8             IPMC_CPLD_D_I_reg <= IPMC_CPLD_D; 
    IPMC_CPLD_D 就是inout 口

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

     欢迎加入: FPGA广东交流群:162664354

          FPGA开发者联盟: 485678884

  • 相关阅读:
    纹理作用于栅格建模
    Blender模拟全局照明的简单方法
    材质组合卡通眼球
    Blender 曲线操作
    材质纹理的初级示例
    Quick Noodle Physics in Blender Tutorial
    Blender简单动画:一个小球从一座山上滚下.
    PostgreSQL的目录结构及修改数据目录
    PostgreSQL的配置文件
    CentOS7安装PostgreSQL10,pgadmin4
  • 原文地址:https://www.cnblogs.com/sepeng/p/5126424.html
Copyright © 2011-2022 走看看