加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

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

2013/08/20
閱讀需 15 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

Verilog HDL是一種用于數(shù)字邏輯電路設計的語言。用Verilog HDL描述的電路設計就是該電路的Verilog HDL模型。Verilog HDL既是一種行為描述的語言,也是一種結構描述的語言。也就是說,既可以用電路的功能描述,也可以用元器件和它們之間的連接來建立所設計電路的Verilog HDL模型。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別和它們對應的模型類型共有以下5種。

  • 系統(tǒng)級(system):用高級語言結構實現(xiàn)設計模塊的外部性能的模型。
  • 算法級(algorithm):用高級語言結構實現(xiàn)設計算法的模型。
  • RTL級(Register Transfer Level):描述數(shù)據(jù)在寄存器之間流動和如何處理這些數(shù)據(jù)的模型。
  • 門級(gate-level):描述邏輯門以及邏輯門之間的連接的模型。
  • 開關級(switch-level):描述器件中三極管和儲存節(jié)點以及它們之間連接的模型。

一個復雜電路系統(tǒng)的完整Verilog HDL模型是由若干個Verilog HDL模塊構成的,每一個模塊又可以由若干個子模塊構成。其中有些模塊需要綜合成具體電路,而有些模塊只是與用戶所設計的模塊交互的現(xiàn)存電路或激勵信號源。利用Verilog HDL語言結構所提供的這種功能就可以構造一個模塊間的清晰層次結構來描述極其復雜的大型設計,并對所作設計的邏輯電路進行嚴格的驗證。

Verilog HDL行為描述語言作為一種結構化和過程性的語言,其語法結構非常適合于算法級和RTL級的模型設計。這種行為描述語言具有以下功能。

  • 可描述順序執(zhí)行或并行執(zhí)行的程序結構。
  • 用延遲表達式或事件表達式來明確地控制過程的啟動時間。
  • 通過命名的事件來觸發(fā)其他過程里的激活行為或停止行為。
  • 提供了條件、if-else、case、循環(huán)程序結構。
  • 提供了可帶參數(shù)且非零延續(xù)時間的任務(task)程序結構。
  • 提供了可定義新的操作符的函數(shù)結構(function)。
  • 提供了用于建立表達式的算術運算符、邏輯運算符、位運算符。
  • Verilog HDL語言作為一種結構化的語言也非常適合于門級和開關級的模型設計。因其結構化的特點又使它具有以下功能。

    • 提供了完整的一套組合型原語(primitive);
    • 提供了雙向通路和電阻器件的原語;
    • 可建立MOS器件的電荷分享和電荷衰減動態(tài)模型。

Verilog HDL的構造性語句可以精確地建立信號的模型。這是因為在Verilog HDL中,提供了延遲和輸出強度的原語來建立精確程度很高的信號模型。信號值可以有不同的強度,可以通過設定寬范圍的模糊值來降低不確定條件的影響。

Verilog HDL作為一種高級的硬件描述編程語言,有著類似C語言的風格。其中if語句、case語句等和C語言中的對應語句十分相似。如果讀者已經掌握C語言編程的基礎,那么學習Verilog HDL并不困難,只要對Verilog HDL某些語句的特殊方面著重理解,并加強上機練習就能很好地掌握它,利用它的強大功能來設計復雜的數(shù)字邏輯電路。下面將介紹Verilog HDL中的基本結構和語法。

Verilog HDL程序入門

首先來看幾個Verilog HDL程序,然后從中分析Verilog HDL程序的特性。

例1:加法器

module  adder ( count,sum,a,b,cin );   //加法器模塊端口聲明

      input [2:0] a,b;                         //端口說明

      input   cin;

      output  count;

      output [2:0] sum;

      assign {count,sum} = a + b + cin;      //加法器算法實現(xiàn)

endmodule

這個例子通過連續(xù)賦值語句描述了一個名為adder的三位加法器可以根據(jù)兩個三比特數(shù)a、b和進位(cin)計算出和(sum)和進位(count)。從例子中可以看出整個Verilog HDL程序是嵌套在module和endmodule聲明語句里的。

例2:比較器。

module  compare ( equal,a,b );     //比較器模塊端口聲明

         output  equal;                 //輸出信號equal

         input [1:0] a,b;             //輸入信號a、b

         assign  equal=(a==b)?1:0; //如果a、b 兩個輸入信號相等,輸出為1,否則為0

endmodule

這個程序通過連續(xù)賦值語句描述了一個名為compare的比較器。對兩比特數(shù)a、b進行比較,如a與b相等,則輸出equal為高電平,否則為低電平。在這個程序中,“/*........*/”和“//.........”表示注釋部分,注釋只是為了方便程序員理解程序,對編譯是不起作用的。

例3:使用原語的三態(tài)驅動器

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

     output  out;                      //端口說明

     input   in, enable;

     bufif1  mybuf(out,in,enable);  //實例化宏模塊bufif1

endmodule

這個例子描述了一個名為trist2的三態(tài)驅動器。程序通過調用一個在Verilog語言庫中現(xiàn)存的三態(tài)驅動器實例元件bufif1來實現(xiàn)其功能。

例4:自行設計的三態(tài)驅動器。

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

     output  out;                       //端口說明

     input  in, enable;

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

endmodule

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

     output  out;                            //端口說明

     input  in, enable;

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

endmodule

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

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

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

模塊的框架

模塊的內容包括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         //時鐘上升沿觸發(fā),異步清零

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

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

    end

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

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

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

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

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

相關推薦

電子產業(yè)圖譜

華清遠見(www.farsight.com.cn)是國內領先嵌入師培訓機構,2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關的長期就業(yè)培訓、短期高端培訓、師資培訓及企業(yè)員工內訓等業(yè)務外,其下屬研發(fā)中心還負責嵌入式、Android及物聯(lián)網(wǎng)方向的教學實驗平臺的研發(fā)及培訓教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯(lián)網(wǎng)相關圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。