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

module digit_driver #(
parameter CLK_FREQ = 27_000_000, // 入力クロックの周波数を指定
parameter DIGIT_FREQ_HZ = 1_000 // 次の桁へ移動する周波数を指定
) (
input wire clk, // 27MHzクロック入力
output wire [5:0] digit_output, // 表示する桁の指定
output wire [3:0] digit_count // 表示している桁番号
);

// 前章で作成したタイマ・モジュール
// 1ミリ秒に1回digit_count_upがHiになる
wire digit_count_up;
timer #(
.COUNT_LIMIT (CLK_FREQ / DIGIT_FREQ_HZ)
) timer_i (
.count_max (digit_count_up),
.*
);

// digit_count_upがHiになったタイミングでdigit_counterをインクリメントするロジック
// 今回使用する7セグLEDの桁数は6なので,digit_counterは0~5のいずれかの値をとるように設計
logic [3:0] digit_counter = 4'd0;
always_ff @ (posedge clk) begin
if (digit_count_up) begin
if (digit_counter == 4'd5) begin
digit_counter <= 4'd0;
end else begin
digit_counter <= digit_counter + 4'd1;
end
end
end

// digit_counterの値に応じてdigitの1ビットだけをHとするロジック
// digitは後のassign文で反転されてdigit_outputとなる
logic [5:0] digit = 6'b000000;
always_comb begin
case (digit_counter)
4'd0: digit = 6'b000001;
4'd1: digit = 6'b000010;
4'd2: digit = 6'b000100;
4'd3: digit = 6'b001000;
4'd4: digit = 6'b010000;
4'd5: digit = 6'b100000;
default: digit = 6'b000000; // 通常ここには入らない
endcase
end

assign digit_output = ~digit; // digit_outputは1ビットだけLとなる
assign digit_count = digit_counter;

endmodule