Gowin Vol.3 第1部第5章 リスト3

localparam CAPTURE_FREQ_HZ = 100;

// タイマ・モジュール
// 10ミリ秒に1回sw_in_captureがHになる
wire sw_in_capture;
timer #(
.COUNT_LIMIT (CLK_FREQ / CAPTURE_FREQ_HZ)
) timer_i (
.count_max (sw_in_capture),
.*
);

// スイッチ入力を2段のフリップフロップに記憶する
logic [1:0] count_up_acc_reg = '0;
always @ (posedge clk) begin
if (sw_in_capture) begin // 10ミリ秒に一度だけスイッチ入力をキャプチャする
count_up_acc_reg[0] <= count_up_reg[1];
count_up_acc_reg[1] <= count_up_acc_reg[0];
end
end

// 2段のフリップフロップの値からスイッチ入力の立ち上がりエッジを検出する
wire count_up_posedge = ~count_up_acc_reg[1] & count_up_acc_reg[0] & sw_in_capture;