92 lines
1.9 KiB
Verilog
92 lines
1.9 KiB
Verilog
module FourDigitLEDdriver (
|
|
input clk,
|
|
input reset,
|
|
output an3,
|
|
an2,
|
|
an1,
|
|
an0,
|
|
output a,
|
|
b,
|
|
c,
|
|
d,
|
|
e,
|
|
f,
|
|
g,
|
|
dp
|
|
);
|
|
|
|
wire clk_fb, clk_slow_raw, clk_slow, locked;
|
|
|
|
MMCME2_BASE #(
|
|
.BANDWIDTH ("OPTIMIZED"),
|
|
.CLKIN1_PERIOD (10.0), // 100 MHz
|
|
.DIVCLK_DIVIDE (1),
|
|
.CLKFBOUT_MULT_F (6.0), // VCO = 600 MHz
|
|
.CLKOUT1_DIVIDE (120), // 600/120 = 5 MHz
|
|
.CLKFBOUT_PHASE (0.0),
|
|
.CLKOUT1_PHASE (0.0),
|
|
.CLKOUT1_DUTY_CYCLE(0.5),
|
|
.STARTUP_WAIT ("FALSE")
|
|
) MMCME2_BASE_inst (
|
|
.CLKIN1(clk),
|
|
.CLKFBIN(clk_fb),
|
|
.CLKFBOUT(clk_fb),
|
|
.CLKOUT1(clk_slow_raw),
|
|
.LOCKED(locked),
|
|
.PWRDWN(1'b0),
|
|
.RST(reset)
|
|
);
|
|
|
|
BUFG bufg_slow (
|
|
.I(clk_slow_raw),
|
|
.O(clk_slow)
|
|
);
|
|
|
|
wire rst_int = reset | ~locked;
|
|
|
|
reg [3:0] state;
|
|
always @(posedge clk_slow or posedge rst_int) begin
|
|
if (rst_int) state <= 4'b1111;
|
|
else state <= state - 1; // one step per 200 ns
|
|
end
|
|
|
|
reg [3:0] an;
|
|
reg [3:0] digit;
|
|
|
|
always @(*) begin
|
|
case (state)
|
|
4'b1110: an = 4'b0111;
|
|
4'b1010: an = 4'b1011;
|
|
4'b0110: an = 4'b1101;
|
|
4'b0010: an = 4'b1110;
|
|
default: an = 4'b1111;
|
|
endcase
|
|
end
|
|
|
|
always @(*) begin
|
|
case (state)
|
|
4'b0000, 4'b1111, 4'b1110, 4'b1101: digit = 4'h0;
|
|
4'b1100, 4'b1011, 4'b1010, 4'b1001: digit = 4'h1;
|
|
4'b1000, 4'b0111, 4'b0110, 4'b0101: digit = 4'h2;
|
|
default: digit = 4'h3;
|
|
endcase
|
|
end
|
|
|
|
wire [6:0] LED;
|
|
LEDdecoder LEDdecoder_inst (
|
|
.char(digit),
|
|
.LED (LED)
|
|
);
|
|
|
|
assign {an3, an2, an1, an0} = an;
|
|
assign a = ~LED[6];
|
|
assign b = ~LED[5];
|
|
assign c = ~LED[4];
|
|
assign d = ~LED[3];
|
|
assign e = ~LED[2];
|
|
assign f = ~LED[1];
|
|
assign g = ~LED[0];
|
|
assign dp = 1'b1;
|
|
|
|
endmodule
|