博主最近剛開始學習FPGA設計,選用的開發語言是目前比較流行的Verilog,教材選用的是北京航空航天大學出版的《夏宇聞Verilog HDL數字系統設計教程》(第四版),這本書也是比較經典的一本教材,第四版是它的最新版本。在學習的過程中,博主對每一章的知識點進行了梳理,對其中重要的知識點(博主認爲的)都做了歸納,當然也有些知識點被博主捨棄掉了。學習的過程中也存在一些沒看太明白的地方,對於這些內容,有的沒寫在總結裏,有的在總結裏標註出了“存疑”二字,請各位讀者閱讀時留意。最後也歡迎各位讀者指出文章中出現的錯誤!
目錄
第二章 Verilog語法的基本概念
2.1 五個抽象級別:
系統級、算法級、RTL級(寄存器傳輸級)、門級、開關級。
注:
Verilog HDL程序是由模塊構成的,每個模塊實現特定功能,模塊可以進行層次嵌套;
除了endmodule 語句外,每個語句和數據的最後必須有分號;
第三章 模塊的結構、數據類型、變量和基本運算符號
3.1 模塊的結構:
端口定義、I/O說明、內部信號聲明以及功能定義
3.1.1 端口定義:
module 模塊名(口1,口2,口3,......);
兩種模塊引用方式:
- 模塊名(連接端口1信號名,連接端口2信號名,連接端口3信號名,......);
- 模塊名(.端口名1(連接信號1名),.端口名2(連接信號2名),......);
方法一必須嚴格按照模塊定義的端口順序來連接,方法二不必嚴格按照端口順序對應。
3.1.2 I/O說明:
3.1.2.1 輸入口說明:
input[信號位寬-1:0] 端口名1;
input[信號位寬-1:0] 端口名2;
3.1.2.2 輸出口說明:
output[信號位寬-1:0] 端口名1;
output [信號位寬-1:0] 端口名2;
3.1.2.3 輸入/輸出口:
inout[信號位寬-1:0] 端口名1;
inout[信號位寬-1:0] 端口名2;
3.1.3 內部信號說明:
wire和reg類型變量的聲明
reg[width-1:0] R變量1,R變量2,…;
wire[width-1:0] W變量1,R變量2,...;
3.1.4 功能定義:
- 用assign連續賦值語句,常用來描述組合邏輯電路;
- 用實例元件;
- 用always塊,既可用來描述組合邏輯電路也可用來描述時序邏輯電路,常用來描述時序邏輯電路;
在Verilog模塊中所有過程塊、連續賦值語句、實例引用都是並行的,只有連續賦值語句和實例引用語句可以獨立於過程塊而存在於模塊的功能定義部分;在always模塊內,邏輯是按照指定的順序執行的,always塊內的語句稱爲“順序語句”,所以always塊也稱爲“過程塊”
3.2 數據類型及其常量和變量:
常用的數據類型有:reg型、wire型、integer型、parameter型
3.2.1 常量:
3.2.1.1 整數的表示形式:
<位寬>’<進制><數字>,這是一種全面的描述方式;
‘<進制>數字>採用默認位寬,由機器系統決定,至少32位;
<數字>採用默認進制(十進制);
各種進制的表示方法:
二進制:b or B;
八進制:o or O;
十進制:d or D;
十六進制:h or H;
注:位寬指的是轉換成二進制數以後的位數。
3.2.1.2 x和z值
x表示不定值,z代表高阻態。一個x可以用來定義十六進制數的4位二進制數的狀態,八進制數的3位,二進制數的一位;z的表示方法同x類似,此外z還可寫作“?”,在case表達式中建議這種寫法,以提高程序的可讀性。
3.2.1.3 負數
-
一個數可以被定義成負數,只須在位寬表達式前加一個減號,減號必須寫在數字定義表達式的最前面。
-
下劃線:下劃線可以用來分割數的表達式以提高程序的可讀性。
3.2.1.4 符號常量:
用parameter來定義一個標識符代表一個常量,稱爲符號常量;
說明格式如下:
parameter 參數名1=表達式,參數名2=表達式,……參數名n=表達式;
參數型常數常用來定義延遲時間和變量寬度
3.2.2 變量:
3.2.2.1 wire型
網絡型變量wire結構實體之間的物理連接,不能存儲值,而且必須受到驅動器的驅動,沒有驅動時該變量就是高阻的,即其值爲z。wire型數據常用來表示以assign關鍵字指定的組合邏輯信號。Verilog程序模塊中輸入、輸出信號類型默認定義爲wire型。
wire型信號的定義格式如下:
wire [n-1:0]數據名1,數據名2,……數據名i;
wire[n:1]數據名1,數據名2,……數據名i;
3.2.2.2 reg型
寄存器是數據存儲單元的抽象,寄存器數據類型的關鍵字是reg。reg數據類型的默認初始值爲不定值x。reg型數據常用來表示“always”模塊內的指定信號,常代表觸發器,“always”模塊內每一個被賦值的信號必須被定義成reg型。
reg型數據可以賦正值也可以賦負值,但當一個reg型數據是一個表達式中的操作數時,它的值被當做是無符號數,即正值。
3.2.2.3 memory型
verilog HDL通過對reg型變量建立數組來對存儲器建模,格式如下:
reg[n-1:0]存儲器名[m-1:0];
reg[n-1:0]存儲器名[m:1];
reg[n-1:0]定義了每一個存儲單元的大小,該存儲單元是一個n位的寄存器,[m-1:0] or [m:1]則定義了該存儲器有多少個這樣的存儲單元。
注:在同一個數據類型聲明語句裏,可以同時定義存儲類型數據和reg型數據。
3.3 運算符及表達式
Verilog HDL語言運算符按其功能可以分爲以下幾類:
- 算數運算符(+,-,*,/,%);
- 賦值運算符(=,<=);
- 關係運算符(<,>,=>,<=);
- 邏輯運算符(&&,||,!);
- 條件運算符(?:);
- 位運算符(~,|,^,&,^~);
- 拼接運算符({ })。
除法運算結果略去小數,只取整數部分;取模運算(%,也稱求餘運算符)時,結果的符號位採用模運算式裏的第一個操作數的符號位。
注:
在進行算術運算操作時,如果有一個操作數有不確定的值x,則整個結果也爲不定值x。
位運算:不同長度的數據進行位運算:系統自動按右端對齊,位數少的操作數會在相應的高位用0填滿。