[RTLLM-p028] Control/Counter/JC_counter


提交解答


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

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

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

評論

目前沒有評論。