All checks were successful
ci/woodpecker/push/test-workflow Pipeline was successful
68 lines
1.7 KiB
Systemverilog
68 lines
1.7 KiB
Systemverilog
`include "sdvd_defs.sv"
|
|
import sdvd_defs::SPEED;
|
|
module nexys_a7_top(
|
|
input logic CLK100MHZ, CPU_RESETN,
|
|
input logic BTNC, BTNR,
|
|
output logic [7:0] CA,CB,CC,CD,CE,CF,CG,
|
|
output logic [7:0] AN
|
|
);
|
|
|
|
// Active high reset
|
|
wire reset;
|
|
assign reset = ~CPU_RESETN;
|
|
|
|
logic clk_1khz, clk_10hz;
|
|
logic seconds_pulse;
|
|
|
|
SPEED speed;
|
|
|
|
// Map C{A-G} to an array of 7-segment displays
|
|
wire [6:0] segments [7:0];
|
|
for (genvar i = 0; i<8; i++) begin: segmentGenerate
|
|
assign {CG[i],CF[i],CE[i],CD[i],CC[i],CB[i],CA[i]} = segments[i];
|
|
end
|
|
|
|
logic [$clog2(60)-1:0] seconds;
|
|
logic [$clog2(60)-1:0] minutes;
|
|
logic [$clog2(60)-1:0] hours;
|
|
|
|
low_freq_clock_gen clockGen(CLK100MHZ, reset, speed, clk_1khz, clk_10hz, seconds_pulse);
|
|
|
|
// Count the number on seconds, hours, and minutes elapsed
|
|
// If the speed is faster this will pulse more often than once a second
|
|
// but will still theoretically be a second of video time
|
|
always_ff @(posedge seconds_pulse) begin
|
|
if (reset) begin
|
|
seconds <= 0;
|
|
minutes <= 0;
|
|
hours <= 0;
|
|
end
|
|
else if (seconds == 59) begin
|
|
seconds <= 0;
|
|
if (minutes == 59) begin
|
|
minutes <= 0;
|
|
hours <= hours + 1;
|
|
end
|
|
else
|
|
minutes <= minutes + 1;
|
|
end
|
|
else
|
|
seconds <= seconds + 1;
|
|
end
|
|
|
|
display_anode_driver anodeDriver(clk_1khz,reset,AN);
|
|
|
|
seconds_display secondsSegment (seconds, segments[1], segments[0]);
|
|
seconds_display minutesSegment (minutes, segments[3], segments[2]);
|
|
seconds_display hoursSegment (hours, segments[5], segments[4]);
|
|
|
|
// Run the playback speed state machine at a lower rate
|
|
// Gets rid of button bouncing
|
|
playback_controller playbackController (clk_10hz,reset,BTNC, BTNR, speed);
|
|
|
|
|
|
|
|
|
|
|
|
endmodule
|