雙向總線仿真_第1頁(yè)
雙向總線仿真_第2頁(yè)
雙向總線仿真_第3頁(yè)
雙向總線仿真_第4頁(yè)
雙向總線仿真_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 查看文章 Verilog inout 雙向口使用和仿真2009-11-12 17:54轉(zhuǎn)貼,學(xué)習(xí)貼芯片外部引腳很多都使用inout類型的,為的是節(jié)省管腿。一般信號(hào)線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r(shí)候就要用到INOUT類型了。就是一個(gè)端口同時(shí)做輸入和輸出。 inout在具體實(shí)現(xiàn)上一般用三態(tài)門(mén)來(lái)實(shí)現(xiàn)。三態(tài)門(mén)的第三個(gè)狀態(tài)就是高阻'Z'。當(dāng)inout端口不輸出時(shí),將三態(tài)門(mén)置高阻。這樣信號(hào)就不會(huì)因?yàn)閮啥送瑫r(shí)輸出而出錯(cuò)了,更詳細(xì)的內(nèi)容可以搜索一下三態(tài)門(mén)tri-state的資料.1 使用inout類型數(shù)據(jù),可以用如下寫(xiě)法:inout data_inout;input data

2、_in;reg data_reg;/data_inout的映象寄存器reg link_data;assign data_inout=link_data?data_reg:1bz;/link_data控制三態(tài)門(mén)/對(duì)于data_reg,可以通過(guò)組合邏輯或者時(shí)序邏輯根據(jù)data_in對(duì)其賦值.通過(guò)控制link_data的高低電平,從而設(shè)置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時(shí)當(dāng)作輸入端口使用.link_data可以通過(guò)相關(guān)電路來(lái)控制.2 編寫(xiě)測(cè)試模塊時(shí),對(duì)于inout類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.當(dāng)上面例子中

3、的data_inout用作輸入時(shí),需要賦值給data_inout,其余情況可以斷開(kāi).此時(shí)可以用assign語(yǔ)句實(shí)現(xiàn):assign data_inout=link?data_in_t:1bz;其中的link ,data_in_t是reg類型變量,在測(cè)試模塊中賦值.另外,可以設(shè)置一個(gè)輸出端口觀察data_inout用作輸出的情況:Wire data_out_t;Assign data_out_t=(!link)?data_inout:1bz; 3 else,in RTLinout use in top module(PAD)dont use inout(tri) in sub modul

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

5、n;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 : 高阻;/問(wèn)題,如果out_en為假的話,inout_pin為高                      &#

6、160;                            /阻,那input_of_inout呢?                   

7、;                                /如果out_en為真,那么input_of_inout豈不             

8、0;                                     /是也等于inout_pin?怎么體現(xiàn)是輸入呢?endmodule可見(jiàn),此時(shí)input_of_inout和output_of_inout就可以當(dāng)作普通信

9、號(hào)使用了。 4.仿真(o(_)o.哈哈,這才是我想要看的)在仿真的時(shí)候,需要注意雙向口的處理。如果是直接與另外一個(gè)模塊的雙向口連接,那么只要保證一個(gè)模塊在輸出的時(shí)候,另外一個(gè)模塊沒(méi)有輸出(處于高阻態(tài))就可以了。如果是在ModelSim中作為單獨(dú)的模塊仿真,那么在模塊輸出的時(shí)候,不能使用force命令將其設(shè)為高阻態(tài),而是使用release命令將總線釋放掉很多初學(xué)者在寫(xiě)testbench進(jìn)行仿真和驗(yàn)證的時(shí)候,被inout雙向口難住了。仿真器老是提示錯(cuò)誤不能進(jìn)行。下面是我個(gè)人對(duì)inout端口寫(xiě) testbench仿真的一些總結(jié),并舉例進(jìn)行說(shuō)明。在這里先要說(shuō)明一下inout口在testben

