[RTLLM-p029] Control/Counter/ring_counter


提交解答


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

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

8 位元環形計數器

題目說明

請設計一個名為 ring_counter 的 8 位元環形計數器。

環形計數器在任意時刻只有一個輸出位元為 1,其餘位元皆為 0。在每個時脈上升沿,數值 1 向較高位元移動一個位置。

狀態變化如下:

0000_0001
0000_0010
0000_0100
0000_1000
0001_0000
0010_0000
0100_0000
1000_0000
0000_0001
...

1 移動到最高位元 out[7] 後,下一個時脈週期必須回到最低位元 out[0],形成循環序列。


模組介面

方向 位元寬度 說明
clk input 1 時脈訊號
reset input 1 高電位有效重置訊號
out output reg 8 環形計數器目前狀態

Reset 行為

當:

reset = 1

時,計數器必須初始化為:

out = 8'b0000_0001

也就是只有最低位元 out[0]1

本題採用高電位有效非同步重置,因此只要 reset 變為高電位,輸出就會立即回到初始狀態,不需要等待下一個時脈上升沿。


狀態轉移

reset = 0 時,每個 clk 上升沿執行一次循環左移:

out <= {out[6:0], out[7]};

位元對應關係如下:

新 out[7] = 舊 out[6]
新 out[6] = 舊 out[5]
新 out[5] = 舊 out[4]
新 out[4] = 舊 out[3]
新 out[3] = 舊 out[2]
新 out[2] = 舊 out[1]
新 out[1] = 舊 out[0]
新 out[0] = 舊 out[7]

因此:

0000_0001 → 0000_0010

而:

1000_0000 → 0000_0001

設計要求

  • 模組名稱必須為 ring_counter
  • out 必須為 8 位元暫存器。
  • 任意正常狀態下只能有一個位元為 1
  • reset 為高電位有效。
  • Reset 時將 out 設為 8'b0000_0001
  • 每個 clk 上升沿將 1 移動到下一個較高位元。
  • 1 到達 out[7] 後,下一個狀態必須回到 out[0]
  • 必須使用 nonblocking assignment 描述循序邏輯。

程式設計模板

module ring_counter (
    input            clk,
    input            reset,
    output reg [7:0] out
);

    // Write your code here

endmodule

評論

目前沒有評論。