2025-10-14 12:49:57 赛季特刊

Verilog 硬體描述語言:從基礎到實戰,掌握數位電路設計

By 佐川 直弘 | Naohiro Sagawa (運営者) ※記事内に広告を含みます。Amazonアソシエイトとして適格販売により収入を得ています。 目次 1 1. Verilog 是什麼?其概述與用途1.1 Verilog 的基本定義1.2 Verilog 在數位電路設計中的角色1.3 本文學習內容與目標讀者2 2. Verilog 的基本語法與概念2.1 Verilog 的基本語法與機制2.1.1 模組(module)的定義與使用方法2.1.2 資料型別種類與選擇(wire, reg 的區別使用)2.2 控制結構(if, case)與模擬時的注意事項2.2.1 if 語句的使用方法2.2.2 case 語句的使用方法2.3 初學者應知的基礎概念2.3.1 阻塞式賦值與非阻塞式賦值的區別2.3.2 平行處理的思維與描述方法2.3.3 模擬與合成的區別3 3. Verilog 的主要功能與特色3.1 Verilog 的特色與其他 HDL 的區別3.1.1 Verilog 的優勢3.1.2 與 VHDL 和 SystemVerilog 的比較3.2 Verilog 的具體應用範例3.2.1 Verilog 在 FPGA 設計中的作用3.2.2 電路模擬的流程4 4. 使用 Verilog 的實際設計範例4.1 透過 Verilog 範例程式碼學習4.1.1 計數器設計範例(附程式碼解說)4.1.2 狀態轉換電路(FSM)的描述與應用範例4.1.3 簡單加法器設計(初學者步驟)4.2 常見問題及其解決方法4.2.1 常見錯誤範例(模擬時・合成時)4.2.2 除錯工具的活用法5 5. 學習 Verilog 的資源與工具5.1 推薦的 Verilog 學習資源5.1.1 初學者推薦書籍與線上教學5.1.2 影片課程與實踐教材介紹5.2 支援開發的工具5.2.1 模擬與合成工具(ModelSim、Vivado 等)5.2.2 合成工具的選擇與導入方法6 6. 關於 Verilog 的常見問題 (FAQ)6.1 Verilog 初學者的學習方法?6.1.1 問題: 我剛開始學習 Verilog,應該如何進一步學習?6.1.2 回答:6.2 應該選擇 VHDL 還是 Verilog?6.2.1 問題: 應該學習 VHDL 還是 Verilog?在哪些情境下會區別使用?6.2.2 回答:6.3 初學者應避免的錯誤是什麼?6.3.1 問題: 初學者在學習 Verilog 時常犯的錯誤是什麼?如何避免?6.3.2 回答:7 7. 學習 Verilog 邁向下一步7.1 Verilog 學習回顧與下一步準備7.1.1 回顧7.1.2 下一步準備7.2 進入 FPGA 設計領域7.2.1 學習 FPGA 基礎7.3 轉向 SystemVerilog7.3.1 學習 SystemVerilog 的原因7.3.2 應學習的主題7.4 參與實際專案7.4.1 參與開源專案7.4.2 啟動原創專案7.5 下一步學習建議7.5.1 學習進階設計技能1. Verilog 是什麼?其概述與用途Verilog 的基本定義Verilog(或稱 Verilog HDL)是一種用於設計數位電路的硬體描述語言(HDL)。如果說軟體程式語言是用來描述電腦程式,那麼 Verilog 則是專門用於描述數位電路或系統的行為。透過使用 Verilog,可以簡化複雜的電路設計過程,並協助設計人員有效率地進行電路模擬與合成(將電路轉換為可製造的形式)。

Verilog 於 1984 年開發,並於 1995 年由 IEEE(電機電子工程師學會)標準化。其後持續發展,現今已廣泛應用於 FPGA(Field-Programmable Gate Array,現場可程式化邏輯閘陣列)和 ASIC(Application-Specific Integrated Circuit,特殊應用積體電路)的設計中。