10、ch中要定義為wire型變量。先假設(shè)有一源代碼為:module xx(data_inout , .);inout data_inout;.assign data_inout=(! link)?datareg:1'bz;endmodule方法一:使用相反控制信號(hào)inout口,等于兩個(gè)模塊之間用inout雙向口互連。這種方法要注意assign 語(yǔ)句只能放在initial和always塊內(nèi)。module test();wire data_inout;reg data_reg;reg link;initial begin.endassign data_inout=link?data_reg:1

11、'bz;endmodule方法二:使用force和release語(yǔ)句,但這種方法不能準(zhǔn)確反映雙向端口的信號(hào)變化,但這種方法可以反在塊內(nèi)。module test();wire data_inout;reg data_reg;reg link;#xx;        /延時(shí)force data_inout=1'bx;           /強(qiáng)制作為輸入端口.#xx;release data_inout; 

12、         /釋放輸入端口endmodule 仿真很多讀者反映仿真雙向端口的時(shí)候遇到困難,這里介紹一下雙向端口的仿真方法。一個(gè)典型的雙向端口如圖1所示。其中inner_port與芯片內(nèi)部其他邏輯相連,outer_port為芯片外部管腳,out_en用于控制雙向端口的方向,out_en為1時(shí),端口為輸出方向,out_en為0時(shí),端口為輸入方向。用Verilog語(yǔ)言描述如下:module bidirection_io(inner_port,out_en,outer_port);input out_en;

13、inout7:0 inner_port;inout7:0 outer_port;assign outer_port=(out_en=1)?inner_port:8'hzz;assign inner_port=(out_en=0)?outer_port:8'hzz;endmodule用VHDL語(yǔ)言描述雙向端口如下: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

14、_logic;outer_port : inout std_logic_vector(7 downto 0) );end bidirection_io;architecture behavioral of bidirection_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;

15、仿真時(shí)需要驗(yàn)證雙向端口能正確輸出數(shù)據(jù),以及正確讀入數(shù)據(jù),因此需要驅(qū)動(dòng)out_en端口,當(dāng)out_en端口為1時(shí),testbench驅(qū)動(dòng) inner_port端口,然后檢查outer_port端口輸出的數(shù)據(jù)是否正確;當(dāng)out_en端口為0時(shí),testbench驅(qū)動(dòng) outer_port端口,然后檢查inner_port端口讀入的數(shù)據(jù)是否正確。由于inner_port和outer_port端口都是雙向端口(在 VHDL和Verilog語(yǔ)言中都用inout定義),因此驅(qū)動(dòng)方法與單向端口有所不同。驗(yàn)證該雙向端口的testbench結(jié)構(gòu)如圖2所示。這是一個(gè)self-checking testbench,

16、可以自動(dòng)檢查仿真結(jié)果是否正確,并在Modelsim控制臺(tái)上打印出提示信息。圖中Monitor完成信號(hào)采樣、結(jié)果自動(dòng)比較的功能。testbench的工作過(guò)程為1)out_en=1時(shí),雙向端口處于輸出狀態(tài),testbench給inner_port_tb_reg信號(hào)賦值,然后讀取outer_port_tb_wire的值,如果兩者一致,雙向端口工作正常。2)out_en=0時(shí),雙向端口處于輸如狀態(tài),testbench給outer_port_tb_reg信號(hào)賦值,然后讀取inner_port_tb_wire的值,如果兩者一致,雙向端口工作正常。用Verilog代碼編寫(xiě)的testbench如下,其中使用了

17、自動(dòng)結(jié)果比較,隨機(jī)化激勵(lì)產(chǎn)生等技術(shù)。timescale 1ns/10psmodule tb();reg7:0 inner_port_tb_reg;wire7:0 inner_port_tb_wire;reg7:0 outer_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

18、_en_tbinner_port_tb_reg=$random; /randomize dataouter_port_tb_reg=$random;endend/* drive the ports connecting 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;/最不懂的就是這兒了,估計(jì)也是最重要的地兒/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_wire);/*

溫馨提示

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

評(píng)論

0/150

提交評(píng)論