verilog中雙向端口inout的使用的心得_第1頁
verilog中雙向端口inout的使用的心得_第2頁
verilog中雙向端口inout的使用的心得_第3頁
verilog中雙向端口inout的使用的心得_第4頁
verilog中雙向端口inout的使用的心得_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 verilog中雙向端口inout的使用的心得見許多問這個問題的,總結(jié)一下,希望能對大家有點用處,如果有不對的地方,歡迎指出.    芯片外部引腳很多都使用inout類型的,為的是節(jié)省管腿。一般信號線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r候就要用到INOUT類型了。就是一個端口同時做輸入和輸出。 inout在具體實現(xiàn)上一般用三態(tài)門來實現(xiàn)。三態(tài)門的第三個狀態(tài)就是高阻'Z'。 當inout端口不輸出時,將三態(tài)門置高阻。這樣信號就不會因為兩端同時輸出而出錯了,更詳細的內(nèi)容可以搜索一下三態(tài)門tri-state的資料.1  使用

2、inout類型數(shù)據(jù),可以用如下寫法:inout data_inout;input data_in;reg data_reg;/data_inout的映象寄存器reg link_data;assign data_inout=link_data?data_reg:1bz;/link_data控制三態(tài)門/對于data_reg,可以通過組合邏輯或者時序邏輯根據(jù)data_in對其賦值.通過控制link_data的高低電平,從而設置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時當作輸入端口使用.link_data可以通過相關(guān)電路來控制.2 編寫測試模塊時,對于inout類型的端口,需

3、要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.  當上面例子中的data_inout用作輸入時,需要賦值給data_inout,其余情況可以斷開.此時可以用assign語句實現(xiàn):assign data_inout=link?data_in_t:1bz;其中的link ,data_in_t是reg類型變量,在測試模塊中賦值.  另外,可以設置一個輸出端口觀察data_inout用作輸出的情況:  Wire data_out;  Assign data_out_t=(!link)?dat

4、a_inout:1bz;else,in RTLinout  use in top module(PAD)dont use inout(tri) in sub module也就是說,在內(nèi)部模塊最好不要出現(xiàn)inout,如果確實需要,那么用兩個port實現(xiàn),到頂層的時候再用三態(tài)實現(xiàn)。理由是:在非頂層模塊用雙向口的話,該雙向口必然有它的上層跟它相連。既然是雙向口,則上層至少有一個輸入口和一個輸出口聯(lián)到該雙向口上,則發(fā)生兩個內(nèi)部輸出單元連接到一起的情況出現(xiàn),這樣在綜合時往往會出錯。芯片外部引腳很多都使用inout類型的,為的是節(jié)省管腿。一般信號線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r候就要用到I

5、NOUT類型了。就是一個端口同時做輸入和輸出。 inout在具體實現(xiàn)上一般用三態(tài)門來實現(xiàn)。三態(tài)門的第三個狀態(tài)就是高阻'Z'。 當inout端口不輸出時,將三態(tài)門置高阻。這樣信號就不會因為兩端同時輸出而出錯了,更詳細的內(nèi)容可以搜索一下三態(tài)門tri-state的資料.1 使用inout類型數(shù)據(jù),可以用如下寫法:inout data_inout;input data_in;reg data_reg;               

6、0;         /data_inout的映象寄存器reg link_data;assign data_inout=link_data?data_reg:1bz;    /link_data控制三態(tài)門/對于data_reg,可以通過組合邏輯或者時序邏輯根據(jù)data_in對其賦值.通過控制link_data的高低電平,從而設置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時當作輸入端口使用.link_data可以通過相關(guān)電路來控制.2 編寫測試模塊時,對于inou

7、t類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.當上面例子中的data_inout用作輸入時,需要賦值給data_inout,其余情況可以斷開.此時可以用assign語句實現(xiàn):assign data_inout=link?data_in_t:1bz;其中的link ,data_in_t是reg類型變量,在測試模塊中賦值.另外,可以設置一個輸出端口觀察data_inout用作輸出的情況:Wire data_out;Assign data_out_t=(!link)?data_inout:1bz;else,in RTLinout use in top