Verilog 在數位電路設計中的角色數位電路設計是建構利用電氣訊號處理資訊的系統的過程。例如,智慧型手機或電腦內部運作的處理器和記憶體就是其中一例。Verilog 作為一種工具,被用於提高這類數位系統設計的效率。

具體來說,Verilog 用於以下場景:

FPGA 設計: FPGA 是一種電路設計靈活性高的元件。使用 Verilog 可以自由定義 FPGA 的功能,並將其作為可重複程式設計的設備使用。ASIC 設計: ASIC 是專門用於特定目的的積體電路。透過 Verilog 可以設計客製化的 IC。模擬 (Simulation): 使用 Verilog 描述的電路可以在軟體上進行模擬,以預先驗證其功能是否正確。這有助於早期發現和修正設計錯誤。本文學習內容與目標讀者本文旨在為初次學習 Verilog 或想複習基礎知識的讀者,分階段講解以下內容:

Verilog 的基本語法與設計基礎實用的設計範例與除錯方法有助於學習的資源與工具介紹目標讀者包含以下人士:

剛開始學習 Verilog 或 HDL 的初學者準備開始 FPGA 或 ASIC 設計的工程師想複習基礎知識的設計人員或學生 2. Verilog 的基本語法與概念Verilog 的基本語法與機制模組(module)的定義與使用方法在開始 Verilog 設計時,最基本的單位是「模組(module)」。模組代表電路的組成要素,用於描述輸入/輸出和內部結構。以下是一個簡單的模組範例:

module AND_gate (

input wire a, // 入力a (輸入 a)

input wire b, // 入力b (輸入 b)

output wire y // 出力y (輸出 y)

);

assign y = a & b; // AND演算 (AND 運算)

endmodule這段程式碼描述了一個將兩個輸入訊號(a 和 b)進行 AND 運算,並將結果連接到輸出(y)的電路。使用關鍵字 module 定義模組,並使用 endmodule 結束。

資料型別種類與選擇(wire, reg 的區別使用)Verilog 的資料型別主要有以下兩種:

wire: 代表導線,用於連接訊號。reg: 代表暫存器 (register),用於同步於時脈訊號保持數值。例如,以下程式碼展示了 wire 和 reg 的區別使用:

module Example (

input wire clk, // クロック入力 (時脈輸入)

input wire rst, // リセット入力 (重置輸入)

input wire a, // 入力a (輸入 a)

output reg y // 出力y (輸出 y)

);

always @(posedge clk or posedge rst) begin

if (rst)

y <= 0; // リセット時、出力を0に (重置時,將輸出設為 0)

else

y <= a; // クロック時、入力aを出力yに代入 (時脈上升沿時,將輸入 a 賦值給輸出 y)

end

endmodule在此例中,輸出 y 根據時脈訊號 clk 變化。reg 型別用於保持數值,並在 always 區塊中使用。

控制結構(if, case)與模擬時的注意事項if 語句的使用方法在 Verilog 中,描述條件分支時使用 if 語句。以下是一個基本的 if 語句範例:

always @(posedge clk) begin

