FPGA Tool的使用與第一支Verilog程式
-
Upload
chia-sheng-wen -
Category
Documents
-
view
1.156 -
download
8
Transcript of FPGA Tool的使用與第一支Verilog程式
FPGA Tool的使用與第一支Verilog程式
2
Verilog 電路模組架構及運算子使用方法
• 學習Verilog電路模組的設計結構及電路連線的方法
• 了解合成後,電路與程式指令的對應關係
• 測試平台(test bench 或 test fixture)的設計方法、待測電路的叫用、連線、以及測試時序的安排
• ModelSim電路模擬軟體的使用及批次檔do file的設計
• 訊號的命名及數值的表示方法
• 活用Verilog HDL的各種運算子
• 向量資料形態(vector 或 bus)的使用練習
• 學習設計解碼器、平行多工器、及真值表等電路
• 熟悉乘法(*)、移位(<<或>>)、加法(+)等算數運算子的使用方法和無號數(unsigned)及有號數(signed)的運算描述
• 熟悉位元組合(concatenation)、位元分配(division)、位元重複(duplication)等位元處理運算子的使用方法
3
範例 1-1 : 以Verilog HDL設計的第一個數位電路
a
b
c
d
en f
i
g
h
j
sel
0
1
2-to-1 MUX
5
驗證本範例電路功能所安排的測試時序
0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230
a
b
c
d
en
sel
f ? ? ? ? ? ? ? ? ? ? ?
6
程式 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
7
程式指令與實際電路的對應關係
a
b
c
d
en f
i
g
h
j
sel
0
1
1. `timescale 1 ns/1 ns2.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
8
測試平台 (testbench) 的設計概念
a
b
c
d
en f
i
g
h
j
sel
0
1
本名 : EX101_module_structure_demo
別名 : EX101_instancetestbench
sel
a
b
en
c
d
f
9
測試平台程式 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;
10
測試平台程式 EX_101_tb.v 內容 (續1)21 en = 1'b0;
22 sel = 1'b0;
23 #20; // Time = 20
24 a = 1'b1;
25 #10; // Time = 30
26 b = 1'b0;
27 c = 1'b1;
28 #10; // Time = 40
29 a = 1'b0;
30 #10; // Time = 50
31 en = 1'b1;
32 #10; // Time = 60
33 c = 1'b0;
34 #10; // Time = 70
35 a = 1'b1;
36 d = 1'b0;
37 #20; // Time = 90
38 c = 1'b1;
39 #20; // Time = 110
40 a = 1'b0;
11
測試平台程式 EX_101_tb.v 內容 (續2)
41 #10; // Time = 120
42 a = 1'b1;
43 #10; // Time = 130
44 c = 1'b0;
45 sel= 1'b1;
46 #10; // Time = 140
47 a = 1'b0;
48 #30; // Time = 170
49 a = 1'b1;
50 #10; // Time = 180
51 c = 1'b1;
52 #20; // Time = 200
53 a = 1'b0;
54 end
55 endmodule
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
電路模擬執行結果
14
補充說明 (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
15
補充說明 (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) 的工作原理
16
補充說明 (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
17
補充說明 (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 ) ;
18
補充說明 (5)
1. 在測試平台程式中,待測電路模組的輸入腳位,均須注入時序以茲測試
2. 與輸入接腳相連接的接線均須宣稱為 reg,因為這些接線必須具有記憶的功能才能描述其訊號含送時序的過程
3. initial 指令搭配 begin 及 end 區塊組成一時間軸自initial begin 開始,即自時間 0 ns 開始描述,每當遇到 #time 即表示時間經過 time 之後的演變
4. 單行註解說明 (comment) 可使用 // 符號多行註解則可使用 /* 與 */
5. 只要是訊號的值在 begin 與 end 循序區塊內被設定時,均須被宣稱為reg