Question: Is there an easy transistion?
Closed this issue · 8 comments
@amb5l while reading your comment #2 (comment) a nagging little thought came up:
I reckon that our timing generator, originally developed by Scott Larson and "improved or damaged" by me and @MJoergen is not accurate.
Why should it be necessary to tweak V_BP and V_FP at all instead of using the reference values?
Or asked the other way round: Why are we getting HDMI Analyzer errors while just sticking in the correct reference timing values?
Here are possible answers:
- "Pipeline problems" (like a flip/flop delaying something here and there)
- Clock Domain Crossing problems
- Our timing generator is not good enough
So just in case that the new bitstream is not solving issue #2 and/or just in case we want to improve the code quality in our project:
I wonder, if there is a kind of quick and easy way to just replace our our timing generator with your timing generator.
Our timing generator outputs these signals:
h_sync : out std_logic; -- horiztonal sync pulse
v_sync : out std_logic; -- vertical sync pulse
disp_ena : out std_logic; -- display enable ('1' = display time, '0' = blanking time)
column : out integer; -- horizontal pixel coordinate
row : out integer; -- vertical pixel coordinate
n_blank : out std_logic; -- direct blacking output to dac
n_sync : out std_logic -- sync-on-green output to dac
Your timing generator outputs these signals:
f : out std_logic; -- field ID
vs : out std_logic; -- vertical sync
hs : out std_logic; -- horizontal sync
vblank : out std_logic; -- vertical blank
hblank : out std_logic; -- horizontal blank
ax : out std_logic_vector(11 downto 0); -- visible area X (signed)
ay : out std_logic_vector(11 downto 0) -- visible area Y (signed)
We actually do need disp_ena
and column
and row
for our overlay menu and other things. So we would need to make sure that there is a way to map your output to ours and our a formula that translates ax/ay to row/column.
Also some parts of the screen scaler depend on certain timing characteristincs, I do remember that @MJoergen added 1-clock-cycle delays here and there so that the Game Boy on MEGA65 screen looks as it should. Maybe he can chime in here, too.
Your theories about possible problems in your timing generator all sound reasonable. It will probably help us both to try inserting my timing generator in your project. Happy to assist...
You'll need something like this to translate my outputs to yours:
constant DEFAULT_COL : integer := -1;
constant DEFAULT_ROW : integer := -1;
...
h_sync <= hs;
v_sync <= vs;
disp_ena <= not (vblank or hblank);
column <= to_integer(ax) when disp_ena = '1' else DEFAULT_COL;
row <= to_integer(ay) when disp_ena = '1' else DEFAULT_ROW;
n_blank <= not disp_ena;
n_sync <= not (h_sync or v_sync);
Thank you for your support - very helpful!
So I will do the "plug-in" experiment and plug-in your timing generator in our project to see, if this fixes issue #2 .
@amb5l Today I will perform the "plug-in" experiment.
What is the idea behind / semantics of align
(aka alignment delay) in video_out_timing
?
align
is an incomplete attempt to support situations where a fixed delay is required between source video (e.g. the video controller of a retro computer) and the output. For example, where the retro computer's video controller has a different pixel clock and pixels must pass through a FIFO. I am creating an FPGA implementation of the Acorn BBC micro and its CRTC is a MC6845 with a pixel clock of 16MHz. That is where this requirement came from.
You can safely ignore it - set align to zero.
@amb5l There is no polarity input in video_out_timing
. Is it fair to assume, that your timing generator always creates positive/positive polarity? (And if certain video modes, such as PAL @ 50 Hz, require negative/negative polarity, that one would just invert the outputs of video_out_timing
?)
@sy2002 Yes that's correct, the sync polarity of video_out_timing
is positive. vga_to_hdmi
provides control inputs for active low syncs.
@sy2002 Yes that's correct, the sync polarity of
video_out_timing
is positive.vga_to_hdmi
provides control inputs for active low syncs.
@amb5l Oh - then everything only worked "by chance" in past, because I mis-understood your inputs at vga_to_hdmi
: These are only output polarities and vga_to_hdmi
always expects positive/positive as input? (at 720p @ 60 Hz we happened to have pos/pos anyway, so nobody noticed...) I am asking, because the MEGA65 has a VGA output as well as a HDMI output, and therefore I will make sure "manually" in future (if we switched to your timing generator) that the VGA output also gets the correct polarity.