if (a == 1'b1)

y <= 1'b0; // aが1の場合、yを0に設定 (如果 a 是 1,則將 y 設為 0)

else

y <= 1'b1; // それ以外の場合、yを1に設定 (否則,將 y 設為 1)

endif 語句在根據電路條件改變行為時非常方便。

case 語句的使用方法當需要處理多個條件分支時,使用 case 語句會更有效率。以下是一個表示狀態轉換的範例:

always @(state) begin

case (state)

2'b00: y = 1'b0;

2'b01: y = 1'b1;

2'b10: y = 1'b0;

2'b11: y = 1'b1;

default: y = 1'bx; // 不明な状態 (未知狀態)

endcase

end在此例中,輸出 y 根據狀態 state 變化。使用 case 語句可以使程式碼更易讀。

初學者應知的基礎概念阻塞式賦值與非阻塞式賦值的區別Verilog 中有兩種賦值方式:

阻塞式賦值(=): 一系列處理依序執行。非阻塞式賦值(<=): 數值平行更新。例如,請看以下程式碼:

always @(posedge clk) begin

a = b; // ブロッキング代入 (阻塞式賦值)

c <= d; // ノンブロッキング代入 (非阻塞式賦值)

end阻塞式賦值的行為類似軟體程式的依序執行。另一方面,非阻塞式賦值用於準確描述平行運作的硬體。特別是在 always 區塊中,通常建議使用非阻塞式賦值。

平行處理的思維與描述方法Verilog 支援描述可以平行運作的硬體。以下範例中,兩個 always 區塊獨立運作:

always @(posedge clk) begin

a <= b + 1;

end

always @(posedge clk) begin

c <= d - 1;

end像這樣,每個 always 區塊都執行獨立的程序,可以描述接近實際硬體電路的行為。

模擬與合成的區別模擬 (Simulation): 在軟體上驗證設計好的電路是否如預期運作的過程。合成 (Synthesis): 將設計轉換為實際硬體的過程。在 Verilog 中,用於模擬的程式碼(例如 initial 區塊)不會用於合成。因此,將可合成的程式碼與用於模擬的程式碼明確分開是非常重要的。

3. Verilog 的主要功能與特色Verilog 的特色與其他 HDL 的區別Verilog 的優勢與其他硬體描述語言(HDL)相比,Verilog 具有以下優勢:

簡單的語法Verilog 語法類似 C 語言,對於有程式設計經驗的工程師來說較易學習。模組、資料型別、運算子等基本語法直觀,對初學者友善。廣泛的支援Verilog 是 FPGA 和 ASIC 設計工具(如 Vivado、ModelSim 等)的標準支援語言。豐富的學習資源和社群存在,對初學者學習有很大幫助。高靈活性的設計方法以 RTL(Register Transfer Level,暫存器傳輸層級)設計為核心,支援從低層級到高層級的廣泛設計方法。與 VHDL 和 SystemVerilog 的比較讓我們看看 Verilog 與其他 HDL,特別是 VHDL 和 SystemVerilog 有哪些區別。

語言 (Language)特色 (Features)應用範例 (Application Examples)Verilog簡潔的語法,學習成本較低。廣泛用於 FPGA/ASIC 設計。高速原型開發,FPGA 設計VHDL語法嚴謹,可進行穩固的設計。易於描述複雜的規格。關鍵任務系統設計SystemVerilogVerilog 的擴充版。支援進階的測試平台和基於類的設計。進階測試平台建立,系統設計與 VHDL 的區別: VHDL 語法嚴謹,較能避免錯誤發生,但 Verilog 簡單且程式碼量較少,效率較高。與 SystemVerilog 的區別: SystemVerilog 是 Verilog 的上位相容,增加了進階的驗證工具和物件導向程式設計功能。初學者開始數位設計時,通常會選擇語法較為簡潔的 Verilog。

Verilog 的具體應用範例Verilog 在 FPGA 設計中的作用FPGA 是一種使用者可程式設計的積體電路。透過使用 Verilog,可以輕鬆設計複雜的邏輯電路。以下是 Verilog 在 FPGA 設計中的作用:

原型開發 (Prototyping)用於產品開發初期驗證電路功能。使用 Verilog 可以快速試作設計,並靈活應對規格變更。功能驗證 (Functional Verification)在 FPGA 設計中,使用 Verilog 進行模擬,以早期發現設計錯誤。在模擬工具(例如:ModelSim)中建立測試平台 (testbench),驗證電路的功能。電路模擬的流程使用 Verilog 進行模擬的基本流程如下:

電路描述使用 Verilog 描述目標設計的電路。建立測試平台 (Testbench)測試平台用於定義驗證設計電路功能的環境。以下是一個簡單測試平台的範例:module Testbench;

reg a, b;

wire y;

// テスト対象のモジュールをインスタンス化 (例化測試目標模組)

AND_gate uut (

.a(a),

.b(b),

.y(y)

);

initial begin

// テストパターンの適用 (套用測試 pattern)

a = 0; b = 0;

#10; a = 0; b = 1;

#10; a = 1; b = 0;

#10; a = 1; b = 1;

#10;

end

endmodule執行模擬在模擬器中執行測試平台,確認電路功能是否如預期。結果分析分析模擬結果,找出設計中的問題。 4. 使用 Verilog 的實際設計範例透過 Verilog 範例程式碼學習計數器設計範例(附程式碼解說)計數器是數位電路設計中基本且重要的元件。以下是根據時脈訊號增加數值的計數器範例:

module Counter (

input wire clk, // クロック入力 (時脈輸入)

input wire rst, // リセット入力 (重置輸入)

output reg [3:0] count // 4ビットのカウンタ出力 (4位元計數器輸出)

);

always @(posedge clk or posedge rst) begin

if (rst)

count <= 4'b0000; // リセット時にカウンタを0にする (重置時,將計數器歸零)

else

count <= count + 1; // クロックが立ち上がるたびにカウンタをインクリメント (時脈上升沿時,計數器遞增)

end

endmodule解說:

clk 是時脈訊號,用於控制電路的時序。rst 是重置訊號,用於計數器的初始化。計數器的數值為 4 位元(0~15),並在時脈訊號的上升沿同步增加。狀態轉換電路(FSM)的描述與應用範例FSM(Finite State Machine,有限狀態機)用於設計具有多個狀態的電路。以下是具有三種狀態的 FSM 設計範例:

module FSM (

input wire clk, // クロック入力 (時脈輸入)

input wire rst, // リセット入力 (重置輸入)

input wire in, // 状態遷移のトリガー (狀態轉換的觸發)

output reg [1:0] state // 現在の状態 (目前狀態)

);

// 状態定義 (狀態定義)

localparam STATE0 = 2'b00,

STATE1 = 2'b01,

STATE2 = 2'b10;

always @(posedge clk or posedge rst) begin

if (rst)

state <= STATE0; // 初期状態 (初始狀態)

else begin

case (state)

STATE0: state <= (in) ? STATE1 : STATE0;

STATE1: state <= (in) ? STATE2 : STATE0;

STATE2: state <= (in) ? STATE0 : STATE1;

default: state <= STATE0;

endcase

end

end

endmodule解說:

使用 localparam 定義狀態。使用 case 語句根據輸入 in 進行狀態轉換。這個設計範例可以應用於例如簡單的控制系統或訊號產生電路。簡單加法器設計(初學者步驟)接下來,設計一個簡單的 2 位元加法器:

module Adder (

input wire [1:0] a, // 2ビットの入力a (2位元輸入 a)

input wire [1:0] b, // 2ビットの入力b (2位元輸入 b)

output wire [2:0] sum // 3ビットの出力(最大値が3ビットになるため)(3位元輸出(因為最大值為 3 位元))

);

assign sum = a + b; // 加算処理 (加法運算)

endmodule解說:

使用 assign 語句進行加法。輸出設定為 3 位元,考慮到進位。這類加法器是運算處理電路的基礎,非常重要。常見問題及其解決方法常見錯誤範例(模擬時・合成時)模擬時的錯誤錯誤範例: 訊號為未定義值(x)。原因: 初始化不足,或模組連接錯誤。解決方案: 明確定義輸入訊號或初始狀態,或在測試平台中進行初始化。合成時的錯誤錯誤範例: 不可合成的語法(例如:initial 區塊)。原因: 使用了合成工具不支援的描述。解決方案: 使用可合成的語法(例如:always 區塊)。除錯工具的活用法在 Verilog 設計中,除錯非常重要。以下是常用的除錯工具及其使用方法:

模擬器(例如:ModelSim)Verilog 模擬的經典工具。用於確認訊號的行為和波形。特色介面友善,初學者易於上手。波形檢視器直觀,非常適合除錯。波形檢視器 (Waveform Viewer)視覺化確認輸入和輸出訊號的變化,找出設計問題。除錯訊息 (Debug Messages)使用 display 語句輸出除錯資訊,確認訊號的數值或狀態: initial begin

$display("Initial state: %b", state); // 輸出除錯資訊

end

5. 學習 Verilog 的資源與工具推薦的 Verilog 學習資源初學者推薦書籍與線上教學對於初次學習 Verilog 的人來說,使用可靠的教材非常重要。以下是推薦給初學者的資源:

書籍《HDL によるデジタル設計入門》這是一本經典的日文書籍,透過比較 Verilog 和 VHDL 的基本概念來學習。《Verilog HDL: A Guide to Digital Design and Synthesis》雖然是英文書,但內容從基礎到實踐,結構完整,是一本優秀的書籍。《Digital Design and Verilog HDL Fundamentals》針對初學者到中級程度的讀者,詳細解說使用 Verilog 進行數位電路設計。線上教學 (Online Tutorials)YouTube提供許多免費的日語和英語教學影片。可以直接操作程式碼來學習,這是一大優點。例如:「Verilog 入門」、「FPGA 設計的基本」等系列影片。網站EDA Playground: 一個可以在瀏覽器上測試 Verilog 程式碼的線上環境。ASIC World: 可以學習 Verilog 的基本語法到實用的設計範例。影片課程與實踐教材介紹Udemy提供「Verilog for Beginners」和「學習 FPGA 設計」等課程,透過影片和實作來學習。雖然需要付費,但內容豐富,適合初學者系統性地學習。Coursera提供專注於硬體設計的大學程度線上課程。可以從基礎學習到進階設計。支援開發的工具模擬與合成工具(ModelSim、Vivado 等)ModelSim是 Verilog 模擬的經典工具。用於確認訊號的行為和波形。特色介面易於使用,即使是初學者也能輕鬆上手。波形檢視器直觀,非常適合除錯。VivadoXilinx 提供的 FPGA 設計工具,支援使用 Verilog 進行設計。特色整合支援 RTL 設計、模擬、合成到實現。與 FPGA 開發板(例如:Zynq、Artix 等)連結順暢。合成工具的選擇與導入方法Quartus PrimeIntel 製造的 FPGA 開發工具。針對初學者提供免費版本。優點工具內可以視覺化電路圖。與 Cyclone 系列的 FPGA 連結簡單。ISE Design Suite用於較舊的 Xilinx FPGA 的工具,也適合教育機構使用。優點非常適合使用學習板(例如:Basys 2)進行設計。 6. 關於 Verilog 的常見問題 (FAQ)Verilog 初學者的學習方法?問題: 我剛開始學習 Verilog,應該如何進一步學習?回答:從基礎開始:先從簡單的電路(例如:AND 閘、OR 閘)設計開始。理解基本語法和模組的使用方法非常重要。善用模擬工具:使用 ModelSim 或 Vivado 等工具確認編寫的程式碼是否如預期運作。透過實際進行模擬,可以加深理解。利用可靠的資源:建議利用書籍或線上教學,系統性地學習(請參閱「5. 學習 Verilog 的資源與工具」)。挑戰專案:學習基礎後,可以嘗試簡單的專案(例如:4 位元計數器或 FSM),培養實踐技能。應該選擇 VHDL 還是 Verilog?問題: 應該學習 VHDL 還是 Verilog?在哪些情境下會區別使用?回答:選擇 Verilog 的情況:Verilog 語法簡單,對於初學者或有 C 語言經驗的人來說較易學習。廣泛用於原型開發和 FPGA 設計。選擇 VHDL 的情況:適用於關鍵任務系統或需要大型且嚴謹設計的情況。嚴謹的型別檢查和語法在防止設計錯誤方面具有優勢。選擇標準:學習難易度: 初學者最適合 Verilog。專案需求: 根據專案使用的語言選擇。工具支援: 大多數工具都支援這兩種語言,但建議根據設計目標(FPGA 或 ASIC)選擇最適合的語言。初學者應避免的錯誤是什麼?問題: 初學者在學習 Verilog 時常犯的錯誤是什麼?如何避免?回答:初始化不足:模擬時訊號常常變為 x(未定義值)。對策: 務必設定初始值,或在測試平台中進行初始化。 initial begin

signal = 0; // 訊號初始化

end混淆阻塞式與非阻塞式賦值:混淆 =(阻塞式賦值)和 <=(非阻塞式賦值)可能導致結果不如預期。對策: 在時脈同步的 always 區塊中,使用非阻塞式賦值(<=)。混淆可合成程式碼與模擬用程式碼:將僅用於模擬的描述(例如 initial 區塊)包含在可合成程式碼中會導致錯誤。對策: 明確區分可合成程式碼與僅用於模擬的程式碼。對平行處理理解不足:Verilog 用於描述平行運作的電路,容易與軟體的依序處理混淆。對策: 學習平行處理的基本概念,並意識到多個 always 區塊是獨立運作的。 7. 學習 Verilog 邁向下一步Verilog 學習回顧與下一步準備回顧理解基本語法: 確認是否已能描述模組、資料型別和控制結構。掌握實踐範例: 透過計數器和 FSM 設計,是否已能建構基本的數位電路,這一點很重要。善用工具: 確認是否已掌握使用 ModelSim 或 Vivado 等工具進行模擬和除錯的基本操作。下一步準備如果目前已理解基礎,就代表已準備好進入更進階的主題。按照以下步驟,獲取新的技能和知識。進入 FPGA 設計領域學習 FPGA 基礎FPGA(Field-Programmable Gate Array)是應用 Verilog 技能的理想平台。FPGA 是一種可程式設計的硬體,可以應對各種設計需求。

準備 FPGA 開發板初學者推薦開發板: 建議使用 Digilent 公司的 Basys 3 或 Nexys A7。原因: 教材資源豐富,且可以輕鬆與 Vivado 等工具連結。挑戰基礎專案從 LED 閃爍、按鈕控制等簡單專案開始。透過時脈分頻電路和多輸入控制,學習 FPGA 設計的基礎。挑戰複雜系統嘗試設計整合多個 FSM 的控制系統或記憶體介面,擴展技能。轉向 SystemVerilog學習 SystemVerilog 的原因SystemVerilog 作為 Verilog 的擴充版而設計,支援進階的驗證功能和物件導向的描述。特別是在測試平台建立和大型系統設計中發揮強大作用。應學習的主題基於類的測試平台 (Class-based Testbenches)使用 SystemVerilog 可以進行隨機測試和覆蓋率分析。介面的活用 (Utilization of Interfaces)可以簡潔地描述複雜的模組間通訊。擴充的控制結構 (Extended Control Structures)學習 unique 和 priority 等提高設計安全性的關鍵字。參與實際專案參與開源專案參與 GitHub 等平台上公開的開源數位設計專案,可以累積實踐經驗。例如:

RISC-V 處理器設計簡易 DSP(數位訊號處理)模組啟動原創專案嘗試在感興趣的領域進行原創數位設計。例如:數位時鐘、音訊處理器、訊號濾波電路等。下一步學習建議學習進階設計技能流水線設計 (Pipeline Design)學習高速處理器和訊號處理電路中使用的流水線設計基礎。時脈域理解 (Understanding Clock Domains)學習如何在不同時脈速度的模組之間正確傳遞訊號。低功耗設計 (Low-Power Design)導入考慮電力效率的設計方法,以獲得更實用的技能。

提示信息
日本队公布世界杯26人大名单:久保建英富安健洋领衔 39岁门将入选
top