Verilog HDL 教學講義 st

1 Edition

23th CYAC.Academic

概述

概述 〃什麼是硬體描述語言 ( HDL Hardware Description Language ) ? 硬件描述語言(HDL)顧名思義就是描述數位電路和設計數位系統的語言。 設計者可利用這種語言來描述自己的設計想法,利用電子設計自動化(EDA) 工具進行仿真,再用 ASIC 或 FPGA 實現其功能,常見有 Verilog 和 VHDL。 〃什麼是 FPGA ( Field Programmable Gate Array ) ? 現場可程式邏輯閘陣列,是一種可以使使用者進行編程的邏輯閘元件。 FPGA 的 IC 內部已經預先製作好各種的邏輯閘、數位電路,只須將編寫好的 HDL 檔案燒錄至 FPGA,改變 FPGA 內部邏輯閘的連接,達到實現的效果。就 某種程度上 FPGA 與 Verilog 的關係就好比 MCU 與 C 語言的關係。 〃關於 Verilog HDL 教學講義 此講義算是 Verilog 的"重點整理"或"備忘錄",內容較為精簡,不 會做詳細的解釋,若是沒學過 Verilog 的初學者,建議有了解的人來教學、 解答,較不建議拿來自學。 〃關於 Verilog Verilog 是結構鬆散的語言,也就是自由的語言,相對來說也就是不嚴 謹的語言,這種語言的好處是容易撰寫,但缺點就是容易出現 BUG,所以建 立一套良好的撰寫風格、用法,會影響到日後的撰寫。 Verilog 是一種容易入門,但不易掌握的語言,從 右表就可看的出來,雖然常用到的東西並不多,但確 實了解這些就足夠了。

常用到的關鍵字 module input , output , inout

Verilog 是硬體描述語言,描述硬體的語言,雖然 與 C 相似,但概念卻是大不同。

wire, reg, parameter

〃軟體是循序的,硬體是並行的 C 語言是一行一行的執行,而硬體電路則是只 要一供電,所有的電路就會同時工作。

posedge , negedge

〃硬體要循序,要靠 Clock 和 FSM 如果硬體要循序就要利用 Clock 和有限狀態機, 一個狀態一個狀態的執行。 〃Verilog 程式碼沒有先後之分 除了 Blocking 先後順序執行和 Non-Blocking 的 同時執行外,Verilog 的程式碼沒有前後順序之分, 先寫的不代表先執行,後寫的也不代表會後執行, 所以才稱為『描述』語言,而非『程式』語言。

always@(), assign

if-else, case, begin ... end

常用到的運算子 <= , = (賦值) > , < , <= , >= != , == [] , {} << , >> +, - , * , / , %

23th CYAC.Academic

講義目錄

目錄 Ch1

Verilog 基本簡介 1.1 Verilog 基本架構 1.2 1.3 1.4 1.5 1.6 1.7

Ch2

Module 模組名稱 輸出入埠名稱 輸出入埠敘述 資料型態敘述 內部電路敘述

邏輯閘層次 Gate Level 3.1 基本邏輯閘 3.2 使用方法 3.3 實際範例

Ch4

資料流層次 Dataflow Level 4.1 assign 敘述 4.2 運算子 4.3 實際範例 行為層次 Behavior Level 5.1 always 敘述 5.2 5.3

if-else case、casex 與 casez

5.4 5.5 5.6

for Blocking/Non-Blocking 實際範例

模組化與階層化 6.1 6.2 6.3 6.4 6.5

Top Module By Name, In Order 函數 function 任務 task 實際範例

Ch7

數位電路設計 7.1 多工器 Multiplexier 7.2 解多工 DeMultiplexier 7.3 編碼器 Encode 7.4 解碼器 Decode 7.5 比較器 Comparator 7.6 算術邏輯運算單元 ALU 7.7 上數計數器 Counter 7.8 有限狀態機 FSM

Ch8

應用範例 8.1 按鍵防彈跳 8.2 除頻器 8.3 LED 流水燈 8.4 掃描鍵盤 8.5 計數器 ( 七段顯示器 )

Ch9

模擬測試 Test Bench 9.1 基本語法(製作中) 9.2 實際範例(製作中)

Verilog 資料型態 2.1 資料狀態 2.2 連接線 Net 2.3 暫存器 Register 2.4 多進制表示 2.5 數值資料 2.6 表示法 2.7 參數 Parameter

Ch3

Ch5

Ch6

參考及引用

23th CYAC.Academic

Ch1 Verilog 基本簡介

Ch1 Verilog 基本簡介 1.1 Verilog 基本架構 module 模組名稱( 輸出入埠名稱 ); 輸出入埠 敘述 資料型態 敘述 內部電路 敘述 endmodule

1.2 module .Verilog 主要的架構就是模組( module ) .每一個 Verilog 檔案,必須包含一個 Module .Module 就像是積木,而一個大型的數位系統 就是由一些特定功能的積木組成 表示法:

module 模組名稱( 輸出入埠名稱 ); …………

