Verilog筆記.4.inout端口
阿新 • • 發佈:2018-05-02
電路 寄存器 兩個 筆記 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: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端口的控制信號實際上是由一對信號交叉控制。
Verilog筆記.4.inout端口