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)
);

这段代码看后,用了一个三段式状态机来实现行场时序的转换,相当清晰。其中, video_pararm_enable_i这个输入,代码中是用了|| 操作来对这个模块实现使能,如实现画面的黑屏,可以使用这个位,按道理来说,改为&&是好的。

视频时序与BT1120的关系 FPGA实现BT.1120编码相关推荐

  1. 视频时序与BT1120的关系

    CEA-861-D视频时序: 水平方向对比: 垂直方向对比: BT.1120整体数据格式: 具体实现可参考我另外一篇文章<FPGA实现BT.1120编码>.

  2. 视频时序动作识别(video action recognition)介绍

    一.视频时序动作识别算法分类 根据网络的工作方式,可以将视频时序动作识别算法大致分为四大类: 采用2D卷积的方法 采用3D卷积的方法 双流法 引入VLAD的方法 1.1 采用2D卷积的方法 <T ...

  3. (65)FPGA面试题-状态机编码选择原则?

    1.1 FPGA面试题-状态机编码选择原则? 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-状态机编码选择原则: 5)结束语. 1.1.2 本节引言 & ...

  4. Android音视频开发,详说PCM音频重采样、PCM编码

    直播伴音,两种数据能否合在一起?不能叠加在一起 会有噪音 合并以后 再去编码推流 直播的例子 客户端播放器,可以开启多个播放器 对于我们重采样 很多时候就是为了统一格式,就是为了要合并这个流,去推送, ...

  5. 快速分割任何视频 Flv 音频aac wma等等文件,无需重新编码

    快速分割任何视频 Flv 音频aac wma等等文件,无需重新编码 http://www.rin9.com/read.php?tid=761469 图片:  图片:  软件大小:4.2MB 软件语言: ...

  6. iOS RTMP 视频直播开发笔记(3)- 了解 H.264 编码

    iOS RTMP 视频直播开发笔记(3)- 了解 H.264 编码 本节内容整理自:H264–1–编码原理以及I帧B帧P帧,作者:dxpqxb H264是一种高压缩率的编码标准,如何压缩嘞?一般的视频 ...

  7. cvpr 注意力机制_视频人员重识别:关系引导空间注意力 + 时间特征提取模型

    作者 | Ass 编辑 | CV君 报道 | 我爱计算机视觉(微信id:aicvml) 2020 年顶会论文中,很多都会将关系加入到注意力机制的获取中. 除了该文,还有 2020 年 CVPR 的基于 ...

  8. VALSE学习(十二):视频时序建模和动作识别

    VALSE2019 王利民 南京大学 一.基于视频的时序建模和动作识别方法 当前视频行为识别主要是在三种场景: In the Lab In TV,Movies In web videos 视频动作识别 ...

  9. 音频线视频线和同轴电缆的关系(同轴线除了外面的屏蔽网还有中间的绝缘塑料体,而音频线一般只有外面的屏蔽网)

    最新音频线.视频线.屏蔽线和同轴电缆的关系知识讲解

  10. 8k,4k,2k视频时序参数分享

    本文讲述下8K,4K,2K等视频的时序,并附上一部分时序图. 视频分辨率 刷新率 H_FP H_SYNC H_BP H_ACITVE H_TOTAL H_POL V_BP V_SYNC V_FP V_ ...

最新文章

  1. linux kernel list_head
  2. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )
  3. servlet容器_Servlet详解(一)之基本概念
  4. python时间计算_python计算两日期之间工作日时长
  5. linux 修改hba参数,更改Raid卡和HBA卡在linux下的启动顺序
  6. Ext.Window更换iframe的地址
  7. 使用Echarts绘制省份地图源码
  8. double、float、long占几个字节?
  9. matlab幅度归一化,matlab归一化方法
  10. 第22.7节 性能篇-使用八叉树结构来管理场景
  11. VoLTE业务端到端流程
  12. matlab中sum函数的使用
  13. Laravel文档阅读笔记-How to use @auth and @guest directives in Laravel
  14. fsadfsaddfsadfsafsda
  15. 考研英语近义词与反义词·十三
  16. 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
  17. pandas DataFrame的xs用法
  18. C# 调用迅雷 7 迅雷下载开放引擎
  19. js生成二维码以及插入图片
  20. 闭关修炼21天,“啃完”283页pdf,我终于4面拿下字节跳动offer

热门文章

  1. PHPCMS2008 二次开发摘要
  2. springcloud gateway 鉴权_SuperBoot框架是基于SpringCloud、SpringBoot敏捷开发框架
  3. jersey2 java_无废话Jersey构建RESTful服务之WebService系统教程 --2 [JAVA对象转换成XML输出]...
  4. qq空间把android改成iphone,qq空间利用代码修改iPhone6 Plus qq空间修改手机型号教程...
  5. 计算机断电后黑屏怎么办,电脑断电黑屏怎么办
  6. 花生壳域名解析更新代码(C#),不想安装花生壳客户端的可以用这个
  7. ssm高仿bilibili视频网站
  8. 【ERP】概念_UFO报表
  9. java实现根据pdf文件模板生成pdf文件
  10. 什么软件可以测试QQ特别关心,qq特别关心查询工具