-
Notifications
You must be signed in to change notification settings - Fork 1
/
Controller.v
90 lines (80 loc) · 2.97 KB
/
Controller.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
/***********************************************************
* @author Jon Hourany
* @date 4/04/13
* @class EECE 444
*
* @file Controller.v
* @proj Video Card
*
* @long Using the following timing for V_SYNC I can
*
************************************************************/
module Controller(CLK, NRST, H_SYNC, V_SYNC, RGB_EN);
input wire CLK; /*< CLK input from Top module >*/
input wire NRST; /*< Reset input from Top module >*/
output wire RGB_EN; /*< Enables RGB values durning display time on H_SYNC >*/
output reg H_SYNC; /*< Goes to VGA Horizontal Sync >*/
output reg V_SYNC; /*< Goes to VGA Verical Sync >*/
reg [9:0] h_counter; /*< Tracks amount of pulses from CLK >*/
reg [18:0] v_counter; /*< Tracks amount of pulses from H_SYNC >*/
reg h_display; /*< Used to track when H_SYNC is in display zone >*/
reg v_display; /*< Used to track when V_SYNC is in display zone >*/
`define H_SYNC_PULSE 10'd96 /*< Length of Sync Pulse >*/
`define H_BACK_PORCH_END 10'd144 /*< Pulse len + Porch Len >*/
`define H_FRONT_PORCH_STRT 10'd784 /*< Front Porch Len - Max >*/
`define H_COUNT_MAX 10'd799 /*< Max line pulses for resolution >*/
`define V_SYNC_PULSE 19'd2 /*< 2 H_SYNC lines >*/
`define V_BACK_PORCH_END 19'd35 /*< 33+2 H_SYNC lines >*/
`define V_FRONT_PORCH_STRT 19'd510 /*< 525-10 H_SYNC lines >*/
`define V_COUNT_MAX 19'd520 /*< 525 H_SYNC lines >*/
/*** Logic for H_SYNC ***/
always @(*) begin
if (h_counter < `H_SYNC_PULSE) begin
H_SYNC = 0;
h_display = 0;
end
/* If H_Sync is in the display zone, enable RGB */
else if (h_counter > `H_BACK_PORCH_END && h_counter < `H_FRONT_PORCH_STRT) begin
H_SYNC = 1;
h_display = 1;
end
/* During the Front Porch period, disable RGB */
else begin
H_SYNC = 1;
h_display = 0;
end
end
/*** Logic for V_SYNC ***/
always @(*) begin
if (v_counter < `V_SYNC_PULSE) begin
V_SYNC = 0;
v_display = 0;
end
else if (v_counter > `V_BACK_PORCH_END && v_counter < `V_FRONT_PORCH_STRT) begin
V_SYNC = 1;
v_display = 1;
end
else begin
V_SYNC = 1;
v_display = 0;
end
end
/*** Counter logic ***/
always @(posedge CLK) begin
if (h_counter >= `H_COUNT_MAX || !NRST) begin
h_counter <= 11'b00;
end
else begin
h_counter <= h_counter + 1;
end
end
always @(posedge CLK) begin
if (v_counter >= `V_COUNT_MAX || !NRST) begin
v_counter <= 11'b00;
end
else if (h_counter == `H_COUNT_MAX) begin
v_counter <= v_counter + 1;
end
end
assign RGB_EN = (h_display & v_display);
endmodule