Verilog語法之二:常量
本文首發於微信公眾號“花螞蟻”,想要學習FPGA及Verilog的同學可以關注一下。
Verilog HDL中總共有十九種資料型別,資料型別是用來表示數位電路硬體中的資料儲存和傳送元素的。我們先只介紹四個最基本的資料型別,它們是:
reg型、wire型、integer型、parameter型
其它的型別如下:
large型、medium型、scalared型、time型、small型、tri型、trio型、tri1型、triand型、trior型、trireg型、vectored型、wand型、wor型。這些資料型別除time型外都與基本邏輯單元建庫有關,與系統設計沒有很大的關係,我們無需刻意去掌握
在一般電路設計自動化的環境下,模擬用的基本部件庫是由半導體廠家和EDA工具廠家共同提供的。系統設計工程師不必過多地關心門級和開關級的Verilog HDL語法現象。
一.常量之數字
1.整數:
在Verilog HDL中,整型常量即整常數有以下四種進製表示形式:
1) 二進位制整數(b或B)
2) 十進位制整數(d或D)
3) 十六進位制整數(h或H)
4) 八進位制整數(o或O)
數字表達方式有以下三種:
1)<位寬><進位制><數字>這是一種全面的描述方式。
2)<進位制><數字>在這種描述方式中,數字的位寬採用預設位寬(這由具體的機器系統決定,但至少32位)。
3)<數字>在這種描述方式中,採用預設進位制十進位制。
在表示式中,位寬指明瞭數字的精確位數。例如:一個4位二進位制數的數字的位寬為4,一個4位十六進位制數的數字的位寬為16(因為每單個十六進位制數就要用4位二進位制數來表示)。見下例:
8'b10101100 //位寬為8的數的二進位制表示, 'b表示二進位制
8'ha2 //位寬為8的數的十六進位制,'h表示十六進位制。
2.x和z值:
在數位電路中,x代表不定值,z代表高阻值。
一個x可以用來定義十六進位制數的四位二進位制數的狀態,八進位制數的三位,二進位制數的一位。
z的表示方式同x類似。z還有一種表達方式是可以寫作?。在使用case表示式時建議使用這種寫法,以提高程式的可讀性。見下例:
4'b10x0 //位寬為4的二進位制數從低位數起第二位為不定值
4'b101z //位寬為4的二進位制數從低位數起第一位為高阻值
12'dz //位寬為12的十進位制數其值為高阻值(第一種表達方式)
12'd? //位寬為12的十進位制數其值為高阻值(第二種表達方式)
8'h4x //位寬為8的十六進位制數其低四位值為不定值
3.負數:
一個數字可以被定義為負數,只需在位寬表示式前加一個減號,減號必須寫在數字定義表示式的最前面。注意減號不可以放在位寬和進位制之間也不可以放在進位制和具體的數之間。見下例:
-8'd5 //這個表示式代表5的補數(用八位二進位制數表示)
8'd-5 //非法格式
4.下劃線(underscore_):
下劃線可以用來分隔開數的表達以提高程式可讀性。但不可以用在位寬和進位制處,只能用在具體的數字之間。見下例:
16'b1010_1011_1111_1010 //合法格式
8'b_0011_1010 //非法格式
當常量不說明位數時,預設值是32位,每個字母用8位的ASCII值表示。
例:
10=32'd10=32'b1010
1=32'd1=32'b1
-1=-32'd1=32'hFFFFFFFF
‘BX=32'BX=32'BXXXXXXX…X
“AB”=16'B01000001_01000010
二.常量之引數(Parameter)
在Verilog HDL中用parameter來定義常量,即用parameter來定義一個識別符號代表一個常量,稱為符號常量,即識別符號形式的常量,採用識別符號代表一個常量可提高程式的可讀性和可維護性。parameter型資料是一種常數型的資料,其說明格式如下:
parameter 引數名1=表示式,引數名2=表示式, …, 引數名n=表示式;
parameter是引數型資料的確認符,確認符後跟著一個用逗號分隔開的賦值語句表。在每一個賦值語句的右邊必須是一個常數表示式。
也就是說,該表示式只能包含數字或先前已定義過的引數。見下列:
parameter msb=7; //定義引數msb為常量7
parameter e=25, f=29; //定義二個常數引數
parameter r=5.7; //宣告r為一個實型引數
parameter byte_size=8, byte_msb=byte_size-1; //用常數表示式賦值
parameter average_delay = (r+f)/2; //用常數表示式賦值
引數型常數經常用於定義延遲時間和變數寬度。在模組或例項引用時可通過引數傳遞改變在被引用模組或例項中已定義的引數。下面將通過兩個例子進一步說明在層次呼叫的電路中改變引數常用的一些用法。
[例]:在引用Decode例項時,D1,D2的Width將採用不同的值4和5,且D1的Polarity將為0。可用例子中所用的方法來改變引數,即用 #(4,0)向D1中傳遞 Width=4,Polarity=0; 用#(5)向D2中傳遞Width=5,Polarity仍為1。
module Decode(A,F);
parameter Width=1, Polarity=1;
……………
endmodule
module Top;
wire[3:0] A4;
wire[4:0] A5;
wire[15:0] F16;
wire[31:0] F32;
Decode #(4,0) D1(A4,F16);
Decode #(5) D2(A5,F32);
endmodule
[例]:下面是一個多層次模組構成的電路,在一個模組中改變另一個模組的引數時,需要使用defparam命令
module Test;
wire W;
Top T ( );
endmodule
module Top;
wire W
Block B1 ( );
Block B2 ( );
endmodule
module Block;
parameter P = 0;
endmodule
module Annotate;
defparam
Test.T.B1.P = 2,
Test.T.B2.P = 3;
endmodule
本文首發於微信公眾號“花螞蟻”,想要學習FPGA及Verilog的同學可以關注一下。