8、module(PAD)dont use inout(tri) in sub module也就是說,在內(nèi)部模塊最好不要出現(xiàn)inout,如果確實需要,那么用兩個port實現(xiàn),到頂層的時候再用三態(tài)實現(xiàn)。理由是:在非頂層模塊用雙向口的話,該雙向口必然有它的上層跟它相連。既然是雙向口,則上層至少有一個輸入口和一個輸出口聯(lián)到該雙向口上,則發(fā)生兩個內(nèi)部輸出單元連接到一起的情況出現(xiàn),這樣在綜合時往往會出錯。對雙向口,我們可以將其理解為2個分量:一個輸入分量,一個輸出分量。另外還需要一個控制信號控制輸出分量何時輸出。此時,我們就可以很容易地對雙向端口建模。例子:CODE:module dual_port (.i

9、nout_pin,.);inout inout_pin;wire inout_pin;wire input_of_inout;wire output_of_inout;wire out_en;assign input_of_inout = inout_pin;assign inout_pin = out_en ? output_of_inout : 高阻;endmodule可見,此時input_of_inout和output_of_inout就可以當作普通信號使用了。在仿真的時候,需要注意雙向口的處理。如果是直接與另外一個模塊的雙向口連接,那么只要保證一個模塊在輸出的時候,另外一個模塊沒有輸出

10、(處于高阻態(tài))就可以了。如果是在ModelSim中作為單獨的模塊仿真,那么在模塊輸出的時候,不能使用force命令將其設為高阻態(tài),而是使用release命令將總線釋放掉很多初學者在寫testbench進行仿真和驗證的時候,被inout雙向口難住了。仿真器老是提示錯誤不能進行。下面是我個人對inout端口寫testbench仿真的一些總結(jié),并舉例進行說明。在這里先要說明一下inout口在testbench中要定義為wire型變量。先假設有一源代碼為:module xx(data_inout , .);inout data_inout;.assign data_inout=(! link)?dat

11、areg:1'bz;endmodule方法一:使用相反控制信號inout口,等于兩個模塊之間用inout雙向口互連。這種方法要注意assign 語句只能放在initial和always塊內(nèi)。module test();wire data_inout;reg data_reg;reg link;initial begin.endassign data_inout=link?data_reg:1'bz;endmodule方法二:使用force和release語句,但這種方法不能準確反映雙向端口的信號變化,但這種方法可以反在塊內(nèi)。module test();wire data_ino

12、ut;reg data_reg;reg link;#xx;        /延時force data_inout=1'bx;           /強制作為輸入端口.#xx;release data_inout;          /釋放輸入端口endmodule很多讀者反映仿真雙向端口的時候遇到困難,這里介紹一下雙向端口的仿真方

13、法。一個典型的雙向端口如圖1所示。其中inner_port與芯片內(nèi)部其他邏輯相連,outer_port為芯片外部管腳,out_en用于控制雙向端口的方向,out_en為1時,端口為輸出方向,out_en為0時,端口為輸入方向。用Verilog語言描述如下:module bidirection_io(inner_port,out_en,outer_port);input out_en;inout7:0 inner_port;inout7:0 outer_port;assign outer_port=(out_en=1)?inner_port:8'hzz;assign inner_port

14、=(out_en=0)?outer_port:8'hzz;endmodule用VHDL語言描述雙向端口如下:library ieee;use IEEE.STD_LOGIC_1164.ALL;entity bidirection_io isport ( inner_port : inout std_logic_vector(7 downto 0);out_en : in std_logic;outer_port : inout std_logic_vector(7 downto 0) );end bidirection_io;architecture behavioral of bidi

15、rection_io isbeginouter_port<=inner_port when out_en='1' else (OTHERS=>'Z');inner_port<=outer_port when out_en='0' else (OTHERS=>'Z');end behavioral;仿真時需要驗證雙向端口能正確輸出數(shù)據(jù),以及正確讀入數(shù)據(jù),因此需要驅(qū)動out_en端口,當out_en端口為1時,testbench驅(qū)動inner_port端口,然后檢查outer_port端口輸出的數(shù)據(jù)是否正確;當

16、out_en端口為0時,testbench驅(qū)動outer_port端口,然后檢查inner_port端口讀入的數(shù)據(jù)是否正確。由于inner_port和outer_port端口都是雙向端口(在VHDL和Verilog語言中都用inout定義),因此驅(qū)動方法與單向端口有所不同。驗證該雙向端口的testbench結(jié)構(gòu)如圖2所示。這是一個self-checking testbench,可以自動檢查仿真結(jié)果是否正確,并在Modelsim控制臺上打印出提示信息。圖中Monitor完成信號采樣、結(jié)果自動比較的功能。testbench的工作過程為1)out_en=1時,雙向端口處于輸出狀態(tài),testbench

17、給inner_port_tb_reg信號賦值,然后讀取outer_port_tb_wire的值,如果兩者一致,雙向端口工作正常。2)out_en=0時,雙向端口處于輸如狀態(tài),testbench給outer_port_tb_reg信號賦值,然后讀取inner_port_tb_wire的值,如果兩者一致,雙向端口工作正常。用Verilog代碼編寫的testbench如下,其中使用了自動結(jié)果比較,隨機化激勵產(chǎn)生等技術(shù)。timescale 1ns/10psmodule tb();reg7:0 inner_port_tb_reg;wire7:0 inner_port_tb_wire;reg7:0 out

