视频时序与BT1120的关系 FPGA实现BT.1120编码
CEA-861-D視頻時序:
水平方向對比:
垂直方向對比:
BT.1120整體數據格式:
具體實現可參考我另外一篇文章《FPGA實現BT.1120編碼》。
僅作參考,modulesim仿真通過,未做時序優化
研究了兩天的BT1120規范,以及CEA-861-D視頻時序,找到了一些對應關系(見我另外一篇文章《視頻時序與BT1120的關系》)。于是寫了如下的verilog代碼,可對接sii9134芯片的行場內嵌方式,其中sii9134配置C代碼如下:
void sii9134_init(void) {u8 u8Data = 0;I2C_WriteByte(0x05, 0x08, 0x72); //value reg_addr device_addrI2C_ReadByte(&u8Data, sizeof(u8), 0x33, 0x72);I2C_WriteByte(u8Data & 0x8f, 0x33, 0x72);I2C_WriteByte(0x6e, 0x40, 0x72);I2C_WriteByte(0x28, 0x44, 0x72);I2C_WriteByte(0x00, 0x45, 0x72);I2C_WriteByte(0x05, 0x46, 0x72);I2C_WriteByte(0x05, 0x47, 0x72);I2C_WriteByte(0x30, 0x48, 0x72);I2C_WriteByte(0x3d, 0x4a, 0x72); }FPGA實驗板使用黑金的AV6045開發板。
FPGA端的bt1120 verilog代碼如下(行場同步信號hsync和vsync為高電平有效):
另外,如果發現像素數據為0xff或0x00則需要替換為0xfe和0x01,防止對端誤判。(本文沒有做這一步)
>? /*** author : mkelehk@gmail.com* time : 2017/8/28* function : ycbcr4:2:2 embed_hs_vs encoder module, compatible bt.1120** 定時基準碼 <0xff 0x00 0x00 xxx>* 其中xxx為如下的取值范圍:* 1 0 1 0 1 0 1 1 0 0 0xab(幀消隱期間,SAV內)* 1 0 1 1 0 1 1 0 0 0 0xb6(幀消隱期間,EAV內)* 1 0 0 0 0 0 0 0 0 0 0x80(視頻有效區時間,SAV內)* 1 0 0 1 1 1 0 1 0 0 0x9d(視頻有效區時間,EAV內)*/`timescale 1ns / 100ps module embed_hs_vs_enc(input rst,input yc422_pclk_i,input [15:0] yc422_data_i,input yc422_de_i,input yc422_vs_i,input yc422_hs_i,//--------------------------------------------------------//視頻時序參數,由CPU 通過i2c配置得到input [11:0] width_i, // linput [11:0] height_i, //input [11:0] hs_rising_to_de_i,input [11:0] hor_total_g_i,input [11:0] vs_rising_to_de_i, //L2input [11:0] ver_total_g_i, //L6//----------------------------------------------------------input video_pararm_enable_i, //----------------------------------------------------------//bt.1120接口output embed_hs_vs_pclk_o,output reg[15:0] embed_hs_vs_yc422_o);//狀態機狀態localparam INVAILD_BLANKING = 4'd0;localparam VAILD_VIDEO = 4'd1;localparam SYNC1_SAV = 4'd2;localparam SYNC2_SAV = 4'd3;localparam SYNC3_SAV = 4'd4;localparam SYNC1_EAV = 4'd5;localparam SYNC2_EAV = 4'd6;localparam SYNC3_EAV = 4'd7;localparam SAV_BKANKING = 4'd8;localparam EAV_BKANKING = 4'd9;localparam SAV_VIDEO = 4'd10;localparam EAV_VIDEO = 4'd11;//在行場消隱區填充STUFFlocalparam STUFF = 16'h8010;wire hs_rising; //rising or fallingwire vs_rising;reg [11:0] vs_cnt;//場計數器reg [11:0] hs_cnt;//行計數器//復位信號要處理好,否則以下寄存器值未初始化reg [11:0] width_g;reg [11:0] height_g;reg [11:0] hs_rising_to_de_g;reg [11:0] hor_total_g;reg [11:0] vs_rising_to_de_g;reg [11:0] ver_total_g;reg [3:0]state_cs;//當前狀態 需注意寄存器變量的位寬,防止溢出reg [3:0]state_ns;//下一個狀態//對信號進行延時操作,打1拍//reg[15:0] yc422_data_d1;reg yc422_de_d1;reg yc422_vs_d1;reg yc422_hs_d1;always @(posedge yc422_pclk_i)beginif(rst) begin//yc422_data_d1 <= 16'h00;yc422_de_d1 <= 1'b0;yc422_vs_d1 <= 1'b0;yc422_hs_d1 <= 1'b0;end else begin//yc422_data_d1 <= yc422_data_i;yc422_de_d1 <= yc422_de_i;yc422_vs_d1 <= yc422_vs_i;yc422_hs_d1 <= yc422_hs_i;endendassign embed_hs_vs_pclk_o = yc422_pclk_i;assign hs_rising = ~yc422_hs_d1 & yc422_hs_i; assign vs_rising = ~yc422_vs_d1 & yc422_vs_i;always @(posedge yc422_pclk_i)beginif(rst) beginwidth_g <= 12'd1920;height_g <= 12'd1080;hs_rising_to_de_g <= 12'd192;hor_total_g <= 12'd2200;vs_rising_to_de_g <= 12'd41;ver_total_g <= 12'd1125;end else if(video_pararm_enable_i)beginwidth_g <= width_i;height_g <= height_i;hs_rising_to_de_g <= hs_rising_to_de_i;hor_total_g <= hor_total_g_i;vs_rising_to_de_g <= vs_rising_to_de_i;ver_total_g <= ver_total_g_i;endend//行計數always @(posedge yc422_pclk_i)beginif(rst) hs_cnt <= 0;else if(hs_rising || video_pararm_enable_i)hs_cnt <= 0;else if(hs_cnt == hor_total_g - 1'b1)hs_cnt <= 0;elsehs_cnt <= hs_cnt + 1'b1;end//幀計數always @(posedge yc422_pclk_i)beginif(rst) vs_cnt <= 0;else if(vs_rising || video_pararm_enable_i) vs_cnt <= 0;else if(hs_cnt == hor_total_g - 1'b1)if(vs_cnt == ver_total_g - 1'b1)vs_cnt <= 0;elsevs_cnt <= vs_cnt + 1'b1;else vs_cnt <= vs_cnt;endalways @(posedge yc422_pclk_i)beginif(rst)state_cs <= INVAILD_BLANKING;elsestate_cs <= state_ns;endalways @(*)begincase(state_cs)INVAILD_BLANKING : beginif(hs_cnt == hs_rising_to_de_g - 3'd6) //SAV 提前4個時鐘,因為SAV和EAV要包含4個時鐘周期,并且補償state_cs和第三段帶來的2拍延時state_ns = SYNC1_SAV;else if(hs_cnt == hs_rising_to_de_g + width_g - 3'd2) //EAV 不需要提前4個時鐘,但需要補償state_cs和第三段帶來的2拍延時state_ns = SYNC1_EAV;elsestate_ns = INVAILD_BLANKING;end//SAV部分SYNC1_SAV : state_ns = SYNC2_SAV;SYNC2_SAV : state_ns = SYNC3_SAV;SYNC3_SAV : if((vs_cnt >= vs_rising_to_de_g - 1'b1) && (vs_cnt <= height_g + vs_rising_to_de_g - 1'b1))//VILD_VIDEOstate_ns = SAV_VIDEO;elsestate_ns = SAV_BKANKING;//EAV部分SYNC1_EAV : state_ns = SYNC2_EAV;SYNC2_EAV : state_ns = SYNC3_EAV;SYNC3_EAV :if((vs_cnt >= vs_rising_to_de_g - 1'b1) && (vs_cnt <= height_g + vs_rising_to_de_g - 1'b1))//VILD_VIDEOstate_ns = EAV_VIDEO;elsestate_ns = EAV_BKANKING;SAV_BKANKING : state_ns = INVAILD_BLANKING;EAV_BKANKING : state_ns = INVAILD_BLANKING;SAV_VIDEO : state_ns = VAILD_VIDEO;EAV_VIDEO : state_ns = INVAILD_BLANKING;VAILD_VIDEO :if(hs_cnt == hs_rising_to_de_g + width_g - 1'b1 - 1'b1)state_ns = SYNC1_EAV;//去EAV部分elsestate_ns = VAILD_VIDEO;default :state_ns = INVAILD_BLANKING;endcaseendalways @(posedge yc422_pclk_i)beginif(rst)embed_hs_vs_yc422_o <= STUFF;else beginif(state_cs == INVAILD_BLANKING)embed_hs_vs_yc422_o <= STUFF;else if(state_cs == VAILD_VIDEO)embed_hs_vs_yc422_o <= yc422_data_i; //yc422_data_d1else if((state_cs == SYNC1_SAV) || (state_cs == SYNC1_EAV))embed_hs_vs_yc422_o <= 16'hffff;else if((state_cs == SYNC2_SAV) || (state_cs == SYNC2_EAV))embed_hs_vs_yc422_o <= 16'h0000;else if((state_cs == SYNC3_SAV) || (state_cs == SYNC3_EAV))embed_hs_vs_yc422_o <= 16'h0000;else if(state_cs == SAV_BKANKING)embed_hs_vs_yc422_o <= 16'habab;else if(state_cs == EAV_BKANKING)embed_hs_vs_yc422_o <= 16'hb6b6;else if(state_cs == SAV_VIDEO)embed_hs_vs_yc422_o <= 16'h8080;else if(state_cs == EAV_VIDEO)embed_hs_vs_yc422_o <= 16'h9d9d;elseembed_hs_vs_yc422_o <= STUFF;endendendmodule例化后就能使用了
```c embed_hs_vs_enc U_embed_hs_vs_enc_0( . rst(rst),. yc422_pclk_i(video_clk_148m5),
. yc422_data_i({yc_c,yc_y}),
. yc422_de_i(yc_de),
. yc422_vs_i(yc_vs),
. yc422_hs_i(yc_hs),
//--------------------------------------------------------
//視頻時序參數,由CPU 通過i2c配置得到
. width_i(12’d1920), // l
. height_i(12’d1080), //
. hs_rising_to_de_i(12’d192),
. hor_total_g_i(12’d2200),
. vs_rising_to_de_i(12’d41), //L2
. ver_total_g_i(12’d1125), //L6
//----------------------------------------------------------
. video_pararm_enable_i(video_pararm_enable),
//----------------------------------------------------------
//bt.1120接口
. embed_hs_vs_pclk_o(bt1120_clk),
. embed_hs_vs_yc422_o(bt1120_yc)
);
總結
以上是生活随笔為你收集整理的视频时序与BT1120的关系 FPGA实现BT.1120编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql弄丢初始密码_MySql密码丢
- 下一篇: c++ 静态变量赋值_Python变量及