endmodule 1.3 模組名稱 .通常具有描述模組功能的責任 .盡量避免無意義的命名 1.4 輸出入埠名稱 .這個 module 的輸出輸入敘述 .不須按照順序排列 .兩個或兩個以上的輸出入埠必須使用逗號分開 表示法: module 模組名稱( In1, In2, Out1, Out2, InOut1 ); ………… endmodule

23th CYAC.Academic

Ch1 Verilog 基本簡介

1.5 輸出入埠敘述

表示法: module 模組名稱( In1, In2, Out1, Out2, InOut1 ); input in1, in2;

// 敘述輸出入型態

output Out1, Out2; inout InOut1; ………… endmodule

1.5.1 Intput ( 輸出埠 ) 敘述 .模組內可接 net .模組外可接 net、register 1.5.2 Output ( 輸出埠 ) 敘述 .模組內可接 net、register .模組外可接 net 1.5.3 InOut ( 雙向埠 ) 敘述 .模組內可接 net .模組外可接 net

23th CYAC.Academic

Ch1 Verilog 基本簡介

1.6 資料型態敘述( 詳細 Ch2 會講解 ) .較常使用 wire( 連接線 net ) 與 reg( 暫存器 register 與實體記憶體不同 ) 表示法: module 模組名稱( In1, In2, Out1, Out2, InOut1 ); input in1, in2; output Out1, Out2; inout InOut1; wire In1, In2, Out1; wire InOut1; reg Out2; ………… endmodule

.Verilog 最重要的部分,負責描述模組的電路架構與功能 .主要有四種層次的描述:( 高階→低階 ) 行為層次 ( Behavior Level ) 資料流層次 ( Dataflow Level ) 邏輯閘層次 ( Gate Level ) 電晶體層次 ( Switch Level ) .行為層次與資料流層次合稱” 暫存器轉換層次 RTL ( Register Transfer Level ) ” .通常在撰寫 Verilog 時,只會接觸行為、資料流、邏輯閘層次而已

23th CYAC.Academic

Ch1 Verilog 基本簡介

範例: module 模組名稱( In1, In2, Out1, Out2, InOut1 ); input in1, in2; output Out1, Out2; inout InOut1; wire In1, In2, Out1; wire InOut1; reg Out2; // 以下為三種層級分別描述 In1 與 In2 and 做 and 運算的方法 // 邏輯閘層次( Gate Level ) and and1( Out1, In1, In2 ); // 資料流層次( Dataflow Level ) assign Out1 = In1 & In2; // 行為層次( Behavior Level ) allways @(*) begin Out2 = In1 & In2; end endmodule

*補充 .與 C 語言相同,有 // 及 /**/ .module 後面要記得加上分號;

兩種註解方式

23th CYAC.Academic

Ch2 Verilog 資料型態

Ch2 Verilog 資料型態 2.1 資料狀態 0 邏輯 0 1 邏輯 1 x 或 X 未知的值( Unknow )或浮接( Floating ) z 或 Z 高阻抗( High Impendence ) 2.2 連接線 Net ( wire、wand、wor ) .沒有記憶性 .預設值為 z .將兩個 wire 連在一起是不允許的 .若是型態為 wand/wor 則例外 範例: module 模組名稱( a, b, c, d, e ); input a, b; output c, d, e; wire c; wand d; wor e; // wire 接一起 → 錯誤 assign c = a; assign c = b; // wire-and → d = a&b assign d = a; assign d = b; // wire-or → e = a|b assign e = a; assign e = b; endmodule

23th CYAC.Academic

Ch2 Verilog 資料型態 2.3 暫存器 Register ( reg ) .有記憶性 .預設值為 x ( 最好要初始化 ) 範例: module 模組名稱( a, b, c ); input a; output b, c; reg b, rTmp; // 範例 1 always @(*) begin b = a; end // 範例 2 assign c = rTmp; endmodule 2.4 多進制表示 表示: <位元長度> ’ <進制表示> <數值資料> 位元長度:以十進制表示位元長度(二進制長度) 進制表示:二進制(b)、八進制(o)、十進制(d)、十六進制(h),預設為十進制 數值資料:可用底線’_’來增加可讀性,數值內也可以混用 X 和 Z 範例: Num = 5’b01101 Num = 22; Num = 12’b0000_1111_0000; Num = 4’hf; Num = 4’bxxx1; Num = 4’bz01;

// // // // // //

二進制 十進制 增加可讀性 十六進制(二進制的 1111) 前三位為未知,最後為 1 前兩位為 z,後兩位為 01 23th CYAC.Academic

Ch2 Verilog 資料型態 2.5 數值資料 2.5.1 整數( integer ) .沒有小數 .一般長度為 32 位元 .以 2’s 補數計算 .常用在迴圈計數上 範例: module Module_Int( In,Out ); input In; output [7:0]Out; wire In; reg [7:0] Out = 8’h00; always @(posedge CLK) begin integer i; for( i=0; i<=7; i=i+1 ) Tmp[i] <= In; end endmodule

