[RTLLM-p030] Control/Counter/up_down_counter


提交解答


分數: 5
時間限制: 2.0s
記憶體限制: 256M

作者:
題目代碼
題目類型
允許的語言
Verilog

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

評論

目前沒有評論。