FPGA Tool的使用與第一支Verilog程式

18
FPGA Tool的使用與第一支 Verilog程式

Transcript of FPGA Tool的使用與第一支Verilog程式

Page 1: FPGA Tool的使用與第一支Verilog程式

FPGA Tool的使用與第一支Verilog程式

Page 2: FPGA Tool的使用與第一支Verilog程式

2

Verilog 電路模組架構及運算子使用方法

• 學習Verilog電路模組的設計結構及電路連線的方法

• 了解合成後,電路與程式指令的對應關係

• 測試平台(test bench 或 test fixture)的設計方法、待測電路的叫用、連線、以及測試時序的安排

• ModelSim電路模擬軟體的使用及批次檔do file的設計

• 訊號的命名及數值的表示方法

• 活用Verilog HDL的各種運算子

• 向量資料形態(vector 或 bus)的使用練習

• 學習設計解碼器、平行多工器、及真值表等電路

• 熟悉乘法(*)、移位(<<或>>)、加法(+)等算數運算子的使用方法和無號數(unsigned)及有號數(signed)的運算描述

• 熟悉位元組合(concatenation)、位元分配(division)、位元重複(duplication)等位元處理運算子的使用方法

Page 3: FPGA Tool的使用與第一支Verilog程式

3

範例 1-1 : 以Verilog HDL設計的第一個數位電路

a

b

c

d

en f

i

g

h

j

sel

0

1

Page 4: FPGA Tool的使用與第一支Verilog程式

2-to-1 MUX

Page 5: FPGA Tool的使用與第一支Verilog程式

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 ? ? ? ? ? ? ? ? ? ? ?

Page 6: FPGA Tool的使用與第一支Verilog程式

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

Page 7: FPGA Tool的使用與第一支Verilog程式

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

Page 8: FPGA Tool的使用與第一支Verilog程式

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

Page 9: FPGA Tool的使用與第一支Verilog程式

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;

Page 10: FPGA Tool的使用與第一支Verilog程式

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;

Page 11: FPGA Tool的使用與第一支Verilog程式

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

Page 13: FPGA Tool的使用與第一支Verilog程式

13

電路模擬執行結果

Page 14: FPGA Tool的使用與第一支Verilog程式

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

Page 15: FPGA Tool的使用與第一支Verilog程式

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) 的工作原理

Page 16: FPGA Tool的使用與第一支Verilog程式

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

Page 17: FPGA Tool的使用與第一支Verilog程式

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 ) ;

Page 18: FPGA Tool的使用與第一支Verilog程式

18

補充說明 (5)

1. 在測試平台程式中,待測電路模組的輸入腳位,均須注入時序以茲測試

2. 與輸入接腳相連接的接線均須宣稱為 reg,因為這些接線必須具有記憶的功能才能描述其訊號含送時序的過程

3. initial 指令搭配 begin 及 end 區塊組成一時間軸自initial begin 開始,即自時間 0 ns 開始描述,每當遇到 #time 即表示時間經過 time 之後的演變

4. 單行註解說明 (comment) 可使用 // 符號多行註解則可使用 /* 與 */

5. 只要是訊號的值在 begin 與 end 循序區塊內被設定時,均須被宣稱為reg