2.5.2 其他(不詳述) .實數( real ):可具有小數,但不太常用 .時間數字( time ):模擬時的時間設定 2.6 表示法 2.6.1 向量表示法 .[最高位元 MSB : 最低位元 LSB] 或 [最低位元 LSB : 最高位元 MSB] 範例: /* 宣告 */ output [3:0] A; reg [0:3] B, C;

// A 為 4bit,A[3],A[2],A[1],A[0] // B 為 4 bit,B[0],B[1],B[2],B[3] // C 為 4 bit,C[0],C[1],C[2],C[3] // D 為 64 bit // E 為 1 bit

wire [63:0] D; wire E; /* 使用 */ A[2:1] = B[0] & C[1:2]; // A[2] = 0&C[1],A[1] = B[0] & C[2] B[0:1] = 0; // 清空 B 的最高(最左)2bit C = 4’b1011; // C[0]=1,C[1]=0,C[2]=1,C[3]=1 23th CYAC.Academic

Ch2 Verilog 資料型態 2.6.2 陣列表示法 範例: /* 宣告 */ integer [7:0] A [3:0]; reg B [3:0] [15:0]; reg [7:0] C [3:0] [15:0];

// A 為 4 個 8bit 的 integer // C 為 4*16 個 1bit 的 reg // C 為 4*16 個 8bit 的 reg

/* 使用 */ A[3] = 0; A = 0;

// 清除 A 陣列中第 3 個元素(內含 8bit) // 把陣列全部清空

B[1][0] = 1; B[1] = 0; C[0][0][3:0] = 4b’0010; C[2][8][5] = 1 ;

// // // //

設定 B 陣列中[1][0]的元素為 1 將[1][0]到[1][255]的元素都設為 0 設定位置[0][0]的低 4bit 為 0010 設定位置[2][8]的第 5bit 為 1

2.6.3 記憶體表示法 .由 reg 組成的陣列 範例: /* 宣告 */ reg [15:0] A [1023:0]

// 記憶體 A 由 1024 個 16bit 字元組成

/* 使用 */ A[128];

// 地址為 128 的字元(內含 16bit)

2.7 參數( parameter ) .是常數,不可改變也不能當作變數使用 .但可以在初始化模組(使用)的時候重新定義 .利於維護程式( 像 C 語言的 define ) 範例: parameter Bit = 8, cnt_up = 1’b1; output [Bit-1:0] A; reg [Bit-1:0] A; A = A + cnt_up; 23th CYAC.Academic

Ch3 邏輯閘層次 Gate Level

Ch3 邏輯閘層次 Gate Level 3.1 基本邏輯閘 AND

NAND

OR

NOR

XOR

XNOR

True Table: Input

Output

In_1

In_2

and

nand

or

nor

xor

xnor

0

0

0

1

0

1

0

1

0

1

0

1

1

0

1

0

1

0

0

1

1

0

1

0

1

1

1

0

1

0

0

1

3.2 使用方法 使用方法: <閘名稱> <閘編號> ( 輸出埠, 輸入埠 1, 輸入埠 2… ); 閘名稱:使用的邏輯閘名稱( ex. and, or, nor... ) 閘編號:給予該閘名稱或編號,可不寫,交由軟體處理 輸出埠:輸出埠只能有一個,並且寫在最前面 輸入埠:輸入邏輯閘的資料口,需使用逗號分別 範例: ……… wire w1, w2; and and1( w1, In1, In2 ); or or1( w2, w1, In2 ); xor xor( Out, w1, w2 ); // 最後 out

// w1 = In1 and In2 // w2 = w1 or In2 // Out = w1 xor w2

= ( In1 and In2 ) xor ( w1 or In2 ) = ( In1 and In2 ) xor (( In1 and In2 ) or In2 )

……… 23th CYAC.Academic

Ch3 邏輯閘層次 Gate Level 3.3 實際範例 一位元全加器

程式碼: module Full_Adder( A, B, Cin, Sum, Cout ); input A, B, Cin; output Sum, Cout; wire W1, W2, W3; xor and and xor or

xor1 ( W1, A, B ); and1( W2, W1, Cin ); and2( W3, A, B ); xor2 ( Sum, W1, Cin ); or1 ( Cout, W2, W3 );

endmodule

23th CYAC.Academic

Ch4 資料流層次 Dataflow Level

Ch4 資料流層次 Dataflow Level 4.1 assign 敘述 .驅動某值至 net ( 等號左式只能是 net,右式可以是 net 或 reg ) .資料流層次的描述方式,只能敘述組合邏輯電路( 不含有記憶性電路 ) .但輸出不可以包含輸入( EX : a = a + b; → 隱含有記憶性 → 錯誤 ) 範例: assign 輸入 = 輸出 ( 可包含運算子 )

4.2 運算子 運算子名稱

符號

說明

+

加法

-

減法

*

乘法

**

次方

/

除法

盡量少用,因為耗費資源很大

%

取餘數

盡量少用,因為耗費資源很大

~

NOT

&

AND

|

OR

^

XOR

!

邏輯 NOT

回傳 True / False

&&

邏輯 AND

回傳 True / False

||

邏輯 OR

