1. 程式人生 > >Verilog筆記.4.inout端口

Verilog筆記.4.inout端口

電路 寄存器 兩個 筆記 pre sig pan spa gin

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:1bz; 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端口的控制信號實際上是由一對信號交叉控制。

Verilog筆記.4.inout端口