From 6ee34ceb170de23cbca0409bd7aec158ea34cb96 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Tue, 21 May 2019 14:56:55 +0800 Subject: [PATCH] sys: improved framebuffer transition. --- sys/sys_top.v | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/sys/sys_top.v b/sys/sys_top.v index 0cb33ac..599c37f 100644 --- a/sys/sys_top.v +++ b/sys/sys_top.v @@ -528,23 +528,41 @@ always @(posedge clk_vid) begin reg [11:0] videoh; reg old_vs; + reg vsd1,vsd2; reg [11:0] vset; - reg fb_set = 0; + reg fb_set1, fb_set2 = 0; reg fb_en = 0; + + reg [1:0] trans = 0; - old_vs <= HDMI_TX_VS; - if(old_vs & ~HDMI_TX_VS) begin - fb_set <= FB_SET; - if(fb_set ^ FB_SET) begin - SC_BASE <= FB_EN ? FB_BASE : VIDEO_BUF; - fb_en <= FB_EN; - if(FB_EN) SC_FREEZE <= 1; + vsd1 <= HDMI_TX_VS; + if(vsd1 == HDMI_TX_VS) vsd2 <= vsd1; + + old_vs <= vsd2; + if(old_vs & ~vsd2) begin + if(trans) trans <= trans - 1'd1; + if(trans == 2) fb_en <= FB_EN; + if(trans == 1) begin + SC_MODE <= fb_en; + SC_BASE <= fb_en ? FB_BASE : VIDEO_BUF; + SC_FMT <= fb_en ? FB_FMT[1:0] : 2'd1; + if(~fb_en) SC_FREEZE <= 0; end end - else if(~old_vs & HDMI_TX_VS) begin - SC_MODE <= fb_en; - SC_FMT <= fb_en ? FB_FMT[1:0] : 2'd1; - if(~fb_en) SC_FREEZE <= 0; + + fb_set1 <= FB_SET; + fb_set2 <= fb_set1; + if(fb_set2 ^ fb_set1) begin + if(FB_EN) SC_FREEZE <= 1; + + //already in FB mode - safe to switch the address/format now + if(SC_MODE & FB_EN) begin + SC_BASE <= FB_BASE; + SC_FMT <= FB_FMT[1:0]; + end + else begin + trans <= 3; + end end state <= state + 1'd1;