Altera DE0でLチカその3

最後はボタンを押している間だけLチカだ。
ボタンをチャタリング防止に通したものと1Hzのフリップフロップの出力を非同期でANDを取ったものと、一度ラッチをかませてボード上の50MHzのクロックと同期させたものの両方を出力している。


module LEDBlink(
input in_clk,
input [9:0] in_switch,
input [2:0] in_button,
output [9:0] out_led,
output[7:0] seven_segment_0,
output[7:0] seven_segment_1,
output[7:0] seven_segment_2,
output[7:0] seven_segment_3);
// wires and regs
wire reset;
wire clk_1kHz;
wire clk_200Hz;
wire ac_q;
reg[9:0] _10bit_counter;
reg flipflop_1Hz; // for LED blink
reg latch_LED_Blink;
// switch 0 for reset
assign reset = in_switch[0];
// 1kHz clk
clk_scaler_1kHz clk_scaler_1kHz(in_clk, reset, clk_1kHz);
// 200Hz clk for anti chatter, pulse width of clk_200Hz is 1/1kHz = 1msec
clk_scaler_from_1kHz #(5) clk_scaler_200Hz(in_clk, reset, clk_1kHz, clk_200Hz);
// anti chatter for in_button[0]
anti_chatter ac_button1(clk_200Hz, reset, ~in_button[0], ac_q);
//
always @(posedge in_clk or posedge reset)
begin
if (reset == 1'b1)
begin
_10bit_counter <= 10'd0;
flipflop_1Hz <= 1'b0;
end
else
begin
if (clk_1kHz == 1'b1)
begin
if (_10bit_counter == 10'd1_000)
begin
_10bit_counter <= 10'd0;
flipflop_1Hz = ~flipflop_1Hz;
end
else
_10bit_counter <= _10bit_counter + 10'd1;
end
end
end
//
always @(posedge in_clk or posedge reset)
begin
if (reset == 1'b1)
latch_LED_Blink <=~ 1'b0;
else
begin
if (ac_q == 1'b0)
latch_LED_Blink <= 1'b0;
else
latch_LED_Blink <= flipflop_1Hz;
end
end
// output
assign out_led[0] = ac_q;
assign out_led[1] = flipflop_1Hz;
assign out_led[2] = ac_q & flipflop_1Hz;
assign out_led[3] = latch_LED_Blink;
//
// terminate unused LED
assign seven_segment_0 = 8'hff;
assign seven_segment_1 = 8'hff;
assign seven_segment_2 = 8'hff;
assign seven_segment_3 = 8'hff;
assign out_led[9:4] = 6'd0;
//
endmodule