回傳 True / False

>

大於

>=

大於等於

<

小於

<=

小於等於

==

等於

!=

不等於

<<

左移

相當於乘 2n,n 為位移數

>>

右移

相當於除 2n,n 為位移數

條件運算子

?:

if-else

等同於 if-else

連結運算子

{}

連接變數

算術運算子

二元運算子

邏輯運算子

比較運算子

位移運算子

備註

">="邏輯電路比">"簡單 "<="邏輯電路比"<"簡單

23th CYAC.Academic

Ch4 資料流層次 Dataflow Level 4.2.1 條件運算子 範例: /* 若 A>B, Out = A 反之 若 A<=B, Out = B */ Out = ( A>B ) ? A : B; /* 使用 if-else */ If( A>B ) Out = A; else Out = B;

4.2.2 連結運算子 範例: A = { 1’b0, 1’b1 }; A = { B[1:0], C[0], D[2] }; A = { 2{2’b01} }; A = { 3’b101, 2{1’b0} }

// A = 2’b01 // A = B[1], B[0], C[0], D[2] // A = 4’b0101 // A = 5’b10100

4.3 實際範例 一位元全加器程式碼: module Full_Adder( A, B, Cin, Sum, Cout ); input A, B, Cin; output Sum, Cout; wire W1, W2, W3; assign W1 = A^B; assign W2 = W1&Cin; assign W3 = A&B; assign Sum = W1^Cin; assign Cout = W2|W3; endmodule

23th CYAC.Academic

Ch5 行為層次 Behavior Level

Ch5 行為層次 Behavior Level 5.1 always 敘述 .驅動某值至 reg( 等號的左式必為 reg,右式可為 net 或 reg ) .行為層次的描述方式,可用於敘述組合邏輯和序向邏輯 .事件與事件之間需用”or”或”逗號 , ”分開 .當”事件”有變化時( 0→1、1→0 ),則會執行”敘述” .事件中可以使用正緣觸發 posedge(0→1)和負緣觸發 negedge(1→0) .若寫成 always @(*) 或 always @* 代表 always 內任一變化即執行敘述 範例: always @( 事件 1, 事件 2, … ) begin 敘述 1; 敘述 2; ……… end

5.2 if-else 敘述 範例: if( 判斷條件 1 ) begin 敘述 1; end else if( 判斷條件 2 ) begin 敘述 2; end else begin 敘述 3; end

23th CYAC.Academic

Ch5 行為層次 Behavior Level 5.3 case、casex 與 casez 敘述 .expr 可為定值或變數,可放連結運算子 .不允許 expr 中有 x 或 z .允許 casez 中的 item 值除了”0” “1”外,還可以使用 z .允許 casex 中的 item 值除了”0” “1” “z”外,還可以使用 x 範例:

應用:

case( expr ) item 1: begin 敘述 1; end item 2: begin 敘述 2; end ……… default: 敘述 n; endcase

/* 應用 1 */

/* 應用 3*/

case( A ) 1’b0: C = B;

case( {A,B} ) 2’bx1: C = B;

1’b1: C = D; default: C = E; endcase

2’b1x: C = D; default: C = E; endcase

/* 應用 2*/

/* 應用 4*/

case( A ) 2’bx1: C = B; 2’b1x: C = D; default: C = E; endcase

case( 2’b01 ) A: Out = 3’b001; B: Out = 3’b010; default: Out = 3’b100; endcase

5.4 for 敘述 .變數通常宣告成 integer 的型態 範例: for( 變數初值; 變數條件判斷; 變數增減 ) begin 敘述; end

23th CYAC.Academic

Ch5 行為層次 Behavior Level 5.5 Blocking/Non-Blocking 敘述 .Blocking ( = ),具有順序性,敘述會與先後有關係 ( 順序處理 ) .Non-Blocking ( <= ),具有同時性,敘述與先後沒有關係 ( 平行處理 ) 範例: /* Blocking ( = ) */ 輸出 = 輸入邏輯;

/* Non-Blocking( <= ) */ 輸出 <= 輸入邏輯;

範例: input In; reg [3:0] A, B, C; always @( posedge CLK ) begin /* Blocking */ // 有順序執行,同 C 概念 A[0] = In; // 1CLK 後 A[0] = In A[1] = A[0]; // 1CLK 後 A[1] = A[0] = In A[2] = A[1]; // 1CLK 後 A[2] = A[1] = A[0] = In A[3] = A[2]; // 1CLK 後 A[3] = A[2] = A[1] = A[0] = In /* Non-Blocking */ // 同時執行,此範例有資料平移的效果 B[0] <= In; // 1CLK 後 B[0]存進 In, B[1]存進 B[0](存 In 之前的值) B[1] <= B[0]; // 2CLK 後 B[1]存進 In B[2] <= B[1]; // 3CLK 後 B[2]存進 In B[3] <= B[2]; // 4CLK 後 B[3]存進 In /* 混合 */ C[0] <= In; C[1] = C[0];

