mirror of
https://github.com/brouhaha/Apple-II_MiSTer.git
synced 2025-03-01 16:29:02 +00:00
124 lines
3.0 KiB
Verilog
124 lines
3.0 KiB
Verilog
module sync_vg
|
||
#(
|
||
parameter X_BITS=12,
|
||
Y_BITS=12
|
||
)
|
||
(
|
||
input wire clk,
|
||
input wire reset,
|
||
input wire interlaced,
|
||
input wire [Y_BITS-1:0] v_total_0,
|
||
input wire [Y_BITS-1:0] v_fp_0,
|
||
input wire [Y_BITS-1:0] v_bp_0,
|
||
input wire [Y_BITS-1:0] v_sync_0,
|
||
input wire [Y_BITS-1:0] v_total_1,
|
||
input wire [Y_BITS-1:0] v_fp_1,
|
||
input wire [Y_BITS-1:0] v_bp_1,
|
||
input wire [Y_BITS-1:0] v_sync_1,
|
||
input wire [X_BITS-1:0] h_total,
|
||
input wire [X_BITS-1:0] h_fp,
|
||
input wire [X_BITS-1:0] h_bp,
|
||
input wire [X_BITS-1:0] h_sync,
|
||
input wire [X_BITS-1:0] hv_offset_0,
|
||
input wire [X_BITS-1:0] hv_offset_1,
|
||
output reg vs_out,
|
||
output reg hs_out,
|
||
output reg hde_out,
|
||
output reg vde_out,
|
||
output reg [Y_BITS:0] v_count_out,
|
||
output reg [X_BITS-1:0] h_count_out,
|
||
output reg [X_BITS-1:0] x_out,
|
||
output reg [Y_BITS:0] y_out,
|
||
output reg field_out,
|
||
output wire clk_out
|
||
);
|
||
|
||
reg [X_BITS-1:0] h_count;
|
||
reg [Y_BITS-1:0] v_count;
|
||
reg field;
|
||
reg [Y_BITS-1:0] v_total;
|
||
reg [Y_BITS-1:0] v_fp;
|
||
reg [Y_BITS-1:0] v_bp;
|
||
reg [Y_BITS-1:0] v_sync;
|
||
reg [X_BITS-1:0] hv_offset;
|
||
|
||
assign clk_out = !clk;
|
||
|
||
/* horizontal counter */
|
||
always @(posedge clk)
|
||
if (reset)
|
||
h_count <= 0;
|
||
else
|
||
if (h_count < h_total - 1)
|
||
h_count <= h_count + 1'd1;
|
||
else
|
||
h_count <= 0;
|
||
|
||
/* vertical counter */
|
||
always @(posedge clk)
|
||
if (reset)
|
||
v_count <= 0;
|
||
else
|
||
if (h_count == h_total - 1)
|
||
begin
|
||
if (v_count == v_total - 1)
|
||
v_count <= 0;
|
||
else
|
||
v_count <= v_count + 1'd1;
|
||
end
|
||
|
||
/* field */
|
||
always @(posedge clk)
|
||
if (reset)
|
||
begin
|
||
field <= 0;
|
||
v_total <= v_total_0;
|
||
v_fp <= interlaced ? v_fp_1 : v_fp_0; // In the interlaced mode this value must be inverted as v_fp_1 is still in field0
|
||
v_bp <= v_bp_0;
|
||
v_sync <= v_sync_0;
|
||
hv_offset <= hv_offset_0;
|
||
end
|
||
else
|
||
if ((interlaced) && ((v_count == v_total - 1) && (h_count == h_total - 1)))
|
||
begin
|
||
field <= field + interlaced;
|
||
v_total <= field ? v_total_0 : v_total_1;
|
||
v_fp <= field ? v_fp_1 : v_fp_0; // This order is inverted as v_fp_1 is still in field0
|
||
v_bp <= field ? v_bp_0 : v_bp_1;
|
||
v_sync <= field ? v_sync_0 : v_sync_1;
|
||
hv_offset <= field ? hv_offset_0 : hv_offset_1;
|
||
end
|
||
|
||
always @(posedge clk)
|
||
if (reset)
|
||
{ vs_out, hs_out, hde_out, vde_out, field_out } <= 4'b0;
|
||
else begin
|
||
hs_out <= ((h_count < h_sync));
|
||
|
||
hde_out <= (h_count >= h_sync + h_bp) && (h_count <= h_total - h_fp - 1);
|
||
vde_out <= (v_count >= v_sync + v_bp) && (v_count <= v_total - v_fp - 1);
|
||
|
||
if ((v_count == 0) && (h_count == hv_offset))
|
||
vs_out <= 1'b1;
|
||
else if ((v_count == v_sync) && (h_count == hv_offset))
|
||
vs_out <= 1'b0;
|
||
|
||
/* H_COUNT_OUT and V_COUNT_OUT */
|
||
h_count_out <= h_count;
|
||
if (field)
|
||
v_count_out <= v_count + v_total_0;
|
||
else
|
||
v_count_out <= v_count;
|
||
|
||
/* X and Y coords <20> for a backend pattern generator */
|
||
x_out <= h_count - (h_sync + h_bp);
|
||
if (interlaced)
|
||
y_out <= { (v_count - (v_sync + v_bp)) , field };
|
||
else
|
||
y_out <= { 1'b0, (v_count - (v_sync + v_bp)) };
|
||
field_out <= field;
|
||
|
||
end
|
||
|
||
endmodule
|