16 / 37 · 概念
模數、飽和計數器與結束脈衝
設計最大值處理策略與 terminal-count 訊號的確切週期。
單元可免費閱讀,註冊課程即可儲存學習進度。
超出範圍的三種策略不同
同樣的 N 位元暫存器暫存器儲存多個位元的狀態。本課程中的同步暫存器會在時脈邊緣儲存指定的輸入。 詳細內容,到最大值後是回捲、保持最大值,還是回報錯誤,都由規格決定。
8 位元模數計數器在 255 之後變成 0,飽和計數器則保持 255,兩者功能不同。需要正負值的累加器,還須考慮 signed 範圍及兩側飽和邊界。
每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
初始 count=8、reset=0、enable=1。相同輸入下,modulo-10、4 位元回捲與 4 位元飽和會產生不同軌跡。
查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| 邊緣 | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| mod10 後 | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| wrap4 後 | 234523452 | 9 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1 |
| sat4 後 | 2345234.. | 9 → 10 → 11 → 12 → 13 → 14 → 15 |
比較 modulo-M 的最後狀態
若希望每十次輸出脈衝,使用狀態 0~9,只計入 enable 有效的邊緣。可將 pulse 暫存為「此邊緣消耗 9 並返回 0」的事件。
always_ff @(posedge clk) begin
if (rst) begin
count <= 4'd0;
pulse <= 1'b0;
end else begin
pulse <= 1'b0;
if (en) begin
if (count == 4'd9) begin
count <= 4'd0;
pulse <= 1'b1;
end else count <= count + 4'd1;
end
end
endpulse 有預設指定,因此下一邊緣會返回 0。若只輸出 count==9,enable=0 停住時可能連續數週期為 1。必須區分結束狀態與完成事件。
週期的計數起點
reset 後從 count=0 開始,必須經過十個 enable=1 的邊緣才產生第一個 pulse。與其爭論第一個邊緣叫第 0 還是第 1,更重要的是一致使用輸入、狀態與輸出表的定義。
此互動練習是 modulo-16 計數器。初始 1110 經一個邊緣為 1111,再一個為 0000。試著在 1111 時設 enable=0 暫停。保持與飽和雖然看起來同值,恢復執行後卻不同。比較同條件下飽和計數器應得到什麼值。
同步 reset 優先於 enable。enable=0 時,保持已儲存的值。 q=1110; q_next = (q + 1) mod 16
自己試試看
上述電路在 count=9、pulse=0 時,經過兩個 en=0 邊緣,再經過 en=1 邊緣,count 與 pulse 如何變化?
查看解說
暫停的兩個邊緣保持 count=9、pulse=0。第三個邊緣成為 count=0、pulse=1,下一邊緣則由預設指定使 pulse=0。