//盡量不要常用 // 1CLK 後 C[0]存進 In, C[1], C[2]存進 C[0](存 In 之前的值) // 2CLK 後 C[1] = C[2] = C[3] = In

C[2] = C[1];

//

C[3] <= C[2];

//

end

23th CYAC.Academic

Ch5 行為層次 Behavior Level 5.6 實際範例 一位元全加器程式碼: module Full_Adder( A, B, Cin, Sum, Cout ); input A, B, Cin; output Sum, Cout; wire W1, W2, W3; always @( A, B, Cin ) begin { Cout, Sum } = A + B + Cin; end endmodule

23th CYAC.Academic

Ch6 模組化與階層化

Ch6 模組化與階層化 6.1 Top Module .Module 可以有無限多個,但 Top Module 只能有一個

6.2 By Name, In Order .連接 module 的方式分別有 By Name 和 In Order 兩種 .指定名稱 By Name,依原模組名稱來連接,複雜時較不易出錯 .依照順序 In Order,依原模組定義之埠列來連接 By Name 範例:

In Order 範例:

// 連接除頻器 module

// 連接除頻器 module

wire _CLK, _RST, _CLKo;

wire _CLK, _RST, _CLKo;

Freq_Divider FD_1Hz( .CLK( _CLK ), .CLKo( _CLKo ), .RST( _RST ) );

Freq_Divider FD_1Hz( _CLK, _RST, _CLKo ); 23th CYAC.Academic

Ch6 模組化與階層化 6.3 函數 Function .一定有回傳值 .至少要有一個以上的 Input .只能有一個 Output( 可以使用連接運算子{} ) .可引用其他的 Function 但不能引用 Task .不可使用 negedge 和 posedge,且只能合成組合邏輯 .只能用於行為層次( Behavior Level ),且不能包含 always 範例: function <資料大小> <函數名稱>; input <輸入埠宣告>; reg <資料型態宣告>; begin <敘述>; end endfunction

6.4 任務 Task .沒有回傳值 .可以擁有零個或數個 Input、Output、InOut .可引用其他的 Function 與 Task .不可使用 negedge 和 posedge .只能用於行為層次( Behavior Level ),且不能包含 always 範例: task <任務名稱>; input <輸入埠宣告>; output <輸出埠宣告>; reg <資料型態宣告>; begin <敘述>; end endtask

23th CYAC.Academic

Ch6 模組化與階層化 6.5 實際範例 一位元全加器程式碼: module Top_Module( A, B, Cin, Sum, Cout ); input A, B, Cin; output Sum, Cout; Full_Adder

FAD( // 使用 always 的 Full_Adder

.A(A), .B(B), .Cin(Cin), .Sum(Sum), .Cout(Cout) ); endmodule

23th CYAC.Academic

Ch7 數位電路設計

Ch7 數位電路設計 ‧一種功能的數位系統,並不是只有一種敘述的方法,而不同的敘述方法可能會 會造成不同的合成、不同的效能、不同的電路,但卻是可以是相同的結果,所 以這裡的範例僅提出一種方法做參考,學習的初期只需達到結果就好,等到了 解後再去思考該如何做到簡單、如何不浪費邏輯資源。 7.1 多工器( Multiplexier )

程式( 2 to 1 多工器 ): module Mux2_1( In1, In2, Sel, Out ); input output

In1, In2, Sel; Out;

wire reg

In1, In2, Sel; Out;

always @( In1, In2, Sel ) begin if( !Sel ) Out <= In1; else Out <= In2; end endmodule

23th CYAC.Academic

Ch7 數位電路設計

7.2 解多工( DeMultiplexier )

程式( 1 to 2 解多工): module DeMux2_1( In, Sel, Out1, Out2 ); input

In, Sel;

output

Out1, Out2;

wire reg

In, Sel; Out1, Out2;

always @( In, Sel ) begin case( Sel ) 1'b0: Out1 <= In; 1'b1: Out2 <= In; endcase end endmodule

23th CYAC.Academic

Ch7 數位電路設計

7.3 編碼器( Encode )

程式( 8 to 3 編碼器): module EnCoder( In, Out ); input

[7:0] In;

output

[2:0] Out;

wire reg

[7:0] In; [2:0] Out;

always @( In ) begin case( In ) 8'b0000_0001: 8'b0000_0010: 8'b0000_0100: 8'b0000_1000: 8'b0001_0000: 8'b0010_0000: 8'b0100_0000: 8'b1000_0000: default:

Out <= 3'b000; Out <= 3'b001; Out <= 3'b010; Out <= 3'b011; Out <= 3'b100; Out <= 3'b101; Out <= 3'b110; Out <= 3'b111; Out <= 3'bxxx;

endcase end endmodule

23th CYAC.Academic

Ch7 數位電路設計

7.4 解碼器( Decode )

程式( 3 to 8 解碼器): module DeCoder( In, Out ); input output

[2:0] In; [7:0] Out;

wire reg

[2:0] In; [7:0] Out;

always @( In ) begin case( In ) 3'b000: 3'b001: 3'b010: 3'b011: 3'b100: 3'b101: 3'b110: 3'b111: default:

