From 6bdd77bb31dc8d109567d8dbbbfaecf6a2dda16b Mon Sep 17 00:00:00 2001 From: sorgelig Date: Thu, 3 Oct 2019 01:49:53 +0800 Subject: [PATCH] Update sys. --- sys/osd.v | 99 ++++++++++++++++++++++++++++++++----------------- sys/sys_top.sdc | 11 ++++++ 2 files changed, 75 insertions(+), 35 deletions(-) diff --git a/sys/osd.v b/sys/osd.v index b564a26..f0a9dfe 100644 --- a/sys/osd.v +++ b/sys/osd.v @@ -22,14 +22,12 @@ module osd ); parameter OSD_COLOR = 3'd4; -parameter OSD_X_OFFSET = 12'd0; -parameter OSD_Y_OFFSET = 12'd0; localparam OSD_WIDTH = 12'd256; localparam OSD_HEIGHT = 12'd64; `ifdef OSD_HEADER -localparam OSD_HDR = 12'd32; +localparam OSD_HDR = 12'd24; `else localparam OSD_HDR = 12'd0; `endif @@ -42,7 +40,11 @@ reg [8:0] infoh; reg [8:0] infow; reg [11:0] infox; reg [21:0] infoy; -reg [21:0] hrheight; +reg [21:0] osd_h; +reg [21:0] osd_t; +reg [21:0] osd_w; + +reg [1:0] rot = 0; always@(posedge clk_sys) begin reg [12:0] bcnt; @@ -51,7 +53,9 @@ always@(posedge clk_sys) begin reg old_strobe; reg highres = 0; - hrheight <= info ? infoh : ((OSD_HEIGHT<> 9) > 1) ? (((cnt+1'b1) >> 9) - 1) : 0; + pixsz <= (((cnt+1'b1) >> (9-rot[0])) > 1) ? (((cnt+1'b1) >> (9-rot[0])) - 1'd1) : 22'd0; pixcnt <= 0; end end @@ -119,19 +124,24 @@ reg [2:0] osd_de; reg osd_pixel; reg [21:0] v_cnt; -reg v_cnt_below320, v_cnt_below640, v_cnt_below960; +reg v_cnt_half, v_cnt_single, v_cnt_double, v_cnt_triple; -reg [21:0] v_osd_start_320, v_osd_start_640, v_osd_start_960, v_osd_start_other; +reg [21:0] v_osd_start_h, v_osd_start_s, v_osd_start_d, v_osd_start_t, v_osd_start_q; + +wire [21:0] osd_h_hdr = (info || rot) ? osd_h : (osd_h + OSD_HDR); // pipeline the comparisons a bit always @(posedge clk_video) if(ce_pix) begin - v_cnt_below320 <= v_cnt < 320; - v_cnt_below640 <= v_cnt < 640; - v_cnt_below960 <= v_cnt < 960; - v_osd_start_320 <= ((v_cnt-hrheight)>>1) + OSD_Y_OFFSET; - v_osd_start_640 <= ((v_cnt-(hrheight<<1))>>1) + OSD_Y_OFFSET; - v_osd_start_960 <= ((v_cnt-(hrheight + (hrheight<<1)))>>1) + OSD_Y_OFFSET; - v_osd_start_other <= ((v_cnt-(hrheight<<2))>>1) + OSD_Y_OFFSET; + v_cnt_half <= v_cnt < osd_t; + v_cnt_single <= v_cnt < 320; + v_cnt_double <= v_cnt < 640; + v_cnt_triple <= v_cnt < 960; + + v_osd_start_h <= ((v_cnt-(osd_h_hdr>>1))>>1); + v_osd_start_s <= ((v_cnt-osd_h_hdr)>>1); + v_osd_start_d <= ((v_cnt-(osd_h_hdr<<1))>>1); + v_osd_start_t <= ((v_cnt-(osd_h_hdr + (osd_h_hdr<<1)))>>1); + v_osd_start_q <= ((v_cnt-(osd_h_hdr<<2))>>1); end always @(posedge clk_video) begin @@ -145,22 +155,31 @@ always @(posedge clk_video) begin reg [21:0] h_osd_start; reg [21:0] v_osd_start; reg [21:0] osd_hcnt; + reg [21:0] osd_hcnt2; reg osd_de1,osd_de2; reg [1:0] osd_en; reg f1; + reg half; if(ce_pix) begin deD <= de_in; if(~&h_cnt) h_cnt <= h_cnt + 1'd1; - if(~&osd_hcnt) osd_hcnt <= osd_hcnt + 1'd1; + if(~&osd_hcnt) osd_hcnt <= osd_hcnt + 1'd1; + if(~&osd_hcnt2) osd_hcnt2 <= osd_hcnt2 + 1'd1; + if (h_cnt == h_osd_start) begin - osd_de[0] <= osd_en[1] && hrheight && (info ? (osd_vcnt < hrheight) : - (!osd_vcnt[11:7] || (osd_vcnt[11] && osd_vcnt[7] && (osd_vcnt[6:0] >= 4) && (osd_vcnt[6:0] < 19)))); + osd_de[0] <= osd_en[1] && osd_h && ( + osd_vcnt[11] ? (osd_vcnt[7] && (osd_vcnt[6:0] >= 4) && (osd_vcnt[6:0] < 19)) : + (info && (rot == 3)) ? !osd_vcnt[21:8] : + (osd_vcnt < osd_h) + ); osd_hcnt <= 0; + osd_hcnt2 <= 0; + if(info && rot == 1) osd_hcnt2 <= 22'd128-infoh; end - if (osd_hcnt+1 == (info ? infow : OSD_WIDTH)) osd_de[0] <= 0; + if (osd_hcnt+1 == osd_w) osd_de[0] <= 0; // falling edge of de if(!de_in && deD) dsp_width <= h_cnt[21:0]; @@ -169,7 +188,7 @@ always @(posedge clk_video) begin if(de_in && !deD) begin h_cnt <= 0; v_cnt <= v_cnt + 1'd1; - h_osd_start <= info ? infox : (((dsp_width - OSD_WIDTH)>>1) + OSD_X_OFFSET - 2'd2); + h_osd_start <= info ? (rot[0] ? infoy : infox) : (((dsp_width - osd_w)>>1) - 2'd2); if(h_cnt > {dsp_width, 2'b00}) begin v_cnt <= 1; @@ -179,21 +198,27 @@ always @(posedge clk_video) begin osd_en <= (osd_en << 1) | osd_enable; if(~osd_enable) osd_en <= 0; - if(v_cnt_below320) begin + half <= 0; + if(v_cnt_half) begin multiscan <= 0; - v_osd_start <= info ? infoy : v_osd_start_320; + v_osd_start <= info ? (rot[0] ? infox : infoy) : v_osd_start_h; + half <= 1; end - else if(v_cnt_below640) begin + else if(v_cnt_single | (rot[0] & v_cnt_double)) begin + multiscan <= 0; + v_osd_start <= info ? (rot[0] ? infox : infoy) : v_osd_start_s; + end + else if(rot[0] ? v_cnt_triple : v_cnt_double) begin multiscan <= 1; - v_osd_start <= info ? (infoy<<1) : v_osd_start_640; + v_osd_start <= info ? (rot[0] ? (infox<<1) : (infoy<<1)) : v_osd_start_d; end - else if(v_cnt_below960) begin + else if(v_cnt_triple | rot[0]) begin multiscan <= 2; - v_osd_start <= info ? (infoy + (infoy << 1)) : v_osd_start_960; + v_osd_start <= info ? (rot[0] ? (infox + (infox << 1)) : (infoy + (infoy << 1))) : v_osd_start_t; end else begin multiscan <= 3; - v_osd_start <= info ? (infoy<<2) : v_osd_start_other; + v_osd_start <= info ? (rot[0] ? (infox<<2) : (infoy<<2)) : v_osd_start_q; end end end @@ -201,14 +226,18 @@ always @(posedge clk_video) begin osd_div <= osd_div + 1'd1; if(osd_div == multiscan) begin osd_div <= 0; - if(~osd_vcnt[10]) osd_vcnt <= osd_vcnt + 1'd1; + if(~osd_vcnt[10]) osd_vcnt <= osd_vcnt + 1'd1 + half; if(osd_vcnt == 'b100010011111 && ~info) osd_vcnt <= 0; end - if(v_osd_start == v_cnt) {osd_div, osd_vcnt} <= OSD_HDR ? {~info, 3'b000, ~info, 7'b0000000} : 22'd0; + if(v_osd_start == v_cnt) begin + {osd_div,osd_vcnt} <= 0; + if(info && rot == 3) osd_vcnt <= 22'd256-infow; + else if(OSD_HDR && !rot) osd_vcnt <= {~info, 3'b000, ~info, 7'b0000000}; + end end - osd_byte <= osd_buffer[{osd_vcnt[7:3], osd_hcnt[7:0]}]; - osd_pixel <= osd_byte[osd_vcnt[2:0]]; + osd_byte <= osd_buffer[rot[0] ? ({osd_hcnt2[6:3], osd_vcnt[7:0]} ^ { {4{~rot[1]}}, {8{rot[1]}} }) : {osd_vcnt[7:3], osd_hcnt[7:0]}]; + osd_pixel <= osd_byte[rot[0] ? ((osd_hcnt2[2:0]-1'd1) ^ {3{~rot[1]}}) : osd_vcnt[2:0]]; osd_de[2:1] <= osd_de[1:0]; end end diff --git a/sys/sys_top.sdc b/sys/sys_top.sdc index 90d943d..7763fc8 100644 --- a/sys/sys_top.sdc +++ b/sys/sys_top.sdc @@ -35,3 +35,14 @@ set_false_path -to [get_ports {AUDIO_R}] set_false_path -to {cfg[*]} set_false_path -from {cfg[*]} set_false_path -to {wcalc[*] hcalc[*]} + +set_multicycle_path -to {*_osd|osd_vcnt*} -setup 2 +set_multicycle_path -to {*_osd|osd_vcnt*} -hold 2 +set_false_path -to {*_osd|v_cnt*} +set_false_path -to {*_osd|v_osd_start*} +set_false_path -to {*_osd|h_osd_start*} +set_false_path -from {*_osd|v_osd_start*} +set_false_path -from {*_osd|h_osd_start*} +set_false_path -from {*_osd|rot*} +set_false_path -from {*_osd|dsp_width*} +set_false_path -to {*_osd|half}