18、er_port_tb_reg;wire7:0 outer_port_tb_wire;reg out_en_tb;integer i;initialbeginout_en_tb=0;inner_port_tb_reg=0;outer_port_tb_reg=0;i=0;repeat(20)begin#50i=$random;out_en_tb=i0; /randomize out_en_tbinner_port_tb_reg=$random; /randomize dataouter_port_tb_reg=$random;endend/* drive the ports connecting

19、to bidirction_ioassign inner_port_tb_wire=(out_en_tb=1)?inner_port_tb_reg:8'hzz;assign outer_port_tb_wire=(out_en_tb=0)?outer_port_tb_reg:8'hzz;/instatiate the bidirction_io modulebidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),.out_en(out_en_tb),.outer_port(outer_port_tb_

20、wire);/* monitor *always(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)begin#1;if(outer_port_tb_wire=inner_port_tb_wire)begin$display("n * time=%t *",$time);$display("OK! out_en=%d",out_en_tb);$display("OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d",outer_port_tb_wi

21、re,inner_port_tb_wire);endelsebegin$display("n * time=%t *",$time);$display("ERROR! out_en=%d",out_en_tb);$display("ERROR! outer_port_tb_wire != inner_port_tb_wire" );$display("ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d",outer_port_tb_wire,inner_port_

22、tb_wire);endendendmodule在寫組合邏輯電路的代碼時,我發(fā)現(xiàn)書上例子大都用的"=";而在寫時序邏輯電路代碼時,我發(fā)現(xiàn)書上例子大都用的"<="。之前就知道在Verilog HDL中阻塞賦值"="和非阻塞賦值"<="有著很大的不同,但一直沒有搞清楚究竟有什么不同,現(xiàn)在來慢慢的琢磨它。對于我這樣的初學者而言,首先要掌握可綜合風格的Verilog模塊編程的8個原則,并且牢記,才能在綜合布局布線的仿真中避免出現(xiàn)競爭冒險現(xiàn)象。(1)  時序電路建模時,用非阻塞賦值。(2) 

23、鎖存器電路建模時,用非阻塞賦值。(3)  用always塊建立組合邏輯模型時,用阻塞賦值。(4)  在同一個always塊中建立時序和組合邏輯電路時,用非阻塞賦值。(5)  在同一個always塊中不要既用非阻塞賦值又用阻塞賦值。(6)  不要在一個以上的always塊中為同一個變量賦值。(7)  用$strobe系統(tǒng)任務來顯示用非阻塞賦值的變量值。(8)  在賦值時不要使用 #0延時。這樣做的目的是為了使綜合前仿真和綜合后仿真一致。在很多時候,用"="或者是"<="實際上對應的是不同的硬

24、件電路,這點一定要十分清楚。 阻塞賦值(=):我們先做下面定義:RHS賦值等號右邊的表達式,LHS賦值等號左邊的表達式。在串行語句塊中,阻塞賦值語句按照它們在塊中的排列順序依次執(zhí)行,即前一條語句沒有完成賦值之前,后面的語句不可能被執(zhí)行,換言之,后面的語句被阻塞了。阻塞賦值的執(zhí)行可以認為只有一個步驟的操作,即計算RHS并更新LHS,此時不允許有來自任何其他Verilog語句的干擾。所謂阻塞的概念是指在同一個always塊中,其后面的賦值語句從概念上是在前一條賦值語句結(jié)束后開始賦值的。有句話我一直沒讀懂:從理論上講,它與后面的賦值語句只有概念上的先后,而無實質(zhì)上的延時。例如:beginB

25、 = A;C = B + 1;end首先第一條語句執(zhí)行,將A的值賦給B,接著執(zhí)行第二條語句,將B+1(即A加1),并賦給C。也就是說C = A + 1。 非阻塞賦值(<=):非阻塞語句的執(zhí)行過程是:首先計算語句塊內(nèi)部所有右邊表達式(RHS)的值,然后完成對左邊寄存器變量的賦值操作,例如,下面兩條非阻塞賦值語句的執(zhí)行過程是:先計算右邊表達式的值并暫存在一個暫存器中,A的值被保存在一個寄存器中,而B+1的值被保存在另一個寄存器中,在begin和end之間所有語句的右邊表達式都被計算并存儲完后,對左邊的寄存器變量的賦值才會進行。這樣C得到的是B的原始值而不是A加一。beginB <= A;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論