Out <= 8'b0000_0001; Out <= 8'b0000_0010; Out <= 8'b0000_0100; Out <= 8'b0000_1000; Out <= 8'b0001_0000; Out <= 8'b0010_0000; Out <= 8'b0100_0000; Out <= 8'b1000_0000; Out <= 8'bxxxx_xxxx;

endcase end endmodule

23th CYAC.Academic

Ch7 數位電路設計

7.5 比較器( Comparator )

程式( 比較器 ): module Comparator( In1, In2, Out ); input output

In1, In2; [2:0] Out;

wire reg

In1, In2; [2:0] Out;

always @( In1, In2 ) begin Out[0] <= ( In1 > In2 ); Out[1] <= ( In1 == In2 ); Out[2] <= ( In1 < In2 ); end endmodule

23th CYAC.Academic

Ch7 數位電路設計

7.6 算術邏輯運算單元( ALU )

程式( ALU ): `define `define `define `define

ADD 2'b00 SUB 2'b01 AND 2'b10 OR 2'b11

module ALU( Data_A, Data_B, OP_Code, Data_Out ); parameter parameter

Data_Size = 8; OP_Code_Size = 2;

input input output

[Data_Size-1:0] Data_A, Data_B; [OP_Code_Size-1:0] OP_Code; [Data_Size-1:0] Data_Out;

reg

[Data_Size-1:0] Data_Out;

always @( Data_A, Data_B, OP_Code ) begin case( OP_Code ) `ADD: Data_Out <= Data_A + Data_B; `SUB: `AND: `OR: default: endcase

Data_Out <= Data_A - Data_B; Data_Out <= Data_A & Data_B; Data_Out <= Data_A | Data_B; Data_Out <= 0;

end endmodule 23th CYAC.Academic

Ch7 數位電路設計

7.7 上數計數器( Counter )

程式( 計數器 ): module Counter( CLK, RST, Cnt_Num, Cnt_Data ); parameter Cnt_Num_Size = 2; parameter Cnt_Data_Size = 16; input input output

CLK, RST; [Cnt_Num_Size-1:0] Cnt_Num; [Cnt_Data_Size-1:0] Cnt_Data;

wire

CLK, RST;

wire reg

[Cnt_Num_Size-1:0] Cnt_Num; [Cnt_Data_Size-1:0] Cnt_Data;

always @( posedge CLK, negedge RST ) begin if( !RST ) Cnt_Data <= 0; else Cnt_Data <= Cnt_Data + Cnt_Num; end endmodule

23th CYAC.Academic

Ch7 數位電路設計

7.8 有限狀態機( Finite State Machine )

程式( FSM ): module Finite_State_Machine( CLK, RST, State ); parameter State_A = 2'b00, State_B = 2'b01, input output reg

State_C = 2'b10, State_D = 2'b11; CLK, RST; [1:0] State; [1:0] State;

always @( posedge CLK, negedge RST ) begin if( !RST ) State = State_A; else case( rState ) State_A: State_B: State_C: State_D: default: endcase

State <= State_B; State <= State_D; State <= State_A; State <= State_C; State <= State_A;

end endmodule 23th CYAC.Academic

Ch8 應用範例

Ch8 應用範例 8.1 按鍵防彈跳

程式( 防彈跳 ): module KEY_Debounce( CLK, RST, KEY_In, KEY_Out ); parameter DeB_Num = 4; // 取樣次數 parameter DeB_SET = 4'b0000; // 設置 parameter DeB_RST = 4'b1111; // 重置 input input output reg reg

CLK, RST; KEY_In; KEY_Out; KEY_Out = 1'b1; [DeB_Num-1:0] Bounce = 4'b1111;

always @( posedge CLK, negedge RST ) begin

// 初始化 // 一次約 200Hz 5ms

if( !RST ) Bounce <= DeB_RST; // Bounce 重置 else begin // 取樣 4 次 integer i; Bounce[0] <= KEY_In; for( i=0; i
23th CYAC.Academic

Ch8 應用範例

8.2 除頻器

程式( 除頻器 50MHz to 1kHz ): module Freq_Divider( CLK, RST, CLK_Out ); /* 除頻器 Use 50MHz OSC */ // 除頻設定 1kHz 1ms Parameter Div = 16'd50_000; // 除頻數(Even) parameter parameter input output reg reg

Div2 = 16'd25_000; DivW = 16;

// Div/2 // Divide 寬度

CLK, RST; CLK_Out; rCLK_Out; [DivW-1:0] CLK_Cnt = 0;

always @( posedge CLK, negedge RST ) begin if( !RST ) CLK_Cnt <= 0; else if( CLK_Cnt == Div-1 ) CLK_Cnt <= 0; else CLK_Cnt <= CLK_Cnt + 1'b1; end always @( posedge CLK or negedge RST ) begin if( !RST ) CLK_Out <= 0; else if( CLK_Cnt <= Div2-1 ) CLK_Out = 0; else CLK_Out = 1'b1; end endmodule 23th CYAC.Academic

Ch8 應用範例

8.3 LED 流水燈

