[RTLLM-p028] Control/Counter/JC_counter
64 位元 Johnson Counter
題目說明
請設計一個名為 JC_counter 的 64 位元 Johnson Counter。
Johnson Counter 也稱為:
Twisted Ring Counter
其工作方式類似移位暫存器,但每次移位時,會將最低位元 Q[0] 反相後送入最高位元 Q[63]。
4 位元 Johnson Counter 的狀態序列如下:
0000
1000
1100
1110
1111
0111
0011
0001
0000
同樣地,64 位元 Johnson Counter 從全零狀態開始時,會先逐步從最高位元填入 1:
000...000
100...000
110...000
111...000
...
111...111
當所有位元都變成 1 之後,最高位元開始逐步填入 0:
011...111
001...111
000...111
...
000...001
000...000
因此,一個 64 位元 Johnson Counter 共有:
2 × 64 = 128
個不同狀態。
模組介面
| 埠 | 方向 | 位元寬度 | 說明 |
|---|---|---|---|
clk |
input | 1 | 時脈訊號 |
rst_n |
input | 1 | 低電位有效非同步重置 |
Q |
output reg | 64 | Johnson Counter 目前狀態 |
狀態更新規則
在每個 clk 上升沿,將目前的 Q[63:1] 向低位移動,並根據 Q[0] 決定新的最高位元。
當 Q[0] = 0
新的最高位元為 1:
Q_next = {1'b1, Q[63:1]}
當 Q[0] = 1
新的最高位元為 0:
Q_next = {1'b0, Q[63:1]}
上述兩種情況可合併為:
Q_next = {~Q[0], Q[63:1]}
Reset 行為
當:
rst_n = 0
時,無論時脈狀態為何,必須立即將計數器清為:
Q = 64'b0
因此 rst_n 是低電位有效非同步重置訊號。
64 位元狀態範例
重置後:
Q = 0000000000000000000000000000000000000000000000000000000000000000
第一個時脈上升沿:
Q = 1000000000000000000000000000000000000000000000000000000000000000
第二個時脈上升沿:
Q = 1100000000000000000000000000000000000000000000000000000000000000
第三個時脈上升沿:
Q = 1110000000000000000000000000000000000000000000000000000000000000
經過 64 個有效時脈上升沿後:
Q = 1111111111111111111111111111111111111111111111111111111111111111
再經過一個時脈上升沿後:
Q = 0111111111111111111111111111111111111111111111111111111111111111
經過完整的 128 個時脈週期後,計數器回到:
Q = 0000000000000000000000000000000000000000000000000000000000000000
設計要求
- 模組名稱必須為
JC_counter。 Q必須為 64 位元暫存器。rst_n為低電位有效非同步重置。- Reset 時將
Q設為全零。 - 在每個
clk上升沿更新狀態。 - 將
Q[63:1]向低位移動一位。 - 將
Q[0]的反相值送入Q[63]。 - 必須使用 nonblocking assignment。
- 完整狀態週期應為 128 個時脈週期。
程式設計模板
module JC_counter (
input clk,
input rst_n,
output reg [63:0] Q
);
// Write your code here
endmodule
評論