You are on page 1of 18

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
g
b

i
0

en f

j
1

c
h
d

3
2-to-1 MUX
驗證本範例電路功能所安排的測試時序

0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230

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;
7. a
8. wire g, h, i, j; g
b
9.
10. assign g = a | b; i
11. 0
12. assign i = g & en;
13.
14. assign h = c | d; en f
15. j
16. assign j = h & en; 1
17.
18. assign f = (sel==1'b0) ? i : j;
19. c
h
20. endmodule d

7
測試平台 (testbench) 的設計概念
testbench
別名 : EX101_instance

本名 : EX101_module_structure_demo
sel
sel

a
a
b g
b

i
0

en f
en f

j
1

c
c
h
d
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 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;
10
測試平台程式 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

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

You might also like