FPGA Tool的使用與第一支 Verilog程式
Verilog 電路模組架構及 運算子使用方法 • 學習Verilog電路模組的設計結構及電路連線的方法 • 了解合成後,電路與程式指令的對應關係 • 測試平台(test bench 或 test fixture)的設計方法、待 測電路的叫用、連線、以及測試時序的安排 • ModelSim電路模擬軟體的使用及批次檔do file的設計 • 訊號的命名及數值的表示方法 • 活用Verilog HDL的各種運算子 • 向量資料形態(vector 或 bus)的使用練習 • 學習設計解碼器、平行多工器、及真值表等電路 • 熟悉乘法(*)、移位(<<或>>)、加法(+)等算數運算子的使 用方法和無號數(unsigned)及有號數(signed)的運算描述 • 熟悉位元組合(concatenation)、位元分配(division)、 位元重複(duplication)等位元處理運算子的使用方法 2
範例 1-1 : 以Verilog HDL設計的第一個數位電路 sel a b
g i 0
en
f j 1
c
h
d
3
2-to-1 MUX
驗證本範例電路功能所安排的測試時序 0
10
20
40
30
50
60
80
70
100 110 120 130 140 150 160 170 180 190 200 210 220 230
90
a b c d en sel f
?
?
?
?
?
?
?
?
?
?
?
5
程式 EX_101.v 內容 1 `timescale 1 ns/1 ns 2 3 module EX_101_module_structure_demo ( a, b, c, d, en, sel, f ); 4 input a, b, c, d, en, sel; 5 output f; 6 wire f; 7 8 wire g, h, i, j; 9 10 assign g = a | b; 11 12 assign i = g & en; 13 14 assign h = c | d; 15 16 assign j = h & en; 17 18 assign f = (sel==1'b0) ? i : j; 19 20 endmodule 6
程式指令與實際電路的對應關係 1. `timescale 1 ns/1 ns 2. 3. module EX_101_module_structure_demo(a, b, c, d, en, sel, f); 4. input a, b, c, d, en, sel; sel 5. output f; 6. wire f; a 7. 8. wire g, h, i, j; g b 9. 10. assign g = a | b; 11. 12. assign i = g & en; 13. en 14. assign h = c | d; 15. 16. assign j = h & en; 17. 18. assign f = (sel==1'b0) ? i : j; c 19. h 20. endmodule d
i 0 f j 1
7
測試平台 (testbench) 的設計概念 testbench 別名 : EX101_instance 本名 : EX101_module_structure_demo sel a b
sel a b
g i 0
en
en
f
f
j 1 c d
c
h
d
8
測試平台程式 EX_101_tb.v 內容 1 `timescale 1 ns/1 ns 2 3 module testbench; 4 reg a, b, c, d, en, sel; 5 wire f; 6 7 EX_101_module_structure_demo EX101_instance( 8 .a(a), 9 .b(b), 10 .c(c), 11 .d(d), 12 .en(en), 13 .sel(sel), 14 .f(f) ); 15 initial 16 begin 17 a = 1'b0; // Time = 0 18 b = 1'b1; 19 c = 1'b0; 20 d = 1'b1; 9
測試平台程式 EX_101_tb.v 內容 (續1) 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
en = 1'b0; sel = 1'b0; #20; a = 1'b1; #10; b = 1'b0; c = 1'b1; #10; a = 1'b0; #10; en = 1'b1; #10; c = 1'b0; #10; a = 1'b1; d = 1'b0; #20; c = 1'b1; #20; a = 1'b0;
// Time = 20 // Time = 30
// Time = 40
// Time = 50 // Time = 60 // Time = 70
// Time = 90 // Time = 110 10
測試平台程式 EX_101_tb.v 內容 (續2) 41 #10; 42 a = 1'b1; 43 #10; 44 c = 1'b0; 45 sel= 1'b1; 46 #10; 47 a = 1'b0; 48 #30; 49 a = 1'b1; 50 #10; 51 c = 1'b1; 52 #20; 53 a = 1'b0; 54 end 55 endmodule
// Time = 120 // Time = 130
// Time = 140 // Time = 170 // Time = 180 // Time = 200
11
Tool的操作 • Xilinx ISE Simulation and WebPAC Tutorial for HDL • Xilinx ISE Simulation and WebPAC Tutorial for schematic • Altera Quartus II 8.1 Tutorial - Basic Simulation process • ModelSim Simulation and Tutorial for Verilog
電路模擬執行結果
13
補充說明 (1) : Verilog電路模組的設計結構 1.
時間刻度及精度宣稱 (例如 `timescale 1 ns/1 ns)
2.
導入檔案宣稱 (例如 `include "basic.v")
3.
常數宣稱 (例如 `define THREE 4'b0011)
4.
module name( port list );
5.
參數宣稱 (例如 parameter n = 8;)
6.
input port 宣稱;
7.
output port 或 inout port 宣稱;
8.
output port 或 inout port 訊號型態宣稱 (例如 wire 或 reg 訊號型態);
9.
內部訊號型態宣稱 (例如 wire 或 reg 訊號型態);
10. function 或 task 宣稱; 11. 下層使用模組宣稱; 12. 內部平行電路 (1); 13. 內部平行電路 (2); 14.
……
15. 內部平行電路 (N); 16. endmodule
14
補充說明 (2) 1. `timescale 1 ns / 1 ps 2. `define THREE 4’b0011 即宣稱識別字THREE為具有4個位元的常數3 (以二進位表示為b0011) 3. `include “basic.v” 4. 識別字的命名必須以字母為開頭,之後可交互使用字母、數字、_、 或 $ 等符號。大寫與小寫的字母將視為不同的命名 5. 模組以module保留字為首;以endmodule 保留字結尾 6. module name (port list); (以分號 ; 作為結尾 ),但是 endmodule敘述之後則不加分號 ( ; ) 7. 輸入腳位的訊號型態未被宣稱是由於輸入腳位的訊號型態恆為wire, 因此其宣稱是可以省略的 8. 運算子 | 及 & 分別代表 or 及 and 邏輯運算 9. assign f = (sel==1’b0) ? i : j; 說明當訊號sel等於 (==) 單一 bit 0 (1’b0) 時,將訊號i傳遞至f;否則,當訊號sel等於單一bit 1 (1’b1) 時,將訊號j傳遞至f。此行為即合乎於多工器 (multiplexer) 的工作原理
15
補充說明 (3) : 定數的表示法 1. 1’b0 表示單一位元,以二進位 (b : binary) 表示,其數值為 0 2. 1’b1 表示單一位元,以二進位 (b : binary) 表示,其數值為 1 3. 16’ha02f 表示此數共佔有16位元,以十六進位 (h : hex) 表示,其數值為 a02f 4. 通用表示格式 : {位元總數}’{進位底數}{依進位底數所表示的數值} 進位底數可為 b (二進位)、o (八進位)、d (十進位)、h (十六進位) 5. 若僅以單一數值表示 (例如 28) 則將以十進位數值看待 6. 數值的表示可加入 _ 符號以便增加可讀性,例如 16’b1100_0110_1010_0001
16
補充說明 (4) 1. wire a, b; assign a = b;
2. wire 及 reg 資料型態可被以下4種數值所設定 : 0 (邏輯0)、1 (邏輯1)、X (unknown,不知為何數值)、及 Z (high impedance,斷線或高阻抗) wire a, b, c, d; assign a = 1’b0; assign b = 1’b1; assign c = 1’bx; assign d = 1’bz; 3. 模組叫用的方式有兩種 : port map by name 及 port map by sequence (1) Port map by name 例如 : EX_101_module_structure_demo EX101_instance( .a(a), .b(b), .c(c), .d(d), .en(en), .sel(sel), .f(f) ); (2) Port map by sequence 例如 : EX_101_module_structure_demo EX101_instance ( a, b, c, d, en, sel, f ) ; 17
補充說明 (5) 1. 在測試平台程式中,待測電路模組的輸入腳位,均須注入時序以茲測試 2. 與輸入接腳相連接的接線均須宣稱為 reg,因為這些接線必須具有記憶的功能 才能描述其訊號含送時序的過程
3. initial 指令搭配 begin 及 end 區塊組成一時間軸 自initial begin 開始,即自時間 0 ns 開始描述,每當遇到 #time 即表示時 間經過 time 之後的演變 4. 單行註解說明 (comment) 可使用 // 符號 多行註解則可使用 /* 與 */ 5. 只要是訊號的值在 begin 與 end 循序區塊內被設定時,均須被宣稱為reg
18