Altifigence Academy

11 / 63 · 概念

解碼器、獨熱選擇與有效輸入

將二進位位址轉成個別選擇線,設計 enable、範圍與選擇不變量。

將位址轉成選擇線

NN 位元解碼器解碼器啟用與二進位碼對應的輸出線。若有 enable,可在未啟用時將所有輸出設為 0。根據輸入位址,從最多 2N2^N 個輸出中選出一個。具有 enable ee 的輸出 did_i 可定義如下。

di=e∧(a=i)d_i=e\land(a=i)

2-to-4 解碼器中,d0=ea‾1a‾0d_0=e\overline a_1\overline a_0、d1=ea‾1a0d_1=e\overline a_1a_0、d2=ea1a‾0d_2=ea_1\overline a_0、d3=ea1a0d_3=ea_1a_0。enable=0 時所有輸出為 0;enable=1 時恰有一個為 1。

enable=1 時改變位址 a1a0,d0~d3 中只會亮起一個。再將 enable 改成 0,確認所有選擇線都關閉。

從位址到獨熱選擇線

d[i] = enable AND (2 × a1 + a0 = i)

預設值讓功能定義完整

SystemVerilog
module decoder2 (
  input logic en,
  input logic [1:0] addr,
  output logic [3:0] select
);
  always_comb begin
    select = 4'b0000;
    if (en) begin
      case (addr)
        2'd0: select = 4'b0001;
        2'd1: select = 4'b0010;
        2'd2: select = 4'b0100;
        2'd3: select = 4'b1000;
        default: select = 4'b0000;
      endcase
    end
  end
endmodule

開頭的預設指定涵蓋所有執行路徑,避免記住前次輸出。光是加上 always_comb 名稱,不會自動把未定義分支變成正確電路。

輸出數量不是 2 的次方時

選擇 10 個裝置需要 4 位元位址,但 10~15 是無效代碼。此時必須指定策略,例如所有輸出為 0、錯誤旗標為 1。不能只因代碼未使用,就允許任意輸出。

驗證除了輸入與輸出的對應,也要檢查是否有多條選擇線同時開啟、disable 時是否全關閉。這些不變量不變量是在所有允許的執行過程中都必須成立的條件。例如,深度為 4 的 FIFO,其儲存數量必須一直介於 0 至 4。 詳細內容在記憶體 write enable 或匯流排選擇電路中特別重要。解碼器越大,位址訊號扇出與配線負載也越大,因此會考慮階層式解碼。

自己試試看

設計具有 10 個輸出的位址解碼器。請決定位址寬度、無效輸入數量,以及 en=0 時必須滿足的條件。

查看解說

位址需要 ⌈log⁡210⌉=4\lceil\log_2 10\rceil=4 位元,無效代碼有 6 個。en=0 時,不論位址為何,所有選擇線都必須為 0。對無效位址也可指定全部為 0,另外顯示錯誤。

此選擇適用於本瀏覽器,隨時可從頁尾變更。