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

BT.656视频信号解码的更多相关文章

  1. 标准BT.656并行数据结构

    转自网络,感谢原作者和转载者. 还有参考:百科http://baike.baidu.com/link?url=bqBT3S7pz_mRJoQE7zkE0K-R1RgQ6FmHNOZ0EjhlSAN_o ...

  2. ITU-R BT.656 协议

    ITU-R BT.601和ITU-R BT.656国际电信联盟(International Telecommunication Union)无线通信部门(ITU-R)制定的标准.严格来说,ITU-R ...

  3. BT.656

    转自http://www.cnblogs.com/s_agapo/archive/2012/04/08/2437775.html 凡是做模拟信号采集的,很少不涉及BT.656标准的,因为常见的模拟视频 ...

  4. BT.656 NTSC制式彩条生成模块(verilog)

    BT.656 NTSC制式彩条生成模块(verilog) 1.知识储备 隔行扫描是将一副图像分成两场扫描,第一场扫描第1,2,5,7...等奇数行,第二场扫描2,4,6,8...等偶数行,并把扫奇数行 ...

  5. [转载]BT656/BT601/BT1120协议

     [转载] BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明   ITU-R BT.601和ITU-RBT.656国际电信联盟(Interna ...

  6. 转接口IC GM7150BN/ GM7150BC:CVBS转BT656芯片 低功耗NTSC/PAL 视频解码器

    1 概述    GM7150 是一款9 位视频输入预处理芯片,该芯片采用CMOS 工艺,通过I2C 总线与PC 或DSP 相连构成应用系统.    它内部包含1 个模拟处理通道,能实现CVBS.S-V ...

  7. BT656跟BT1120和BT709有什么区别

    601是SDTV的数据结构 656是SDTV的interface709是HDTV的数据结构 1120是HDTV的interface从数据结构上 都是Y Cb Cr只是SDTV用4:2:2   HDTV ...

  8. 达芬奇TI DVSDK之视频数据流过程分析

    作者:openwince@gmail.com 博客:http://www.cnblogs.com/tinz    本文的copyright归openwince@gmail.com所有,使用GPL发布, ...

  9. 基于DM642 RAW采集格式的视频驱动开发及应用

    摘 要:为解决C64X系列数字信号处理器(DSP)视频驱动不能应用于原始数据格式(RAW)采集格式的问题,设计了DM642和电耦合元件(CCD)高清传感器的数据传输接口,并分析.修改用于标准格式的视频 ...

随机推荐

  1. 深入剖析ThreadLocal原理

    描述 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储.ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量. 通常使用静态的变 ...

  2. Visual Studio 2019 Professional 激活

    Visual Studio 2019 Professional下载地址>https://visualstudio.microsoft.com/zh-hant/thank-you-download ...

  3. 软链接 vs. 硬链接

    ​链接大家都用过,比如 Windows 中的快捷方式就是一种链接,可是 Linux 里又分硬链接和软链接,它们表示什么意思,又有什么区别呢,本文来给大家做一个解释. Inode 索引节点 要想理解硬链 ...

  4. java-五大内存图

    jrm—Java虚拟机在进行程序运行时会向cpu申请一个内存约为10%左右,该内存被jrm分为5大区域 一:栈内存(stack)用来存储变量 当栈消失时,变量也随之消失.二:堆内存(heap)在Jav ...

  5. Java 基础系列知识梳理

  6. Kivy中显示汉字的问题

    1. kivy中显示中文乱码和提示错误的原因: 编码问题 字体问题 2. 字体问题的解决 可以下载支持中文的字体文件ttf,我这里使用了微软雅黑中文简体msyh.ttf.我们在编写布局时可以直接在相关 ...

  7. JavaScript 实现 冒泡排序

        <script>         //数组排序(冒泡排序)         //冒泡排序是一种算法,把一系列的数据按照一定的循序进行排列显示(从小到大或从大到小)          ...

  8. 【JVM】如何理解强引用、软引用、弱引用、虚引用?

    整体架构 强引用 强引用是默认支持,当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会回收对象. 强引用是最常见的普通对象引用,只要还有强引用指向对象,对象就存活,垃圾回 ...

  9. jchdl - GSL Node

    https://mp.weixin.qq.com/s/Oa4qgjIUccu5Y-Jlqcyn_A   org.jchdl.model.gsl.core.meta.Node.java   ​​ gen ...

  10. 使用Python代码制作GIF动态图

    使用Python  PIL.Image 制作GIF图片: import  PIL.Image                      相关模块 img = Image.open(img_name)  ...