1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-07 01:29:30 +00:00
8bitworkshop/presets/verilog/hvsync_generator.v

70 lines
2.1 KiB
Coq
Raw Normal View History

`ifndef HVSYNC_GENERATOR_H
`define HVSYNC_GENERATOR_H
2017-11-11 19:45:32 +00:00
2018-10-01 16:30:47 +00:00
/*
Video sync generator, used to drive a simulated CRT.
To use:
- Wire the hsync and vsync signals to top level outputs
- Add a 3-bit (or more) "rgb" output to the top level
*/
2018-02-07 00:07:40 +00:00
module hvsync_generator(clk, reset, hsync, vsync, display_on, hpos, vpos);
input clk;
input reset;
output reg hsync, vsync;
2018-02-07 00:07:40 +00:00
output display_on;
output reg [8:0] hpos;
output reg [8:0] vpos;
2017-11-11 19:45:32 +00:00
// declarations for TV-simulator sync parameters
// horizontal constants
parameter H_DISPLAY = 256; // horizontal display width
parameter H_BACK = 23; // horizontal left border (back porch)
parameter H_FRONT = 7; // horizontal right border (front porch)
parameter H_SYNC = 23; // horizontal sync width
// vertical constants
parameter V_DISPLAY = 240; // vertical display height
parameter V_TOP = 5; // vertical top border
parameter V_BOTTOM = 14; // vertical bottom border
parameter V_SYNC = 3; // vertical sync # lines
// derived constants
parameter H_SYNC_START = H_DISPLAY + H_FRONT;
parameter H_SYNC_END = H_DISPLAY + H_FRONT + H_SYNC - 1;
parameter H_MAX = H_DISPLAY + H_BACK + H_FRONT + H_SYNC - 1;
parameter V_SYNC_START = V_DISPLAY + V_BOTTOM;
parameter V_SYNC_END = V_DISPLAY + V_BOTTOM + V_SYNC - 1;
parameter V_MAX = V_DISPLAY + V_TOP + V_BOTTOM + V_SYNC - 1;
wire hmaxxed = (hpos == H_MAX) || reset; // set when hpos is maximum
wire vmaxxed = (vpos == V_MAX) || reset; // set when vpos is maximum
2018-02-09 16:59:52 +00:00
// horizontal position counter
always @(posedge clk)
2018-01-13 20:48:58 +00:00
begin
2018-02-09 16:59:52 +00:00
hsync <= (hpos>=H_SYNC_START && hpos<=H_SYNC_END);
if(hmaxxed)
hpos <= 0;
2017-11-11 19:45:32 +00:00
else
hpos <= hpos + 1;
2018-02-03 20:20:56 +00:00
end
2017-11-11 19:45:32 +00:00
2018-02-09 16:59:52 +00:00
// vertical position counter
2017-11-11 19:45:32 +00:00
always @(posedge clk)
2018-01-13 20:48:58 +00:00
begin
2018-02-09 16:59:52 +00:00
vsync <= (vpos>=V_SYNC_START && vpos<=V_SYNC_END);
if(hmaxxed)
2018-02-09 16:59:52 +00:00
if (vmaxxed)
vpos <= 0;
2018-02-09 16:59:52 +00:00
else
vpos <= vpos + 1;
2018-02-03 20:20:56 +00:00
end
2018-01-13 20:48:58 +00:00
// display_on is set when beam is in "safe" visible frame
2018-02-09 16:59:52 +00:00
assign display_on = (hpos<H_DISPLAY) && (vpos<V_DISPLAY);
2017-11-11 19:45:32 +00:00
endmodule
`endif