localparam LED_DIV = 26'd50000000; // LED の点滅間隔: 500 ms localparam SEG_DIV = 21'd3000000; // セグメントの移動間隔: 30 ms(SPD = 0) localparam SEG_PTN = 4'd12; // セグメントのアニメーションパターン数 logic [25:0] wait_led, n_wait_led; logic n_led; logic [20:0] wait_seg, n_wait_seg; logic [ 3:0] cnt_seg, n_cnt_seg; logic [ 3:0] pos_seg, n_pos_seg; logic pos_seg_we; // LED の点滅制御 always_comb begin n_wait_led = wait_led + 1'b1; n_led = LED; if (wait_led == LED_DIV - 1) begin // カウントし終わったら n_wait_led = 0; n_led = ~ LED; // LED を反転 end end always_ff @ (posedge CLK) begin if (RST) begin wait_led <= 0; LED <= 1'b0; end else begin wait_led <= n_wait_led; LED <= n_led; end end // 7 セグの点灯制御 always_comb begin // 時間管理 n_wait_seg = wait_seg + 1'b1; n_cnt_seg = cnt_seg; pos_seg_we = 1'b0; if (wait_seg == SEG_DIV - 1) begin n_wait_seg = 0; if (cnt_seg >= SPD) begin // カウントし終わったら n_cnt_seg = 4'd0; pos_seg_we = 1'b1; // pos_seg の書き込みフラグを 1 に end else begin n_cnt_seg = cnt_seg + 1'b1; end end end always_comb begin // 次(時間経過後)のカウンタの値 n_pos_seg if (REV) begin if (pos_seg == 4'd0) begin n_pos_seg = SEG_PTN - 1'b1; end else begin n_pos_seg = pos_seg - 1'b1; end end else begin if (pos_seg == SEG_PTN - 1'b1) begin n_pos_seg = 4'd0; end else begin n_pos_seg = pos_seg + 1'b1; end end end always_ff @ (posedge CLK) begin if (RST) begin wait_seg <= 0; cnt_seg <= 4'd0; pos_seg <= 4'd0; end else begin wait_seg <= n_wait_seg; cnt_seg <= n_cnt_seg; if (pos_seg_we) begin pos_seg <= n_pos_seg; end end end // 7セグの点灯パターン(負論理) always_comb begin case (pos_seg) // gfedcba 4'd0 : begin AN = 4'b0111; SEG = 7'b1111110; end 4'd1 : begin AN = 4'b1011; SEG = 7'b1111110; end 4'd2 : begin AN = 4'b1101; SEG = 7'b1111110; end 4'd3 : begin AN = 4'b1110; SEG = 7'b1111110; end 4'd4 : begin AN = 4'b1110; SEG = 7'b1111101; end 4'd5 : begin AN = 4'b1110; SEG = 7'b1111011; end 4'd6 : begin AN = 4'b1110; SEG = 7'b1110111; end 4'd7 : begin AN = 4'b1101; SEG = 7'b1110111; end 4'd8 : begin AN = 4'b1011; SEG = 7'b1110111; end 4'd9 : begin AN = 4'b0111; SEG = 7'b1110111; end 4'd10 : begin AN = 4'b0111; SEG = 7'b1101111; end 4'd11 : begin AN = 4'b0111; SEG = 7'b1011111; end default: begin AN = 4'b1111; SEG = 7'b1111111; end endcase if (~ wait_seg[16]) begin // 明るさ調整(50%) AN = 4'b1111; end end