verilog 基本語法
一、verilog 只有乙個部分,即module,稱之為模組,模組的介面部分主要分為三個部分,即模組命名部分、引數宣告部分和埠列表部分。
(1)模組宣告部分很簡單,語法關鍵字是module,在空格後面跟隨乙個名字即可。
(2) 引數宣告部分關鍵字是parameter,parameter的作用主要有兩個,乙個是增加**的可重用性,另乙個是定義**中的常量,增加**可讀性和方便**修改。
(3)埠列表部分,verilog中的埠有三種分別是輸入埠、輸出埠、以及雙向埠,inout 是雙向埠,既可以接收資料也可以傳送資料,主要是在處理匯流排資料時使用,一般不用於fpga的內部邏輯。
3.模組實現部分
從埠定義結束到endmodule關鍵字之間為模組實現部分,模組實現按照功能特性分為----宣告部分和語句部分。
(1)宣告部分
宣告引數,這種寫法是錯誤的
module portdefine( input [width-1:0] a,
output b
);parameter width=8;
wire [width-1:0] t;
endmodule
需要調整順序
(2) 語句部分
模組中的語句部分是整個模組功能的核心,其中的語句都是並行執行的,並行語句主要包括三類:例項化語句、程式塊、和連續賦值語句。
這裡主要介紹程式塊與連續賦值語句。
**程式塊:**程式塊中最常用的一種就是always 程式塊,always程式塊會反覆不斷地執行,always型別分為三種
型別一:純組合邏輯,always裡面只描述組合邏輯,敏感訊號列表裡應該包括所有的而輸入訊號,輸入訊號的判斷有三種,滿足下述三個條件之一的就是輸入訊號:
條件一:出現在賦值等號右邊的訊號
條件二:出現在條件判斷中的訊號
條件三:沒有出現在賦值等號左邊的訊號
型別二:純同步的時序邏輯always,這個always只描述通部時序邏輯,敏感列表中只包括同步邏輯的時鐘訊號。
型別三:具有非同步復位訊號的時序邏輯always
連續賦值語句:連續賦值語句是針對線網變數的一種賦值語句,線網變數對應fpga中的一段連線,連線的值隨著驅動源的變化不斷變化的,因此稱為連續賦值語句,是一種描述組合邏輯的語句,以下是乙個例子:
wire a,b;
assign a=b;
同樣的功能使用always 語句也可以描述
reg a;
wire b;
always @(b)
a=b;
二、verilog 資料型別
verilog有三大類資料型別,分別是暫存器資料型別、線網資料型別、引數資料型別,真正起作用的資料型別是暫存器資料型別與線網資料型別,它們倆共同遵守verilog的四值邏輯系統。
在verilog中邏輯系統中有四種值,即四種狀態:
邏輯0: 邏輯低電平
邏輯1: 邏輯高電平
不確定邏輯x:表示不可推斷電平,一般是由於賦值衝突引起的。
高阻邏輯z:相當於電路中的斷路。
1、暫存器資料型別
verilog 中規定,凡是在程式塊中被賦值的變數,都必須是暫存器型別的,在數位電路中,如果該程式塊描述的是時序邏輯,則暫存器變數被綜合為暫存器,如果該程式塊描述的是組合邏輯,則暫存器變數會綜合為硬體連線,如果描述的是不完全組合邏輯,該暫存器變數對應為鎖存器。
(1) reg是暫存器資料型別中最主要最常用的型別
(2)integer是整數型別,例如迴圈語句中的迴圈變數引數,integer i
2、線網資料型別
verilog中規定,模組中的input和inout埠必須是線網型別,連續賦值語句的被賦值物件是線網型別,線網型別實際上對應著硬體的連線,包括以下幾個型別:
(1) wire
wire a; 如果不寫,預設是定義1 bit的wire 型別。
(2) tri
tri和wire在用法上是一模一樣的,不過如果我們需要定義一些會被三態門驅動的硬體連線,用tri來命名會讓**更有可讀性。
(3) supply1和supply0
這兩個線網型別表示強行上拉到邏輯1和強行下拉到邏輯0,可以理解為電源線和地線,在verilog被用做常數使用。
3、引數資料型別
(1) parameter
可以宣告兩個地方,乙個是模組的介面部分,另乙個是模組實現的宣告部分。
(2) localparam
這個關鍵字與parameter類似,唯一的不同的就是在上層模組中的例化不能對其取值進行重新定義。
(3)specparam
verilog中有一種特殊的語法塊,叫做specify,主要用於定義模組中的時序模組,在specify語法塊中也可以擁有自己的引數,為了區別與module內的引數,所以使用了specparam的關鍵字。
4、陣列的定義
verilog中只支援一維陣列,例如要定義乙個32bit寬,可儲存512個資料的儲存器,宣告為:
reg [31:0] myram[511:0]
以下操作是沒問題的:
wire [31:0] dout;
assign dout=myram[256];
以下操作是不允許的
wire signbit;
assgin signbit=myram[128][31];
若要檢視myram中儲存的某乙個資料中的乙個bit
assign dout=myram[256];
assign signbit=dout[31];
5、verilog 初始化
初始化針對的是fpga中有內部記憶的單元,例如暫存器、block、ram等,對於無法記憶的單元,例如硬體連線,沒有必要也無法對其進行賦初值,在verilog語言中,有兩種初始化的方法,分別是分布式和集中式
分布式賦初值是在宣告變數的時候順便賦初值,例如:
reg [7:0] data=8』hff;
集中式賦值則是採用了initial,initial與always 最大的區別是在於always是永不停止的執行,initial只在程式最開始的時候執行一次,initial內部的暫存器型別變數使用阻塞與非阻塞賦值都行,沒有區別。
VB資料型別宣告字元及資料型別
string 的型別宣告字元為美元號 single 單精度浮點型 的型別宣告字元為感嘆號 double 的型別宣告字元是數字符號 integer 的型別宣告字元是百分比符號 long 長整型 的型別宣告字元為和號 currency 的型別宣告字元為at號 currency 變數儲存為 64 位 8 ...
資料型別的宣告,遍歷
資料型別 宣告舉例 宣告字串 nsstring mystring hello nslog nsstring字串 mystring 宣告陣列 注意 初始化陣列時,總是使用nil來結束物件列表 nsarray myarray nsarrayalloc initwithobjects item1 item...
ts 常用宣告的資料型別
1.1 ts 如何宣告乙個boolean,number,string型別的值 在js中,定義 isflag 為true,但是後面還可以重新給它賦值為字串,而ts中就不行,同理,宣告number,string 也一樣 let bool boolean true 會報錯 不能將型別 str 分配給型別 ...