BT.656视频信号解码

 

BT.656协议标准

  ITU-R BT.601和ITU-R BT.656是ITU-R(国际电信联盟)制定的标准。严格来说ITU-R BT.656是ITU-R BT.601的一个子协议。

两种协议区别在于:

  ITU-R BT.601 16位数据传输;Y、U、V信号同时传输,是并行数据,行场同步信号单独输出;

  ITU-R BT.656 8/10位数据传输;不需要同步信号,串行数据传输,输出速率是601的2倍,先传Y,再传UV。行场同步信号嵌入在数据流中。

BT.656

  对于PAL制式分辨率为720*576来说,每一帧有576行,奇场288行,偶场288行;

  去隔行采用的方法:

  利用两片存储芯片,采用乒乓交替读写的方式来完成。实现步骤:首先将输入的第一帧图像奇场数据依次隔行存入存储器A中,然后再将偶数场数据隔行插入到存储器A中的奇场数据之间,这样A中就存入了一帧完整的视频帧。同样的方式将第二帧图像奇场和偶场数据依次存入到B中,在对B进行写操作的同时依次逐行从A中读出之前存入的第一帧图像数据。依次类推,通过乒乓操作方式保证存储器A和B分别工作在读写的状态,并不断切换即可完成隔行扫描到逐行扫描的转换。

凡是做模拟信号采集的,很少不涉及BT.656标准的,因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号,那么,BT.656到底是何种格式呢?
      本文将主要介绍 标准的 8bit BT656(4:2:2)YCbCr SDTV(标清)数字视频信号格式,主要针对刚刚入门模拟视频采集的初学者入门之用。
