[RTLLM-p030] Control/Counter/up_down_counter
16 位元可加減計數器
題目說明
請設計一個名為 up_down_counter 的 16 位元同步加減計數器。
計數器會在每個 clk 上升沿,根據控制訊號 up_down 決定計數方向:
up_down = 1:向上計數
up_down = 0:向下計數
當 reset 為高電位時,計數器必須在下一個 clk 上升沿同步重置為:
count = 16'b0000_0000_0000_0000
由於 count 是 16 位元無號數,因此其數值範圍為:
0 到 65535
當向上計數超過 65535 時,計數器會自然回繞至 0。
當向下計數低於 0 時,計數器會自然回繞至 65535。
模組介面
| 埠 | 方向 | 位元寬度 | 說明 |
|---|---|---|---|
clk |
input | 1 | 時脈訊號 |
reset |
input | 1 | 高電位有效同步重置 |
up_down |
input | 1 | 計數方向控制訊號 |
count |
output reg | 16 | 目前的計數值 |
功能說明
同步重置
當:
reset = 1
時,計數器在下一個 clk 上升沿重置為:
count = 0
因為本題要求使用同步程序,因此 reset 不應加入 always 區塊的敏感度列表。
向上計數
當:
reset = 0
up_down = 1
時,在每個 clk 上升沿執行:
count = count + 1
例如:
0 → 1 → 2 → 3 → ... → 65535 → 0
向下計數
當:
reset = 0
up_down = 0
時,在每個 clk 上升沿執行:
count = count - 1
例如:
3 → 2 → 1 → 0 → 65535 → 65534
溢位與下溢行為
由於 count 是 16 位元暫存器,算術運算會自然依照模 65536 運作。
向上溢位
16'hFFFF + 1 = 16'h0000
也就是:
65535 + 1 → 0
向下溢位
16'h0000 - 1 = 16'hFFFF
也就是:
0 - 1 → 65535
不需要額外撰寫邊界判斷。
設計要求
- 模組名稱必須為
up_down_counter。 count必須是 16 位元暫存器。- 使用
clk上升沿更新計數器。 reset為高電位有效同步重置。- 當
reset = 1時,將count設為 0。 - 當
up_down = 1時,計數器加一。 - 當
up_down = 0時,計數器減一。 - 必須支援 16 位元自然溢位與下溢。
- 時序邏輯必須使用 nonblocking assignment。
程式設計模板
module up_down_counter (
input clk,
input reset,
input up_down,
output reg [15:0] count
);
// Write your code here
endmodule
評論