5 min read

數字電路毛刺濾波器設計與實現

數字電路毛刺濾波器設計與實現
Photo by Florian Olivo / Unsplash

數字電路毛刺濾波器設計與實現

前言

在數位電路設計中,信號毛刺(Glitch)是一個常見的問題,常見於按鍵去彈跳、外部信號輸入處理、需要穩定信號的控制系統、數位電路中的雜訊處理等。本文將介紹一個使用Verilog實現的毛刺濾波器設計,該濾波器可以有效過濾掉輸入信號中的短暫毛刺,提高系統的穩定性。

專案架構

RTL代碼實現

以下是完整的Verilog RTL代碼:

module glitch_filter (
    input clk,      // 系統時脈輸入
    input nRst,     // 低電位有效的重置信號
    input iSignal,  // 需要進行濾波的輸入信號
    output oSignal  // 經過濾波處理後的輸出信號
);

// 內部信號定義
reg [31:0] rvShiftSignal_d, rvShiftSignal_q;  // 32位移位暫存器,用於儲存信號歷史
reg rSignal_d, rSignal_q;                      // 輸出信號的組合邏輯和時序邏輯暫存器

// 第一個時序邏輯區塊:移位暫存器的時序控制
always @(posedge clk or negedge nRst) begin
    if(!nRst)
        rvShiftSignal_q <= 32'hFFFFFFFF;  // 重置時設定為全1狀態
    else
        rvShiftSignal_q <= rvShiftSignal_d;  // 正常工作時更新移位暫存器
end

// 第一個組合邏輯區塊:移位操作
always @(*) begin
    rvShiftSignal_d = {rvShiftSignal_q[30:0], iSignal};  // 每個時脈週期將輸入信號移入最低位
end

// 第二個時序邏輯區塊:輸出信號的時序控制
always @(posedge clk or negedge nRst) begin
    if(!nRst)
        rSignal_q <= 1'b1;  // 重置時輸出信號設定為1
    else
        rSignal_q <= rSignal_d;  // 正常工作時更新輸出信號
end

// 第二個組合邏輯區塊:輸出信號的邏輯判斷
always @(*) begin
    if(rvShiftSignal_q == 32'hFFFFFFFF)    // 如果移位暫存器中全是1
        rSignal_d = 1'b1;                   // 輸出設定為1
    else if(rvShiftSignal_q == 32'h0)      // 如果移位暫存器中全是0
        rSignal_d = 1'b0;                   // 輸出設定為0
    else
        rSignal_d = rSignal_q;             // 其他情況保持原狀態
end

assign oSignal = rSignal_q;  // 將內部信號連接到輸出端

endmodule

技術要點說明

1. 移位暫存器機制

  • 使用32位移位暫存器記錄輸入信號的歷史狀態
  • 每個時脈週期,新的輸入信號被移入暫存器的最低位
  • 這樣可以觀察信號在32個時脈週期內的變化

2. 濾波邏輯設計

  • 只有當移位暫存器中的所有位元都為1時,輸出才會變為1
  • 只有當移位暫存器中的所有位元都為0時,輸出才會變為0
  • 其他情況下保持原有輸出狀態不變

3. 重置機制實現

  • 當重置信號(nRst)為低電位時:
    • 移位暫存器被設定為全1(32'hFFFFFFFF)
    • 輸出信號被設定為1

應用場景

該毛刺濾波器適用於以下場景:

  1. 按鍵去彈跳
  2. 外部信號輸入處理
  3. 需要穩定信號的控制系統
  4. 數位電路中的雜訊處理

改進建議

1. 可配置的濾波寬度

module glitch_filter #(
    parameter WIDTH = 32  // 可配置的移位暫存器寬度
)(
    input clk,
    input nRst,
    input iSignal,
    output oSignal
);
    reg [WIDTH-1:0] rvShiftSignal_d, rvShiftSignal_q;
    // ... 其餘代碼相同
endmodule

注意事項

  1. 濾波器的延遲時間與移位暫存器的位元數相關,本設計中為32個時脈週期
  2. 需要根據實際應用場景調整移位暫存器的位元數
  3. 時脈頻率的選擇需要考慮實際信號的特性

模擬結果

波形模擬

digital_filter.png

上圖為使用ModelSim進行的波形模擬結果,從上到下依序為:

  • clk:系統時脈信號
  • nRst:重置信號
  • iSignal:輸入信號(包含毛刺)
  • oSignal:濾波後的輸出信號

模擬情境說明

  1. 毛刺濾除測試

    • 輸入信號(iSignal)包含多個短暫的毛刺(小於32個時脈週期)
    • 輸出信號(oSignal)保持穩定,成功濾除這些毛刺
    • 實測結果顯示,寬度小於32個時脈週期的毛刺都被有效濾除
  2. 正常信號響應

    • 當輸入信號保持穩定超過32個時脈週期
    • 輸出信號才會跟隨變化
    • 驗證了設計的穩定性要求
  3. 重置功能驗證

    • 重置信號(nRst)觸發時
    • 輸出立即回到預設狀態(高電位)
    • 移位暫存器正確清除為全1

關鍵性能指標

  1. 延遲特性

    • 信號變化延遲:32個時脈週期
    • 重置響應時間:1個時脈週期
  2. 資源使用

    • 使用32位元移位暫存器
    • 簡單的組合邏輯電路
    • 整體資源使用率低

結語

這個毛刺濾波器設計簡單但效果顯著,通過移位暫存器和狀態機制實現了對輸入信號的有效濾波。在實際應用中,可以根據具體需求調整參數,使其更好地適應不同的應用場景。完整的程式碼實現和詳細的註解,有助於理解數字電路設計中的濾波器實現方法。