[RTLLM-p029] Control/Counter/ring_counter
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
評論