• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            Verilog雙向口的使用和仿真

            更新時(shí)間:2023-12-30 00:12:26 閱讀: 評(píng)論:0

            2023年12月30日發(fā)(作者:李白歌詞)

            Verilog雙向口的使用和仿真

            Verilog inout 雙向口使用和仿真

            2007-12-01 11:11

            芯片外部引腳很多都使用inout類型的,為的是節(jié)省管腿。一般信號(hào)線用做總線等雙向數(shù)據(jù)傳輸?shù)臅r(shí)候就要用到INOUT類型了。就是一個(gè)端口同時(shí)做輸入和輸出。 inout在具體實(shí)現(xiàn)上一般用三態(tài)門來實(shí)現(xiàn)。三態(tài)門的第三個(gè)狀態(tài)就是高阻'Z'。 當(dāng)inout端口不輸出時(shí),將三態(tài)門置高阻。這樣信號(hào)就不會(huì)因?yàn)閮啥送瑫r(shí)輸出而出錯(cuò)了,更詳細(xì)的內(nèi)容可以搜索一下三態(tài)門tri-state的資料.

            1 使用inout類型數(shù)據(jù),可以用如下寫法:

            inout data_inout;

            input data_in;

            reg data_reg;//data_inout的映象寄存器

            reg link_data;

            assign data_inout=link_data?data_reg:1’bz;//link_data控制三態(tài)門

            //對(duì)于data_reg,可以通過組合邏輯或者時(shí)序邏輯根據(jù)data_in對(duì)其賦值.通過控制link_data的高低電平,從而設(shè)置data_inout是輸出數(shù)據(jù)還是處于高阻態(tài),如果處于高阻態(tài),則此時(shí)當(dāng)作輸入端口使用.link_data可以通過相關(guān)電路來控制.

            2 編寫測(cè)試模塊時(shí),對(duì)于inout類型的端口,需要定義成wire類型變量,而其它輸入端口都定義成reg類型,這兩者是有區(qū)別的.

            當(dāng)上面例子中的data_inout用作輸入時(shí),需要賦值給data_inout,其余情況可以斷開.此時(shí)可以用assign語句實(shí)現(xiàn):assign data_inout=link?data_in_t:1’bz;其中的link ,data_in_t是reg類型變量,在測(cè)試模塊中賦值.

            另外,可以設(shè)置一個(gè)輸出端口觀察data_inout用作輸出的情況:

            Wire data_out;

            Assign data_out_t=(!link)?data_inout:1’bz;

            el,in RTL

            inout u in top module(PAD)

            dont u inout(tri) in sub module

            也就是說,在內(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_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

            可見,此時(shí)input_of_inout和output_of_inout就可以當(dāng)作普通信號(hào)使用了。

            在仿真的時(shí)候,需要注意雙向口的處理。如果是直接與另外一個(gè)模塊的雙向口連接,那么只要保證一個(gè)模塊在輸出的時(shí)候,另外一個(gè)模塊沒有輸出(處于高阻態(tài))就可以了。

            如果是在ModelSim中作為單獨(dú)的模塊仿真,那么在模塊輸出的時(shí)候,不能使用force命令將其設(shè)為高阻態(tài),而是使用relea命令將總線釋放掉

            很多初學(xué)者在寫testbench進(jìn)行仿真和驗(yàn)證的時(shí)候,被inout雙向口難住了。仿真器老是提示錯(cuò)誤不能進(jìn)行。下面是我個(gè)人對(duì)inout端口寫testbench仿真的一些總結(jié),并舉例進(jìn)行說明。在這里先要說明一下inout口在testbench中要定義為wire型變量。

            先假設(shè)有一源代碼為:

            module xx(data_inout , ........);

            inout data_inout;

            ........................

            assign data_inout=(! link)?datareg:1'bz;

            endmodule

            方法一:使用相反控制信號(hào)inout口,等于兩個(gè)模塊之間用inout雙向口互連。

            這種方法要注意assign 語句只能放在initial和always塊內(nèi)。

            module test();

            wire data_inout;

            reg data_reg;

            reg link;

            initial begin

            ..........

            end

            assign data_inout=link?data_reg:1'bz;

            endmodule

            方法二:使用force和relea語句,但這種方法不能準(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;

            relea data_inout; //釋放輸入端口

            endmodule

            很多讀者反映仿真雙向端口的時(shí)候遇到困難,這里介紹一下雙向端口的仿真方法。一個(gè)典型的雙向端口如圖1所示。

            其中inner_port與芯片內(nèi)部其他邏輯相連,outer_port為芯片外部管腳,out_en用于控制雙向端口的方向,out_en為1時(shí),端口為輸出方向,out_en為0時(shí),端口為輸入方向。

            用Verilog語言描述如下:

            module bidirection_io(inner_port,out_en,outer_port);

            input out_en;

            inout[7:0] inner_port;

            inout[7: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語言描述雙向端口如下:

            library ieee;

            u _LOGIC_;

            entity bidirection_io is

            port ( 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 bidirection_io is

            begin

            outer_port<=inner_port when out_en='1' el (OTHERS=>'Z');

            inner_port<=outer_port when out_en='0' el (OTHERS=>'Z');

            end behavioral;

            仿真時(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語言中都用inout定義),因此驅(qū)動(dòng)方法與單向端口有所不同。

            驗(yàn)證該雙向端口的testbench結(jié)構(gòu)如圖2所示。

            這是一個(gè)lf-checking testbench,可以自動(dòng)檢查仿真結(jié)果是否正確,并在Modelsim控制臺(tái)上打印出提示信息。圖中Monitor完成信號(hào)采樣、結(jié)果自動(dòng)比較的功能。

            testbench的工作過程為

            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代碼編寫的testbench如下,其中使用了自動(dòng)結(jié)果比較,隨機(jī)化激勵(lì)產(chǎn)生等技術(shù)。

            `timescale 1ns/10ps

            module tb();

            reg[7:0] inner_port_tb_reg;

            wire[7:0] inner_port_tb_wire;

            reg[7:0] outer_port_tb_reg;

            wire[7:0] outer_port_tb_wire;

            reg out_en_tb;

            integer i;

            initial

            begin

            out_en_tb=0;

            inner_port_tb_reg=0;

            outer_port_tb_reg=0;

            i=0;

            repeat(20)

            begin

            #50

            i=$random;

            out_en_tb=i[0]; //randomize out_en_tb

            inner_port_tb_reg=$random; //randomize data

            outer_port_tb_reg=$random;

            end

            end

            //**** drive the ports connecting to bidirction_io

            assign 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 module

            bidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),

            .out_en(out_en_tb),

            .outer_port(outer_port_tb_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_wire,inner_port_tb_wire);

            end

            el

            begin

            $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_tb_wire);

            end

            end

            endmodule

            Verilog雙向口的使用和仿真

            本文發(fā)布于:2023-12-30 00:12:26,感謝您對(duì)本站的認(rèn)可!

            本文鏈接:http://www.newhan.cn/zhishi/a/1703866346245291.html

            版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。

            本文word下載地址:Verilog雙向口的使用和仿真.doc

            本文 PDF 下載地址:Verilog雙向口的使用和仿真.pdf

            上一篇:IDT7132
            下一篇:返回列表
            標(biāo)簽:端口   雙向   輸出   信號(hào)   使用   控制   模塊
            留言與評(píng)論(共有 0 條評(píng)論)
               
            驗(yàn)證碼:
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實(shí)用文體寫作網(wǎng)旗下知識(shí)大全大全欄目是一個(gè)全百科類寶庫! 優(yōu)秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 国产精品成| 精品国产福利久久久| 午夜福利看片在线观看| 久久精品人人槡人妻人人玩| 亚洲av日韩av一区久久| 最近的最新的中文字幕视频| 波多野42部无码喷潮| 亚洲成aⅴ人在线观看| 伊人春色激情综合激情网| 日本一区不卡高清更新二区| 欧美一区二区自偷自拍视频| 国产AV影片麻豆精品传媒| 超清无码一区二区三区| 果冻传媒一区二区天美传媒 | yw尤物av无码国产在线观看| 蜜桃av亚洲第一区二区| 国产精品原创不卡在线| 精品国产午夜福利在线观看| 日本一区二区三区免费播放视频站| 天堂无码人妻精品一区二区三区| 深夜免费av在线观看| 国产成人AV无码精品天堂| 麻豆精品一区二区三区蜜臀| 亚洲午夜成人精品无码app| 日韩av片无码一区二区不卡| 国产裸体美女永久免费无遮挡| 亚洲国产免费图区在线视频| 亚洲国产欧美中文丝袜日韩| 深夜福利成人免费在线观看| 国产99在线 | 免费| 天堂女人av一区二区| 欧美激情一区二区三区成人| 色一情一乱一伦视频| 午夜福利国产区在线观看| 国产福利在线免费观看| 色综合一本到久久亚洲91| 中文字幕少妇人妻精品| 亚洲熟妇乱色一区二区三区| 国产成人精品无人区一区| 久久人人97超碰人人澡爱香蕉| 亚洲色大成网站WWW永久麻豆|