1. 程式人生 > >verilog學習(二)語法之資料基礎

verilog學習(二)語法之資料基礎

一、關於模組

Verilog 的基本設計單元是“模組” (block)。一個模組是由兩部分組 成的 ,一部分描述接 口,另一部分描述邏輯功能 ,即定義輸入是如何影響輸出的 。

                                     

如圖,verilog 程式包括 4 個主要部分 : 端 口定義 、I/ O 說明、內部訊號宣告和功能定義 。

引用模組的兩種方式:

( 1) 在引用時,嚴格按照模組定義的埠順序來連線 ,不用標明原模組定義時規定的埠名,例如 :

  模組名( 連線端 口 1訊號名 ,連線端 口2 訊號名 ,連線端 口 3 訊號名 , 。。。)

( 2 ) 在引用時用“.”符號,標明原模組是定義時規定的埠名,例如:

模組名(.端 口 1名( 連線訊號 1名),端 口2 名( 連線訊號 2 名), •.•••..• )'

這樣表示的好處在於可以用埠名與被 引用模組 的埠相對應 ,而不必嚴格按埠順序對應 ,提高了程式的可讀性和可移植性 。

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

1) 用“assign ”宣告語句

                   如 :assign a  =  b  & c;這種方法的句法很 簡單,只需寫一個“assign”,後面再加一個方程式 即可 。例中的方程式 描述了一個有兩個輸入的與門。

      2 ) 用例項元件

                   如 :and  #2  u1 ( q , a ,  b ) ;

          採用例項元件的方法像在電路圖輸入方式下調入庫元件一樣 ,鍵入元件的名字和相連的引腳即可,這表示在設計中用到一個跟與 門(and) 一樣的名為u1的與門,其輸人端為 a , b,輸出 為 q。輸出延遲為 2 個單位時間 。要求模組中每個具體化後的例項元件 的名字必須是惟一的,以避免與其他呼叫與門( and) 的例項混淆 。

       3) 用“always”塊

                   如 :always  @ (posedge clk  or  posedge  clr);

                              begin

                                  if ( clr) q <= 0 ;

                                    else if ( en) q <= d ;

                              end

  PS:總結

( 1) 在 Verilog 模組中所有過程塊(如 :initial 塊 、always 塊) 、連續賦值語句 、例項引用都 是並行的;在模組內部,語句是順序執行的

      (2) 它們表示的是一種通過變數名互相連線的關係 ;

       ( 3) 在同一模組中這三者 出現的先後順序沒有關係 ;

       ( 4 ) 只有連續賦值語句 assign 和例項引用語句可以獨立於過程塊而存在於模組的功能定義部分 。

二、資料型別及其常量和變數

verilog中共有19種資料型別,最常用的有4種:reg型、wire型、integer型、parameter型

     (1)常量

           1、數字

 1)整數

                               8’ b10101100 //位寬為 8 的數的二進位制表示 ,’ b 表示二進位制

                               8’ ha2 //位寬為 8 的數的十六進位制是示,’ h表示十六進位制

                    2)x和z值

                               在數位電路中,x代表不定值,z代表高阻值

                    3)負數  

                               -8 'd5   //這個表示式代表 5 的補數(用八位二進位制數表示)

                    4)下畫線

                               16 ’ h l 010_1011_1111_1010  //合法格式

            2、引數型(parameter)

 格式: parameter 引數名1=表示式,引數名2=表示式,。。。。。

                     parameter msb= 7 ;    //定義引數 msb 為常量 7

                     parameter e= 25 , f = 29 ;//定義兩個常數引數

                     paramete  rr = 5.7 ;//宣告 r 為一個實型引數

                     parameter hyte_ size= 8 , byte_msb= byte_size- l ;//用常數表示式賦值

                     parameter average_delay = ( r+ f )/2 ; //用常數表示式賦值

    (2)變數

             1、wire型

wire型資料長用來表示用以assign關鍵字指定的組合邏輯訊號。 網路型別的變數不能儲存值,而且它必須受到驅動器(例如門或連續賦值語句,assign)的驅動。

               wire a; //定義了一個 1位的 wire 型資料 

 wire [7:0] b;//定義了一個 8 位的 wire 型資料 

 wire [4:1] c,d;//定義了兩個4位的wire型資料 ;

2、reg型別

  reg型別資料的預設初始值為不定值X。

     reg型資料常用來表示“always”模組內的指定訊號,常代表觸發器。

     always模組內被賦值的每一個訊號都必須定義為reg型別

   reg 型資料的預設初始值是不定值 。reg 型資料可以賦正值 ,也可以賦負值。但當一個reg 型資料是一個表示式中的運算元時,它的值被 當作是無符號值 ,即正值。例如 ,當一個 4 位的暫存器用做表示式中 的運算元時,如果開始暫存器被 賦以值 -1,則在表示式中進行運算時,其值被認為是十 15 。

  3、memory型

通過對 reg 型變數建立陣列來對儲存器建模,可以 描述 RAM  型儲存器、 ROM 儲存存和 reg 檔案 。陣列 中的每一個單元通 過一個數組索引進行定址 。在 verilog語言中沒有多維陣列存在。memory 型資料是通過擴充套件 reg 型資料的地址範圍來生成的 。其格式如下:

                                        reg  [n-1:0] 儲存器名  [m-1:0];

                   或                  reg  [n -1:0] 儲存器名[m :1],

                  例如:    reg [7 :0] mema[255 :0];

               這個例子定義了一個名為 mema 的儲存器 ,該儲存器 有 256 個 8 位的儲存器 。該儲存器 的地址沮圍是 0 到 255 。

三、運算子及表示式