-
Notifications
You must be signed in to change notification settings - Fork 0
/
lab7part2.v
183 lines (147 loc) · 4.33 KB
/
lab7part2.v
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
module main (
input wire CLOCK_50, //On Board 50 MHz
input wire [9:0] SW, // On board Switches
input wire [3:0] KEY, // On board push buttons
output wire [6:0] HEX0, // HEX displays
output wire [6:0] HEX1,
output wire [6:0] HEX2,
output wire [6:0] HEX3,
output wire [6:0] HEX4,
output wire [6:0] HEX5,
output wire [9:0] LEDR, // LEDs
output wire [7:0] x, // VGA pixel coordinates
output wire [6:0] y,
output wire [2:0] colour, // VGA pixel colour (0-7)
output wire plot, // Pixel drawn when this is pulsed
output wire vga_resetn // VGA resets to black when this is pulsed (NOT CURRENTLY AVAILABLE)
);
wire resetn, draw, s_clear, load_x;
assign resetn = KEY[0];
assign draw = ~KEY[1];
assign s_clear = ~KEY[2];
assign load_x = ~KEY[3];
assign plot = writeEn;
wire ld_x, ld_y, ld_colour, inc_x, inc_y;
wire [7:0] x_val;
wire [6:0] y_val;
wire writeEn;
wire clear;
control c0(CLOCK_50, resetn, draw, s_clear, load_x, x_val, y_val, writeEn, inc_x, inc_y, ld_x, ld_y, ld_colour, clear);
datapath d0(CLOCK_50, resetn, inc_c, inc_y, ld_x, ld_y, ld_colour, clear, SW[9:7], SW[6:0], SW[6:0], x_val, y_val, colour, x, y);
endmodule
module control(clk, resetn, draw, s_clear, load_x, x_val, y_val, writeEn, inc_x, inc_y, ld_x, ld_y, ld_colour, clear);
input clk, resetn, draw, s_clear, load_x;
input [7:0] x_val;
input [6:0] y_val;
output reg ld_x, ld_y, ld_colour, inc_y, inc_x, writeEn, clear;
reg [4:0] current_state, next_state;
localparam LOAD_X = 4'd0, LOAD_X_WAIT = 4'd1, LOAD_Y = 4'd2, LOAD_Y_WAIT = 4'd3,
DRAW_X = 4'd4, DRAW_Y = 4'd5, CLEAR_X = 4'd6, CLEAR_Y = 4'd7, CLEAR_WAIT = 4'd8;
always@(*)
begin: state_table
case(current_state)
LOAD_X: next_state = s_clear ? CLEAR_WAIT : (load_x ? LOAD_X_WAIT : LOAD_X);
CLEAR_WAIT: next_state = s_clear ? CLEAR_WAIT : CLEAR_X;
LOAD_X_WAIT: next_state = load_x ? LOAD_X_WAIT : LOAD_Y;
LOAD_Y: next_state = draw ? LOAD_Y_WAIT : LOAD_Y;
LOAD_Y_WAIT: next_state = draw ? LOAD_Y_WAIT : DRAW_X;
DRAW_X: next_state = x_val < 3 ? DRAW_X : DRAW_Y;
DRAW_Y: next_state = y_val < 3 ? DRAW_X : LOAD_X;
CLEAR_X: next_state = x_val < 159 ? CLEAR_X : CLEAR_Y;
CLEAR_Y: next_state = y_val < 119 ? CLEAR_X : LOAD_X;
default: next_state = LOAD_X;
endcase
end
always@(*)
begin: enable_signals
ld_x = 0;
ld_y = 0;
ld_colour = 0;
writeEn = 0;
inc_y = 0;
inc_x = 0;
clear = 0;
case(current_state)
LOAD_X: begin
ld_x = 1;
end
LOAD_Y: begin
ld_y = 1;
ld_colour = 1;
end
DRAW_X: begin
writeEn = 1;
inc_x = 1;
end
DRAW_Y: begin
inc_y = 1;
end
CLEAR_WAIT: begin
clear = 1;
ld_x = 1;
ld_y = 1;
end
CLEAR_X: begin
clear = 1;
writeEn = 1;
inc_x = 1;
end
CLEAR_Y: begin
clear = 1;
inc_y = 1;
end
endcase
end
always@(posedge clk)
begin: state_FFs
if(!resetn)
current_state <= LOAD_X;
else
current_state <= next_state;
end
endmodule
module datapath(clk, resetn, inc_x, inc_y, ld_x, ld_y, ld_colour, clear, in_colour, in_x, in_y, x_val, y_val, colour, x, y);
input clk, resetn, ld_x, ld_y, ld_colour, inc_x, inc_y, clear;
input [2:0]in_colour;
input [6:0]in_x;
input [6:0]in_y;
output [2:0]colour;
output [7:0]x;
output [6:0]y;
output reg [7:0] x_val;
output reg [6:0] y_val;
reg [7:0]init_x;
reg [6:0]init_y;
reg [2:0]sel_colour;
always@(posedge clk)begin
if(!resetn)begin
init_x <= 8'b0;
init_y <= 7'b0;
sel_colour <= 3'b0;
x_val <= 8'b0;
y_val <= 7'b0;
end
else begin
if(ld_x) begin
init_x <= clear ? 8'b0 : {1'b0, in_x};
y_val <= 7'd0;
end
if(ld_y) begin
init_y <= clear ? 7'b0 : in_y;
end
if(ld_colour) begin
sel_colour <= in_colour;
end
if(inc_x) begin
x_val <= x_val + 1;
end
if(inc_y) begin
y_val <= y_val + 1;
x_val <= 8'd0;
end
end
end
assign x = init_x + x_val;
assign y = init_y + y_val;
assign colour = clear ? 3'b000 : sel_colour;
endmodule