aboutsummaryrefslogtreecommitdiff
path: root/task3/task3.sv
blob: c40f4646cb20f9176718fa6cca76e0b041f0b07e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module task3(CLOCK_50, KEY, SW, LEDR, HEX0, HEX1, HEX2, HEX3, HEX4, HEX5,
	VGA_R, VGA_G, VGA_B, VGA_HS, VGA_VS, VGA_CLK, VGA_X, VGA_Y,
	VGA_COLOUR, VGA_PLOT);

	input logic CLOCK_50;
	input logic [3:0] KEY;
	input logic [9:0] SW;
	output logic VGA_HS, VGA_VS, VGA_CLK, VGA_PLOT;
	output logic [2:0] VGA_COLOUR;
	output logic [6:0] VGA_Y, HEX0, HEX1, HEX2, HEX3, HEX4, HEX5;
	output logic [7:0] VGA_X, VGA_R, VGA_G, VGA_B;
	output logic [9:0] LEDR;

	logic resetn, done, fillscreen_start, circle_start,
		fillscreen_done, circle_done, fillscreen_plot, circle_plot;
	logic [2:0] fillscreen_colour, circle_colour;
	logic [6:0] fillscreen_y, circle_y;
	logic [7:0] fillscreen_x, circle_x;

	vga_adapter #(.RESOLUTION("160x120")) U0(resetn, CLOCK_50,
		VGA_COLOUR, VGA_X, VGA_Y, VGA_PLOT,
		{VGA_R, 2'b00}, {VGA_G, 2'b00}, {VGA_B, 2'b00},
		VGA_HS, VGA_VS, VGA_BLANK, VGA_SYNC, VGA_CLK);

	fillscreen U1(CLOCK_50, resetn, 3'b000, fillscreen_start,
		fillscreen_done, fillscreen_vga_x, fillscreen_vga_y,
		fillscreen_colour, fillscreen_plot);

	circle U2(CLOCK_50, resetn, 3'b010, 8'd80, 7'd60, 8'd40,
		circle_start, circle_done, circle_x, circle_y,
		circle_colour, circle_plot);

	assign resetn = KEY[3];
	assign start = ~KEY[0];
	assign LEDR[0] = done;

	assign VGA_X = fillscreen_start ? fillscreen_vga_x : circle_x;
	assign VGA_Y = fillscreen_start ? fillscreen_vga_y : circle_y;
	assign VGA_COLOUR = fillscreen_start ? fillscreen_colour : circle_colour;
	assign VGA_PLOT = fillscreen_start ? fillscreen_plot : circle_plot;

	always_ff @(posedge CLOCK_50) begin
		if (~resetn) begin
			fillscreen_start <= 1'b0;
			circle_start <= 1'b1;
			done <= 1'b0;
		end else if (fillscreen_done) begin
			fillscreen_start <= 1'b0;
			circle_start <= 1'b1;
		end else if (circle_done) begin
			circle_start <= 1'b0;
			done <= 1'b1;
		end
	end

endmodule: task3