新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > Verilog HDL基礎教程之:程序基本結構

        Verilog HDL基礎教程之:程序基本結構

        作者: 時間:2013-08-21 來源:網絡 收藏

        例4:自行設計的三態驅動器。

        module trist1(out,in,enable); //三態啟動器模塊端口聲明

        output out; //端口說明

        input in, enable;

        mytri tri_inst(out,in,enable);//實例化由mytri模塊定義的實例元件tri_inst

        endmodule

        module mytri(out,in,enable); //三態啟動器模塊端口聲明

        output out; //端口說明

        input in, enable;

        assign out = enable? in : 'bz; //三態啟動器算法描述

        endmodule

        這個例子通過另一種方法描述了一個三態門。在這個例子中存在著兩個模塊。模塊trist1調用由模塊mytri定義的實例元件tri_inst。模塊trist1是頂層模塊。模塊mytri則被稱為子模塊。

        通過上面的例子可以看到。

        • 是由模塊構成的。每個模塊的內容都是嵌在module和endmodule兩個語句之間。每個模塊實現特定的功能。模塊是可以進行層次嵌套的。正因為如此,才可以將大型的數字電路設計分割成不同的小模塊來實現特定的功能,最后通過頂層模塊調用子模塊來實現整體功能。
        • 每個模塊要進行端口定義,并說明輸入輸出口,然后對模塊的功能進行行為邏輯描述。
        • 的書寫格式自由,一行可以寫幾個語句,一個語句也可以分寫多行。
        • 除了endmodule語句外,每個語句和數據定義的最后必須有分號。
        • 可以用“/*.....*/”和“//.......”對 的任何部分作注釋。一個好的、有使用價值的源程序都應當加上必要的注釋,以增強程序的可讀性和可維護性。

        模塊的框架

        模塊的內容包括I/O聲明、I/O說明、內部信號聲明和功能定義。

        1.I/O聲明

        模塊的端口聲明了模塊的輸入輸出端口,其格式如下:

        Module 模塊名(端口1,端口2,端口3,端口4, …);

        2.I/O說明

        I/O說明的格式如下:

        輸入口:input 端口名1,端口名2,…,端口名i; //(共有i個輸入口)

        輸出口:output 端口名1,端口名2,…,端口名j; //(共有j個輸出口)

        I/O說明也可以寫在端口聲明語句里,其格式如下:

        module module_name(input port1,input port2,…,output port1,output port2… )

        3.內部信號聲明

        在模塊內用到的和與端口有關的wire和reg變量的聲明,如下所示:

        reg [width-1 : 0] R變量1,R變量2 …;

        wire [width-1 : 0] W變量1,W變量2 …;

        4.功能定義

        模塊中最重要的部分是邏輯功能定義部分,有3種方法可在模塊中產生邏輯。

        (1)用“assign”聲明語句。

        assign a = b c;

        這種方法的句法很簡單,只需寫一個“assign”,后面再加一個方程式即可。例子中的方程式描述了一個有兩個輸入的與門。

        (2)用實例元件。

        and and_inst( q, a, b );

        采用實例元件的方法在電路圖輸入方式下,調入庫元件。鍵入元件的名字和相連的引腳即可,表示在設計中用到一個跟與門(and)一樣的名為and_inst的與門,其輸入端為a、b,輸出為q。要求每個實例元件的名字必須是惟一的,以避免與其他調用與門(and)的實例混淆。

        (3)用“always”塊。

        always @(posedge clk or posedge clr) begin //時鐘上升沿觸發,異步清零

        if(clr) q = 0; //清零

        else if(en) q = d; //使能賦值

        end

        采用“assign”語句是描述組合邏輯最常用的方法之一,而“always”塊既可用于描述組合邏輯,也可描述時序邏輯。上面的例子用“always”塊生成了一個帶有異步清除端的D觸發器。

        “always”塊可用很多種描述手段來表達邏輯,例如上例中就用了“if...else”語句來表達邏輯關系。如按一定的風格來編寫“always”塊,可以通過綜合工具把源代碼自動綜合成用門級結構表示的組合或時序邏輯電路。需要注意的是,如果用Verilog模塊實現一定的功能,首先應該清楚哪些是同時發生的,哪些是順序發生的。

        上面3個例子分別采用了“assign”語句、實例元件和“always”塊。這3個例子描述的邏輯功能是同時執行的。也就是說,如果把這3項寫到一個Verilog模塊文件中去,它們的次序不會影響邏輯實現的功能。這3項是同時執行的,也就是并發的。

        然而,在“always”模塊內,邏輯是按照指定的順序執行的。“always”塊中的語句稱為“順序語句”,因為它們是順序執行的。請注意,兩個或更多的“always”模塊也是同時執行的,但是模塊內部的語句是順序執行的。

        看一下“always”內的語句,就會明白它是如何實現功能的。“if…else… if”必須順序執行,否則其功能就沒有任何意義。如果else語句在if語句之前執行,功能就會不符合要求。為了能實現上述描述的功能,“always”模塊內部的語句將按照書寫的順序執行。


        上一頁 1 2 下一頁

        關鍵詞: Verilog HDL 基礎教程 程序

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 丰县| 新余市| 和顺县| 庆云县| 辽阳市| 顺平县| 通江县| 达尔| 周宁县| 安塞县| 苏尼特左旗| 澜沧| 股票| 买车| 西昌市| 高州市| 秭归县| 六安市| 涟水县| 两当县| 台江县| 祁阳县| 彭泽县| 临西县| 慈利县| 静安区| 浪卡子县| 新宁县| 靖远县| 湘阴县| 荃湾区| 江安县| 吴桥县| 安远县| 陆丰市| 法库县| 资溪县| 清新县| 衡山县| 郑州市| 德化县|