1.  帧的概念(Frame
    一个视频序列是由N个帧组成的,采集图像的时候一般有2种扫描方式,一种是逐行扫描(progressive scanning),一种是隔行扫描(interlaced scanning)。对于隔行扫描,每一帧一般有2个场(field),一个叫顶场(top field),一个叫底场(bottom field)。假设一帧图像是720行,那么,顶场就包含其中所有的偶数行,而底场则包含其中所有的奇数行。

2.  场的概念(field  

注意,上面提到顶场和底场,用的是“包含”二字,而不是说完全由后者组成,因为在BT.656标准中,一个场是由三个部分组成的:

场 = 垂直消隐顶场(First Vertical
Blanking) + 有效数据行(Active Video) + 垂直消隐底场(Second Vertical
Blanking)

对于顶场,有效数据行就是一帧图像的所有偶数行,而底场,有效数据行就是一帧图像的所有奇数行。顶场和底场的空白行的个数也有所不同,那么,对于一个标准的 8bit BT656(4:2:2)SDTV(标清)的视频而言,对于一帧图像,其格式定义如下:

由上图可以知道,对于PAL制式,每一帧有625行,其中,顶场有效数据288行,底场有效数据也是288行,其余行即为垂直消隐信号。为什么是288行?因为PAL制式的SDTV或者D1的分辨率为 720*576,即一帧有576行,故一场为288行。

由上图我们还可以知道,顶场有效数据的起始行为第23行,底场有效数据的起始行为第335行。

另外,上图中的 F 标记奇偶场,V标记 是否为垂直消隐信号。

3.  每一行的组成(Lines

下面说明每一行的组成,一行是由4个部分组成:

行 = 结束码(EAV) + 水平消隐(Horizontal Vertical
Blanking) + 起始码(SAV) + 有效数据(Active Video)

典型的一行数据组成如下图所示:

起始码(SAV)和结束码(EAV),它是标志着一行的开始结束的重要标记,也包含了其他的一些重要的信息,后面将会讲到。

为什么水平消隐 是280字节,这个我暂时还没搞清楚,不知道是不是标准定义的。

为什么一行中的有效数据是 1440 字节? 因为PAL制式的SDTV或者D1的分辨率为 720*576,即一行有720个有效点,由于采集的是彩色图像,那么一行就是由亮度信息(Y)和色差信息(CbCr)组成的,由于是 YCbCr422格式,故一行中有720列Y,720列CbCr,这样,一行的有效字节数就自然为 720 x 2 = 1440 字节了。

4.  EAVSAV

EAV和SAV都是4个字节(Bytes),由上面的图可以知道,SAV后面跟着的就是有效的视频数据了。那么,EAV和SAV的格式是怎么样的呢?

EAV和SAV的4个字节的格式规定如下(下面以16进制表示):FF 00 00 XY

其中,前三个字节为固定的,必须是FF 00 00,而第4个字节(XY)是根据场、消隐信息而定的,其8个bit含义如下: 1 F V H  P3 P2
P1 P0

其中,F:标记场信息,传输顶场时为0,传输底场时为1

V:标记消隐信息,传输消隐数据时为1,传输有效视频数据时为0

H:标记EAV还是SAV,SAV为0,EAV为1

而 P0~P3为保护比特,其值取决于F、H、V,起到校验的作用,计算方法如下:

8bit BT6564:2:2)数字视频信号数据进行解码

(注:bt.656视频信号的来源实际上是TW9912芯片输出的视频信号)

测试平台采用Alinx7020板卡,将转换得到的RGB数据以HDMI编码输出显示(参照板卡例程);测试结果图像显示起始有几行是黑条,考虑可能是模块中是从起始行就算有效数据,而bt.656逐行输出可能是从23行之后才是有效视频数据的,本人未做进一步测试;

创建RTL模块如下:

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date: 2020/05/09 11:09:41

// Design Name:

// Module Name: top

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//////////////////////////////////////////////////////////////////////////////////

module bt656_to_rgb

(

//
system reset

input               RST,              //  system reset

// BT656 input

input               CLK_i,            // 
clock

input  [7:0]         bt_data_i,        // 
video data

input               VSYNC_i,         //  bt656 vertical synchronization

input               HSYNC_i,         // 
bt656 horizontal synchronization

//
output

output                            post_frame_clk_o,  // 
pix_out_clock

output
 wire        post_frame_href,   //  Hs /de

output  wire        post_frame_vsync,  //  Vs

output                            Video_active,      //  data enable

output  wire[23:0]   post_img_rgb_0    //  video data output

);

//define

wire
clk27,clk54;

reg[10:0]
pixcnt_total;

reg[7:0]
Yreg,Crreg,Cbreg;

reg
hs_in_d;

reg [7:0]   pix_data;

reg [15:0]  pix_cnt;

reg       active_video;

reg [15:0]  row_cnt;

reg [2:0]   state;

reg        hs_, 
vs_,  hs_reg,  vs_reg;

wire [7:0]   R_o1  ,G_o1 
,B_o1;

reg  [7:0]  R_o2  ,G_o2 
,B_o2;

always @(posedge CLK_i or posedge RST)

begin

if(RST)

hs_in_d <= 0;

else

begin

hs_in_d <=
HSYNC_i;

end

end

reg        
active_video_de;

reg        
Video_active_reg;

//reg [2:0]   state;

always @(posedge CLK_i or posedge RST)

begin

if(RST) begin

pixcnt_total <= 0;

pix_cnt <= 0;

active_video_de <= 0;

row_cnt <= 0;

hs_ <= 0;

vs_ <= 0;

end

else

case(state)

3'd0:   begin

if(VSYNC_i) begin

state <= 3'd1;

end

end

3'd1:   begin

if(HSYNC_i &&
!hs_in_d) begin

pixcnt_total <=
0;

end

else begin

pixcnt_total <=
pixcnt_total + 1;

end

//720个像素 720个Y亮度分量,360个cb、cr色度分量 720*576

if((pixcnt_total >= 288)
&& (pixcnt_total <= 1728)) 
begin

pix_cnt <= pix_cnt + 1;

active_video_de <= 1;

end

else begin

pix_cnt <= 0;

active_video_de <= 0;

end

//行

if(pix_cnt == 1440)  begin

hs_ <= 1;

row_cnt <= row_cnt + 1;

end

else begin

hs_ <= 0;

end

if(row_cnt == 576)   begin

//if(row_cnt == 720)   begin

//if(row_cnt == 582)   begin

//if(row_cnt == 625)   begin

state <= 3'd0;

row_cnt <= 0;

vs_ <= 1;

Video_active_reg <= 1;

end

else begin

vs_ <= 0;

Video_active_reg <= 0;

end

end

endcase

end

assign
Video_active = Video_active_reg;

wire [7:0] post_img_red_0;                 
//Processed Image Red output

wire [7:0] post_img_green_0;                   //Processed Image Green
output

wire [7:0] post_img_blue_0;             //Processed Image Blue output

Video_Image_Processor u_Video_Image_Processor_0

(

//global clock

.clk                                        (CLK_i),                //cmos video pixel clock

.rst_n                                   (1),                              
//global reset

.per_frame_vsync             (vs_),                       //Prepared Image data vsync valid signal

.per_frame_href               (active_video_de),  
//Prepared Image data href vaild  signal

.per_frame_clken             (active_video_de),  
//Prepared Image data output/capture enable clock

.per_frame_YCbCr           (bt_data_i),      //Prepared
Image red data to be processed

//Image data has been processd

.post_frame_vsync           (post_frame_vsync),                 //Processed Image data vsync
valid signal

.post_frame_href             (post_frame_href),           //Processed
Image data href vaild  signal

.post_frame_clken           (),               //Processed
Image data output/capture enable clock

.post_img_red                            (post_img_red_0),                     //Processed Image Red output

.post_img_green                        (post_img_green_0),                    //Processed
Image Green output

.post_img_blue                           (post_img_blue_0)                     //Processed Image Blue output

);

assign
post_frame_clk_o = CLK_i;

assign
post_img_rgb_0 = {post_img_red_0,post_img_green_0,post_img_blue_0};

endmodule

子模块1如下:

/*-------------------------------------------------------------------------

|                                     Oooo                                                                     |

+-------------------------------oooO--(   )-----------------------------+

(   )   )
/

\ (   (_/

\_)

-----------------------------------------------------------------------*/

`timescale
1ns/1ns

module
Video_Image_Processor

(

//global clock

input                                     clk,                                      //cmos
video pixel clock

input                                     rst_n,                                   //global
reset

//Image data prepred to be processd

input                                     per_frame_vsync,   //Prepared Image data vsync valid signal

input                                     per_frame_href,                //Prepared Image data href
vaild  signal

input                                     per_frame_clken,    //Prepared Image data output/capture enable
clock

input                  [7:0] per_frame_YCbCr,  //Prepared Image data of YCbCr 4:2:2 {CbY} {CrY}

//Image data has been processd

output                                  post_frame_vsync, //Processed Image data vsync valid signal

output                                  post_frame_href,    //Processed Image data href vaild  signal

output                                  post_frame_clken,  //Processed Image data output/capture enable
clock

output               [7:0] post_img_red,                   //Processed
Image Red output

output               [7:0] post_img_green,              //Processed
Image Green output

output               [7:0] post_img_blue                   //Processed
Image Blue output

);

//-------------------------------------

//Convert the
YCbCr4:2:2 format to YCbCr4:4:4 format.

//CMOS YCbCr444 data output

wire                    post1_frame_vsync;        //Processed Image data vsync valid
signal

wire                    post1_frame_href;  //Processed Image data href vaild  signal

wire                    post1_frame_clken;         //Processed Image data output/capture
enable clock

wire [7:0] post1_img_Y;            //Processed Image data of YCbCr
4:4:4

wire [7:0] post1_img_Cb;                  //Processed Image data of
YCbCr 4:4:4

wire [7:0] post1_img_Cr;                   //Processed Image data of
YCbCr 4:4:4

VIP_YCbCr422_YCbCr444        u_VIP_YCbCr422_YCbCr444

(

//global clock

.clk                                        (clk),                                               //cmos
video pixel clock

.rst_n                                             (rst_n),                                 //system reset

//Image data prepred to be processd

.per_frame_vsync             (per_frame_vsync),          //Prepared
Image data vsync valid signal

.per_frame_href                         (per_frame_href),             //Prepared Image data href vaild  signal

.per_frame_clken             (per_frame_clken),           //Prepared
Image data output/capture enable clock

.per_frame_YCbCr           (per_frame_YCbCr),                  //Prepared
Image red data to be processed

//Image data has been processd

.post_frame_vsync           (post1_frame_vsync),      //Processed Image data vsync valid signal

.post_frame_href             (post1_frame_href),                  //Processed
Image data href vaild  signal

.post_frame_clken           (post1_frame_clken),      //Processed Image data output/capture
enable clock

.post_img_Y                                (post1_img_Y),                           //Processed Image brightness output

.post_img_Cb                    (post1_img_Cb),                         //Processed
Image blue shading output

.post_img_Cr                     (post1_img_Cr)                           //Processed
Image red shading output

);

//-------------------------------------

//Convert the
YCbCr444 format to RGB888 format.

VIP_YCbCr444_RGB888  u_VIP_YCbCr444_RGB888

(

//global clock

.clk                                        (clk),                                               //cmos
video pixel clock

.rst_n                                             (rst_n),                                 //system reset

//Image data prepred to be processd

.per_frame_vsync             (post1_frame_vsync),      //Prepared
Image data vsync valid signal

.per_frame_href                         (post1_frame_href),                  //Prepared Image data href vaild  signal

.per_frame_clken             (post1_frame_clken),      //Prepared
Image data output/capture enable clock

.per_img_Y                                  (post1_img_Y),                           //Prepared Image data
of Y

.per_img_Cb                                (post1_img_Cb),                         //Prepared Image data
of Cb

.per_img_Cr                                (post1_img_Cr),                         //Prepared Image data
of Cr

//Image data has been processd

.post_frame_vsync           (post_frame_vsync),                 //Processed Image data vsync
valid signal

.post_frame_href             (post_frame_href),           //Processed
Image data href vaild  signal

.post_frame_clken           (post_frame_clken),                  //Processed Image data
output/capture enable clock

.post_img_red                            (post_img_red),                          //Prepared Image green data to be processed

.post_img_green                        (post_img_green),            //Prepared Image green data to be processed

.post_img_blue                           (post_img_blue)                         //Prepared Image blue data to be processed

);

Endmodule

子模块2如下:

`timescale 1ns/1ns

module VIP_YCbCr422_YCbCr444

(

         //global
clock

         input                                    clk,                                     //cmos
video pixel clock

         input                                    rst_n,                                   //global
reset

 

         //CMOS
16Bit YCbCr data input:   {CbYCrYCbYCrY}

         input                                    per_frame_vsync,  //Prepared Image data vsync valid signal

         input                                    per_frame_href,               //Prepared Image data href
vaild  signal

         input                                    per_frame_clken,   //Prepared Image data output/capture enable
clock        

         input                 [7:0]         per_frame_YCbCr,   //Prepared
Image data of YCbCr 4:2:2 CbYCrY

        

         //CMOS
YCbCr444 data output

         output                                 post_frame_vsync,         //Processed Image data vsync valid
signal

         output                                 post_frame_href,   //Processed Image data href vaild  signal

         output                                 post_frame_clken, //Processed Image data output/capture enable
clock      

         output     reg   [7:0]         post_img_Y,                       //Processed Image data of YCbCr 4:4:4

         output     reg   [7:0]         post_img_Cb,          //Processed Image data of YCbCr 4:4:4

         output     reg   [7:0]         post_img_Cr                      //Processed Image data of YCbCr 4:4:4

);

 

//------------------------------------------

//lag n pixel clocks

reg   [4:0]         post_frame_vsync_r;

reg   [4:0]         post_frame_href_r;

reg   [4:0]         post_frame_clken_r;

always@(posedge clk or negedge rst_n)

begin

         if(!rst_n)

                   begin

                   post_frame_vsync_r
    <=   0;

                   post_frame_href_r
       <=   0;

                   post_frame_clken_r
     <=   0;

                   end

         else

                   begin

                   post_frame_vsync_r
    <=   {post_frame_vsync_r[3:0],
per_frame_vsync};

                   post_frame_href_r
       <=   {post_frame_href_r[3:0], per_frame_href};

                   post_frame_clken_r
     <=   {post_frame_clken_r[3:0], per_frame_clken};

                   end

end

assign      post_frame_vsync
        =      post_frame_vsync_r[4];

assign      post_frame_href
  =      post_frame_href_r[4];

assign      post_frame_clken
         =      post_frame_clken_r[4];

wire yuv_process_href  =      per_frame_href
|| post_frame_href_r[3];

wire yuv_process_clken         =      per_frame_clken
|| post_frame_clken_r[3];

 

 

 

//-------------------------------------------

//convert YCbCr422 to YCbCr444

reg   [3:0]         yuv_state;

reg   [7:0]         mY0, mY1, mY2, mY3;

reg   [7:0]         mCb0, mCb1;

reg   [7:0]         mCr0, mCr1;

always@(posedge clk or negedge rst_n)

begin

         if(!rst_n)

                   begin

                   yuv_state
<= 4'd0;

                   {mY0,
mCb0, mCr0} <= {8'h0, 8'h0, 8'h0};

                   mY1
<= 8'h0;

                   {mY2,
mCb1, mCr1} <= {8'h0, 8'h0, 8'h0};

                   mY3 <= 8'h0;

                   {post_img_Y,
post_img_Cb, post_img_Cr} <= {8'h0, 8'h0, 8'h0};

                   end

         else
if(yuv_process_href)       //lag 2 data
enable clock and need 2 more clocks

                   begin

                   if(yuv_process_clken)    //lag 2 data enable clock and need 2 more
clocks

                            case(yuv_state)                //---YCbCr

                            4'd0:         begin        //reg
p0

                                                  yuv_state <= 4'd1;   

                                                  {mCb0} <= per_frame_YCbCr; 

                                               end          

                            4'd1:         begin        //reg
p1

                                                  yuv_state <= 4'd2;   

                                                  {mY0} <= per_frame_YCbCr;    

                                               end          

                            4'd2:         begin        //p0;        reg p2

                                                  yuv_state <= 4'd3;   

                                                  {mCr0} <= per_frame_YCbCr;  

                                               end 

                            4'd3:         begin        //p1;        reg p4

                                                  yuv_state <= 4'd4;   

                                                  {mY1} <= per_frame_YCbCr;    

                                               end 

                                              

                            4'd4:         begin        //p2;        reg   p0

                                                  yuv_state <= 4'd5;   

                                                  {mCb1} <= per_frame_YCbCr; 

                                                  {post_img_Y, post_img_Cb, post_img_Cr} <=
{mY0, mCb0, mCr0};      

                                               end           //p4;        reg
p1

                            4'd5:         begin       

                                                  yuv_state <= 4'd6;   

                                                  {mY2} <= per_frame_YCbCr;    

                                                  {post_img_Y, post_img_Cb, post_img_Cr}
<=  {mY1, mCb0, mCr0};  

                                               end 

                            4'd6:         begin        //p2;        reg   p0

                                                  yuv_state <= 4'd7;   

                                                  {mCr1} <= per_frame_YCbCr;  

                                               end           //p4;        reg
p1

                            4'd7:         begin       

                                                  yuv_state <= 4'd8;   

                                                  {mY3} <= per_frame_YCbCr;    

                                               end

                                              

                            4'd8:         begin        //p2;        reg   p0

                                                  yuv_state <= 4'd9;   

                                                  {mCb0} <= per_frame_YCbCr; 

                                                  {post_img_Y, post_img_Cb, post_img_Cr} <=
{mY2, mCb1, mCr1};      

                                               end           //p4;        reg
p1

                            4'd9:         begin       

                                                  yuv_state <= 4'd10;

                                                  {mY0} <= per_frame_YCbCr;    

                                                  {post_img_Y, post_img_Cb, post_img_Cr}
<=  {mY3, mCb1, mCr1};  

                                               end 

                            4'd10:       begin        //p2;        reg   p0

                                                  yuv_state <= 4'd11;

                                                  {mCr0} <= per_frame_YCbCr;  

                                               end           //p4;        reg
p1

                            4'd11:       begin       

                                                  yuv_state <= 4'd4;   

                                                  {mY1} <= per_frame_YCbCr;    

                                               end

                            endcase

                   else

                            begin

                                yuv_state <= yuv_state;

                                {mY0, mCb0, mCr0} <= {mY0, mCb0, mCr0};

                                mY1 <= mY1;

                                {mY2, mCb1, mCr1} <= {mY2, mCb1, mCr1};

                                mY3 <=
mY3;

                                {post_img_Y, post_img_Cb, post_img_Cr}
<= {post_img_Y, post_img_Cb, post_img_Cr};

                            end

                   end

         else

                   begin

                      yuv_state <= 3'd0;

                      {mY0, mCb0, mCr0} <= {8'h0, 8'h0, 8'h0};

                      {mY1, mCb1, mCr1} <= {8'h0, 8'h0, 8'h0};

                      {post_img_Y, post_img_Cb, post_img_Cr} <=
{8'h0, 8'h0, 8'h0};

                   end

end

endmodule

 

 

子模块3如下:

`timescale 1ns/1ns

module VIP_YCbCr444_RGB888

(

         //global
clock

         input                                    clk,                                     //cmos
video pixel clock

         input                                    rst_n,                                   //global
reset

 

         //CMOS
YCbCr444 data output

         input                                    per_frame_vsync,  //Prepared Image data vsync valid signal

         input                                    per_frame_href,               //Prepared Image data href
vaild  signal

         input                                    per_frame_clken,   //Prepared Image data output/capture enable
clock        

         input                 [7:0]         per_img_Y,                         //Prepared
Image data of Y

         input                 [7:0]         per_img_Cb,                      //Prepared
Image data of Cb

         input                 [7:0]         per_img_Cr,                       //Prepared
Image data of Cr

 

        

         //CMOS
RGB888 data output

         output                                 post_frame_vsync,         //Processed Image data vsync valid
signal

         output                                 post_frame_href,   //Processed Image data href vaild  signal

         output                                 post_frame_clken, //Processed Image data output/capture enable
clock

         output              [7:0]         post_img_red,                  //Prepared
Image green data to be processed  

         output              [7:0]         post_img_green,             //Prepared
Image green data to be processed

         output              [7:0]         post_img_blue                 //Prepared
Image blue data to be processed

);

 

//--------------------------------------------

/*********************************************

         R =
1.164(Y-16) + 1.596(Cr-128)

         G =
1.164(Y-16) - 0.391(Cb-128) - 0.813(Cr-128)

         B =
1.164(Y-16) + 2.018(Cb-128)

         ->

         R =
1.164Y + 1.596Cr - 222.912

         G =
1.164Y - 0.391Cb - 0.813Cr + 135.488

         B =
1.164Y + 2.018Cb - 276.928

         ->

         R
<< 9 = 596Y                               +
     817Cr        -        114131

         G
<< 9 = 596Y  -        200Cb       -        416Cr        +       69370

         B
<< 9 = 596Y   +       1033Cb                                -        141787

**********************************************/

reg   [19:0]       img_Y_r1;                                   //8 + 9 + 1 = 18Bit

reg   [19:0]       img_Cb_r1, img_Cb_r2;

reg   [19:0]       img_Cr_r1, img_Cr_r2;

always@(posedge clk or negedge rst_n)

begin

         if(!rst_n)

                   begin

                   img_Y_r1
<= 0;

                   img_Cb_r1
<= 0;      img_Cb_r2 <= 0;     

                   img_Cr_r1
<= 0; img_Cr_r2 <= 0;

                   end

         else

                   begin

                   img_Y_r1 <=   per_img_Y
* 18'd596;

                   img_Cb_r1
     <=   per_img_Cb * 18'd200; 

                   img_Cb_r2       <=     per_img_Cb
* 18'd1033;        

                   img_Cr_r1
      <=   per_img_Cr * 18'd817;  

                   img_Cr_r2        <=     per_img_Cr
* 18'd416;

                   end

end

 

//--------------------------------------------

/**********************************************

         R
<< 9 = 596Y                               +
     817Cr        -        114131

         G
<< 9 = 596Y  -        200Cb       -        416Cr        +       69370

         B
<< 9 = 596Y   +       1033Cb                                -        141787

**********************************************/

reg   [19:0]       XOUT;    

reg   [19:0]       YOUT;

reg   [19:0]       ZOUT;

always@(posedge clk or negedge rst_n)

begin

         if(!rst_n)

                   begin

                   XOUT
<= 0;    

                   YOUT
<= 0;

                   ZOUT
<= 0;

                   end

         else

                   begin

                   XOUT
<= (img_Y_r1 + img_Cr_r1 - 20'd114131)>>9;    

                   YOUT
<= (img_Y_r1 - img_Cb_r1 - img_Cr_r2 + 20'd69370)>>9;

                   ZOUT
<= (img_Y_r1 + img_Cb_r2 - 20'd141787)>>9;

                   end

end

 

//------------------------------------------

//Divide 512 and get the result

//{xx[19:11], xx[10:0]}

reg   [7:0]         R, G, B;

always@(posedge clk or negedge rst_n)

begin

         if(!rst_n)

                   begin

                   R
<= 0;

                   G
<= 0;

                   B
<= 0;

                   end

         else

                   begin

                   R
<= XOUT[10] ? 8'd0 : (XOUT[9:0] > 9'd255) ? 8'd255 : XOUT[7:0];

                   G
<= YOUT[10] ? 8'd0 : (YOUT[9:0] > 9'd255) ? 8'd255 : YOUT[7:0];

                   B
<= ZOUT[10] ? 8'd0 : (ZOUT[9:0] > 9'd255) ? 8'd255 : ZOUT[7:0];

                   end

end

 

//------------------------------------------

//lag n clocks signal sync      

reg   [2:0]         post_frame_vsync_r;

reg   [2:0]         post_frame_href_r;

reg   [2:0]         post_frame_clken_r;

always@(posedge clk or negedge rst_n)

begin

         if(!rst_n)

                   begin

                   post_frame_vsync_r
    <=   0;

                   post_frame_href_r
       <=   0;

                   post_frame_clken_r
     <=   0;

                   end

         else

                   begin

                   post_frame_vsync_r
    <=   {post_frame_vsync_r[1:0],
per_frame_vsync};

                   post_frame_href_r
       <=   {post_frame_href_r[1:0],     per_frame_href};

                   post_frame_clken_r
     <=   {post_frame_clken_r[1:0], per_frame_clken};

                   end

end

assign      post_frame_vsync
        =      post_frame_vsync_r[2];

assign      post_frame_href
  =      post_frame_href_r[2];

assign      post_frame_clken
         =      post_frame_clken_r[2];

assign      post_img_red =       post_frame_href
? R : 8'd0;

assign 
post_img_green       =       post_frame_href ? G : 8'd0;

assign 
post_img_blue          =       post_frame_href ? B : 8'd0;

endmodule

最新文章

  1. C语言中的栈和堆
  2. linux c++应用程序内存高或者占用CPU高的解决方案_20161213
  3. Java 泛型约束
  4. uva 10934(dp)
  5. 【菜鸟学习jquery源码】数据缓存与data()
  6. Xcode 7中http通信出现如下错误:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app&#39;s Info.plist file.
  7. SQL存储过程的调用及写法
  8. 在腾讯云上创建您的SQL Cluster(4)
  9. LVDS,MIPI,EDP
  10. mysql 添加字段、删除字段、调整字段顺序 转
  11. 应用程序如何找到DLL文件?
  12. QF——iOS代理模式
  13. Socket 文件传输
  14. netty对http协议解析原理解析
  15. 推荐几个可以从google play(谷歌应用商店)直接下载原版APP的网站
  16. ubuntu安装steam
  17. nginx ipv4 ipv6 chrome /firefox remote-address/chrome://net-internals/dns
  18. [leetcode]250. Count Univalue Subtrees统计节点值相同的子树
  19. WP模板
  20. windows 常用cmd命令

热门文章

  1. linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (二)
  2. 循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
  3. [译]Tus 协议
  4. pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
  5. eatwhatApp开发实战(十一)
  6. [PHP动态]0001.关于 PHP 7 你必须知道的五件事
  7. 01 . 分布式存储之FastDFS简介及部署
  8. 从汉堡加料说起——浅谈C#中的Decorator模式
  9. Rocket - debug - TLDebugModuleInner - HARTINFO
  10. Spring Boot笔记(一) springboot 集成 swagger-ui