module johnson_ring_counter(
input wire clk,
input wire reset,
output wire [n-1:0] q
);
parameter n = 4; // カウンターのビット数
reg [n-1:0] q_reg;
wire [n-1:0] q_next;
always @(posedge clk or posedge reset) begin
if (reset)
q_reg <= 0;
else
q_reg <= q_next;
end
assign q = q_reg;
always @(posedge clk) begin
q_next[0] <= q_reg[n-1]; // 最下位ビットは最上位ビットと同じ
for (i = 1; i < n; i = i + 1)
q_next[i] <= q_reg[i-1] ^ q_reg[i]; // 各ビットは前のビットとの排他的論理和
end
endmodule
このVerilogコードでは、clk
とreset
が入力として受け取られ、q
が出力として返されます。n
はカウンターのビット数を指定するパラメータです。q_reg
は現在のカウンターの状態を保持するレジスタであり、q_next
は次の状態を計算するためのワイヤーです。
always @(posedge clk or posedge reset)
ブロックでは、クロックの立ち上がりエッジまたはリセットの立ち上がりエッジで実行される処理を定義しています。リセットがアクティブな場合は、q_reg
を0にリセットします。それ以外の場合は、q_reg
をq_next
の値に更新します。
always @(posedge clk)
ブロックでは、クロックの立ち上がりエッジで実行される処理を定義しています。最下位ビットは常に最上位ビットと同じ値になります。それ以外のビットは、前のビットとの排他的論理和(XOR)を取ることで計算されます。
このJohnsonリングカウンターのVerilogコードを使用すると、clk
信号の立ち上がりエッジでカウンターが進み、reset
信号がアクティブな場合はカウンターがリセットされます。出力のq
はカウンターの現在の状態を表します。
以上がJohnsonリングカウンターのVerilogコードとその解説です。このコード例を使って、デジタル回路の設計やVerilogの学習に役立てていただければ幸いです。