程式( 流水燈 ): module LED_Water( CLK, RST, LED_Out ); input CLK, RST; output [3:0] LED_Out; reg [23:0] Delay_Count = 24'd0; // USE 50MHz OSC reg [3:0] LED_State = 4'b0001; always @( posedge CLK, negedge RST ) begin if( !RST ) begin Delay_Count <= 24'd0; LED_State <= 4'b0001; end else if( Delay_Count == 24'd25_000_000 ) begin Delay_Count <= 24'd0; if( LED_State == 4'b0000 ) LED_State <= 4'b0001; else LED_State <= LED_State << 1; end

// 500ms

else Delay_Count <= Delay_Count + 1'b1; end assign LED_Out = ~LED_State; endmodule

23th CYAC.Academic

Ch8 應用範例

8.4 掃描鍵盤

程式( 掃描鍵盤 ): /* 掃描鍵盤 KEY_Row 讀取, KEY_Col 掃描 */ module KEY_Scan( CLK, RST, KEY_Row, KEY_Col, KEY ); /* STATE */ parameter Col_1 = 4'b1110; parameter Col_2 = 4'b1101; parameter Col_3 = 4'b1011; parameter Col_4 = 4'b0111; input input output output

CLK, RST; [3:0] KEY_Row; [3:0] KEY_Col; [15:0] KEY;

reg [15:0] KEY = 16'h0000; reg [3:0] KEY_Col = Col_1;

23th CYAC.Academic

Ch8 應用範例

always @( posedge CLK, negedge RST ) begin if( !RST ) begin KEY <= 16'b0; KEY_Col <= Col_1; End else begin case( KEY_Col ) Col_1: begin KEY[3:0] <= KEY_Row; KEY_Col <= Col_2; end Col_2: begin KEY[7:4] <= KEY_Row; KEY_Col <= Col_3; end Col_3: begin KEY[11:8] <= KEY_Row; KEY_Col <= Col_4; end Col_4: begin KEY[15:12] <= KEY_Row; KEY_Col <= Col_1; end default: KEY_Col <= Col_1; endcase end end endmodule

23th CYAC.Academic

Ch8 應用範例

8.5 計數器 ( 七段顯示器 )

程式( Top_Module ):

module Top_Module( CLK, RST,SEL_Out, DIG_Out ); input output output

CLK, RST; [5:0] SEL_Out; [7:0] DIG_Out;

wire wire

[3:0] Cnt_Up; CLK_1Hz;

Freq_Divider Freq_Div_1Hz( .CLK(CLK), .RST(RST), .CLK_Out(CLK_1Hz) ); Counter_Up Counter_Up( .CLK(CLK_1Hz), .RST(RST), .Cnt(Cnt_Up) ); Seg_Seven DIG_SEG( .SEL_In(Cnt_Up), .DIG_In(Cnt_Up), .SEL_Out(SEL_Out), .DIG_Out(DIG_Out) ); endmodule 23th CYAC.Academic

Ch8 應用範例

程式( 除頻 1MHz ): /* 除頻器 Use 50MHz OSC */ module Freq_Divider( CLK, RST, CLK_Out ); input output

CLK, RST; CLK_Out;

reg reg

CLK_Out; [DivW-1:0] CLK_Cnt = 0;

// 除頻設定 1Hz 1s parameter Div = 26'd50_000_000;

// 除頻數(Even)

parameter parameter

// Div/2 // Divide 寬度

Div2 = 26'd25_000_000; DivW = 26;

always @( posedge CLK,negedge RST ) begin if( !RST ) CLK_Cnt <= 0; else if( CLK_Cnt == Div-1 ) CLK_Cnt <= 0; else CLK_Cnt <= CLK_Cnt + 1'b1; end always @( posedge CLK,negedge RST ) begin if( !RST ) CLK_Out <= 0; else if( CLK_Cnt <= Div2-1 ) CLK_Out <= 0; else CLK_Out <= 1'b1; end endmodule

23th CYAC.Academic

Ch8 應用範例

程式( 上數計數器 ): /* 上數計數器 */ module Counter_Up( CLK, RST, Cnt ); /* 計數資訊 */ parameter Cnt_SB = 4; // 計數寬度 parameter Cnt_UP = 1'b1; // 計數值 parameter Cnt_Min = 4'd0; // 計數最小值 parameter Cnt_Max = 4'd8; // 計數最大值 input output

CLK, RST; [Cnt_SB-1:0] Cnt;

reg

[Cnt_SB-1:0] Cnt = Cnt_Min;

always @( posedge CLK or negedge RST ) begin if( !RST ) Cnt <= Cnt_Min; else if( Cnt == Cnt_Max ) Cnt <= Cnt_Min; else Cnt <= Cnt + Cnt_UP; end endmodule

23th CYAC.Academic

Ch8 應用範例 程式( 七段顯示器解碼 ): /* 七段顯示器解碼(共陽) */ module Seg_Seven( SEL_In, DIG_In, SEL_Out, DIG_Out ); input [2:0] SEL_In; // Use PNP input [3:0] DIG_In; // MSB D, C, B, A LSB output [5:0] SEL_Out; // 七段顯示器選擇 output [7:0] DIG_Out; // MSB dp, g, f, e, d, c, b, a LSB reg [5:0] SEL_Out; reg [7:0] DIG_Out; always @( SEL_In ) begin case( SEL_In ) 3'b000: 3'b001: 3'b010: 3'b011: 3'b100: 3'b101: 3'b110: 3'b111: endcase

SEL_Out <= 6'b000000; SEL_Out <= 6'b111110; SEL_Out <= 6'b111101; SEL_Out <= 6'b111011; SEL_Out <= 6'b110111; SEL_Out <= 6'b101111; SEL_Out <= 6'b011111; SEL_Out <= 6'b111111;

// all on // 1 // 2 // 3 // 4 // 5 // 6 // all off

end always @( DIG_In ) begin case( DIG_In ) 4'b0000: DIG_Out <= 8'b11000000; 4'b0001: DIG_Out <= 8'b11111001; 4'b0010: DIG_Out <= 8'b10100100; 4'b0011: DIG_Out <= 8'b10110000; 4'b0100: DIG_Out <= 8'b10011001; 4'b0101: DIG_Out <= 8'b10010010; 4'b0110: DIG_Out <= 8'b10000011; 4'b0111: 4'b1000: 4'b1001: 4'b1010: default: endcase

DIG_Out <= 8'b11111000; DIG_Out <= 8'b10000000; DIG_Out <= 8'b10010000; DIG_Out <= 8'b01111111; DIG_Out <= 8'b11111111;

// 0 // 1 // 2 // 3 // 4 // 5 // 6 // 7 // 8 // 9 // dp // off

end endmodule 23th CYAC.Academic

Ch9 模擬測試 Test Bench

Ch9 模擬測試 Test Bench

23th CYAC.Academic

參考及引用

參考及引用 圖片來源 1.

第 3.1 節 基本邏輯閘圖片 http://zh.wikipedia.org/wiki/%E9%82%8F%E8%BC%AF%E9%96%98

參考資料 1. 2.

3.

th

中原大學電機系 Verilog HDL 讀書會 暑期教學講義 4 Summary for IEEE Verilog 1363-2001 Chih-Tsun Huang ( 黃稚存 ) http://www.google.com.tw/url?sa=t&rct=j&q=2.+Summary+for+IEEE+Verilog+1363-2001&sour ce=web&cd=1&ved=0CCcQFjAA&url=https%3A%2F%2Ffpga.googlecode.com%2Ffiles%2FSum mary%2520for%2520IEEE%2520Verilog%25201363-2001.pdf&ei=MGlST_u2Go3HmQXAx6XDA Q&usg=AFQjCNGBUiguYtCtyKDmdmjVZFu4n4kOlw&sig2=iGSJ8XBKZKem180Cy6Pj3g 真 OO 無雙之真亂舞書-由 C 語言學習 Verilog 的思維轉換 http://www.cnblogs.com/oomusou/archive/2008/06/17/c_verilog_mental_thinking.html

參考書籍 1. 2.

Verilog 硬體描述語言實務 出版社:全華 作者:鄭光欽、周靜娟、黃孝祖、嚴培仁、吳明瑞 Verilog 硬體描述語言數位電路設計實務 出版社:儒林 作者:鄭信源

23th CYAC.Academic

Verilog HDL教學講義 1st Edition_23th CYAC.Academic.pdf ...

Verilog HDL教學講義 1st Edition_23th CYAC.Academic.pdf. Verilog HDL教學講義 1st Edition_23th CYAC.Academic.pdf. Open. Extract. Open with. Sign In.

3MB Sizes 15 Downloads 82 Views

Recommend Documents

verilog hdl samir palnitkar pdf
verilog hdl samir palnitkar pdf. verilog hdl samir palnitkar pdf. Open. Extract. Open with. Sign In. Main menu. There was a problem previewing this document.

Design through Verilog HDL by Padmanabhan.pdf
Page 2 of 3. المادة : الرياضيات. المستوى : الثالثة ثانوي إعدادي. زاوية مركزية. نشاط تمهيدي1 : في هذا الشكل الزاوية BÔAرأسها هومركز الدائرة (C). و [OA] Ù

pdf-0172\verilog-hdl-digital-design-and-modeling-by-joseph ...
There was a problem loading more pages. Retrying... pdf-0172\verilog-hdl-digital-design-and-modeling-by-joseph-cavanagh-2007-02-20-by-joseph-cavanagh.pdf. pdf-0172\verilog-hdl-digital-design-and-modeling-by-joseph-cavanagh-2007-02-20-by-joseph-cavana

design of hamming code using verilog hdl
and the receiver. As the name implies, ... transmitted to a receiver, which uses a suitable decoder to .... from the desktop and select 'New. Project' option under ...

PDF Advanced Digital Design with the Verilog HDL ...
computer engineering, and computer science.This book builds on the student's ... Computer Architecture- A Quantitave Approch · Microelectronic Circuits: ...