多段の分周期のパルス幅

今回各モジュールの中に多用されているのは、非同期リセット付イネーブル付カウンタと呼ばれるものだ。
これを使ってシステムクロックの50MHzとこれを分周した1kHzを元に、1Hzや200Hzを作る分周器を作っている。


module clk_scaler_with_enable(input in_clk, input in_reset, input in_enable, output out_q)
// wires and regs
reg [7:0] _8bit_counter
assing out_q = (_8bit_counter == 8'd100)? 1'b1: 1'b0;
always @(posedge in_clk or posedge in_reset)
begin
if (in_reset == 1'b1)
_8bit_counter <= 8'd0;
else
begin
if (in_enable == 1'b1)
begin
if (out_q == 1'b1)
_8bit_counter <= 8'd0;
else
_8bit_counter <= _8bit_counter + 8'd1;
end
end
end
endmodule
この分周器のin_enableにin_clkから分周した1kHzのクロックを使用している。
この時、out_qのパルス幅はin_enableの周期=1msecになる。

上は上記のモジュールのイネーブルにin_clkを1/4分周した信号を使って、終了条件を8'd002とした場合のRTLシミュレーションの結果だ。


上記のようなイネーブル付カウンタを使って作る分周期を多段につなぐ際には注意が必要だ。
上記のカウンターにin_enableのパルス幅がin_clkの周期よりも長いものを接続すると、一回のin_enableのパルス間にカウンターが1回以上進むことになるからだ。