Verilog笔记.4.inout端口

inout是一个双向端口,实现为使用三态门,第三态为高阻态‘z’。

在实际电路中高阻态意味着响应的管脚悬空、断开。

当三态门的控制信号为真时,三态门选通,作输出端口使用;控制信号为假时,三态门是高阻态,作输入端口用。

使用时,可用一下写法

1  inout data_inout;
2  input data_in;
3  
4  reg data_reg;//data_inout的映象寄存器
5  reg link_data;
6  
7  assign data_inout=link_data?data_reg:1’bz;//link_data控制三态门
8 //对于data_reg,可以通过组合逻辑或者时序逻辑根据data_in对其赋值.
9 //通过控制link_data的高低电平,从而设置data_inout是输出数据还是处于高阻态,
10 //如果处于高阻态,则此时当作输入端口使用.link_data可以通过相关电路来控制.

模块代码

 1 module three_state(
 2                    //系统输入
 3                    clk,//系统时钟输入
 4                    rst_n,//低电平复位信号
 5                    data_buf,
 6                    //系统输出
 7                    sda//三态总线
 8                     );
 9 
10 //-------------------系统输入-------------------
11 input clk;//系统时钟输入
12 input rst_n;//低电平复位信号
13 input data_buf;//待传输数据
14 //-------------------系统输出-------------------
15 inout sda;//三态总线
16 //------------------寄存器定义------------------
17 reg flag;//三态门开关定义
18 reg [10:0]counter;//计数器定义
19 //------------------三态门赋值------------------
20 assign sda=(flag==1)?data_buf:1'bz;
21 //----------------开关控制计数器----------------
22 always@(posedge clk or negedge rst_n)
23      begin
24         if(!rst_n)
25             begin
26                 counter<=0;//计数器复位
27             end
28         else
29             begin
30                 if(counter<</span>25)//计数器范围
31                     counter<=counter+1;//计数器累加
32                 else
33                     counter<=0;//计数器清零
34             end
35     end
36 //----------------开关/数据控制-----------------
37 always@(posedge clk or negedge rst_n)
38     begin
39         if(!rst_n)
40             begin
41                 flag<=0;//开关关闭
42             end
43         else
44             begin
45                 if(counter==25)
46                     flag<=~flag;//开关信号翻转
47             end
48     end
49 endmodule        

相连的两个inout端口由一对信号交叉控制:
在内部模块中inout端口不能独立存在,当一个模块的inout端口作为输出时,那么另一个模块的inout端口必然作为输入;反之,当一个模块的inout端口作为输入时,那么另一个模块的inout端口必然作为输出。因此,这两个inout端口的控制信号实际上是由一对信号交叉控制。

原文地址:https://www.cnblogs.com/protogenoi/p/8931138.html