目录

一、基于FPGA的GV7600驱动控制器设计,按照BT1120协议传输YCbCr数据

二、模块名称

三、模块输入输出端口定义(interface)

四、模块功能(functions)

五、模块行为描述(behavior descriptions)

六、时序说明图(diagrams)

七、注意事项

八、参考文献及代码

九、经验总结



一、基于FPGA的GV7600驱动控制器设计,按照BT1120协议传输YCbCr数据

二、模块名称

SDI Data Interface

三、模块输入输出端口定义(interface)

PCB板号:176-A-1,根据10bit HD模式,在硬件pcb上配置如下4个引脚(红色字体)

信号名称

信号属性

信号说明

Sys_clk

input

系统时钟:30 MHz

Pclk

output

锁相环输出给GV7600时钟:148.5MHZ

Reset

output

GV7600低电平复位1.8ms

Sdi_data

output

输出数据给GV7600

DETECT_TRS

硬件拉高

将H:V:F timing信号嵌入到并行输入数据流

656_BYPASS

硬件拉高

选择video模式

20BIT/10BIT

硬件拉低

选择输入10bit数据位数

RATE_SEL0

硬件拉低

根据分辨率要求

四、模块功能(functions)

根据项目需求,通过FPGA驱动GV7600输出SDI信号

五、模块行为描述(behavior descriptions)

  1. 顶层模块:端口定义

(输入:Sys_clk,

输出:Pclk,Sdi_data,Reset);

  1. 驱动模块:端口定义

(输入:Clk,Sys_rstn,BT1120_data_out,

输出:Pclk,Sdi_data,Reset,);

  1. BT1120模块:端口定义

(输入:Clk,Sys_rstn,

输出:BT1120_data_out,);

  1. PLL调用模块:端口定义

(输入:Sys_clk,

输出:c0,locked,);

模块分为4个子模块:1.顶层模块:做例化;2.驱动模块:驱动GV7600芯片,FPGA输出GV7600复位,时钟和数据信号;3. BT1120模块:按照BT1120协议传输数据;4.锁相环调用模块:输出148.5Mhz时钟(根据分辨率决定时钟频率);

图1 SDI接口流程图

六、时序说明图(diagrams)

图2 10bit复用 SDI接口时序

根据《GV7600-SDI并转串datasheet》,FPGA主要实现驱动GV7600功能,具体需求如下:

  1. 选择模式:10-bit data input HD format      <文档P30>

  1. 选择分辨率:1920*1080,1080p/30Hz Format      <文档P36>

七、注意事项

  1. FPGA内部通过锁相环倍频输出给GV7600 148.5MHz时钟;
  2. 注意选择10bit模式和输入数据位宽
  3. 特别注意有效像素点开始数值(参考bt1120文档(P12):数据流定时规范)
  4. GV7600低电平复位:1.8ms;
  5. 在1080p分辨率下:VIDEO_START=559/560画面正常,561画面立刻抖动;在720p分辨率下:VIDEO_START=4039/ 4040画面正常,4041画面立刻抖动

1080p

20位

10位复用

并行数据流中的数字行

2200

4400

并行数据流中的数字行消隐

4+272+4

8+544+8

并行数据流中的有效行

1920

3840

10bit

552

553

554

555

556

557

558

559

SAV0

SAV1

SAV2

SAV3

SAV4

SAV5

SAV6

SAV7

`ifdef BT1120_1080P_30HZ

parameter ROW_MAX = 1124;           //每场总计行数

parameter COL_MAX = 4399;            //每行总计像素点数

parameter ROW_BLACK_S = 41;      //开始场有效

parameter ROW_BLACK_E = 1121; //开始场消隐

parameter SAV_COL = 552;                 //276*2

parameter BLANK_START = 7;         //开始272*2=544个消隐区域

parameter SAV_START     = 551;      //开始4*2=8个SAV定时基准码

parameter VIDEO_START = 559;    //开始每行有效像素点区域,560也可以正常显示图像

parameter EAV_START     = 4399;    //开始4*2=8个EAV定时基准码

parameter DATA_CNT     = 1919;     //每行有效像素点

parameter VCNT_SUM      = 1079;     //每场有效行

`endif

八、参考文献及代码

文档一:ITU-R BT.1120-7 建议书 
高清晰度电视演播室信号数字接(https://wenku.baidu.com/view/920afe2d2af90242a895e501.html)

文档二:SMPTE  STANDARD  for Television — 1280 × 720 Progressive Image Sample Structure — Analog and Digital Representation and Analog Interface(https://wenku.baidu.com/view/8de63ec22cc58bd63186bd93.html)

文档三:GV7600 Aviia™ Transmitter 芯片手册(http://www.doc88.com/p-2456927070001.html)

附核心模块代码(通过BT1120协议将YCbCr转换SDI输出)

// BT1120 Encoder
//****************************************************************//
//Company :     ##
//Author :      MZH
//Version :     1.0
//Data of Creation :2017/05/22
//****************************************************************//
//BT1120 EAV, SAV Description
//BIT6:F ODD EVEN Sign  (ODD=0)
//BIT5:V FIELD BLANKING Sign (1=BLANKING)
//BIT4:H EAV SAV Sign   (1=EAV)
//BIT3-0 CRC BIT3=V(XOR)H;BIT2=F(XOR)H;BIT1=F(XOR)V;BIT0=F(XOR)V(XOR)H
//
//Bit7          Bit6      Bit5        Bit4          Bit3-0(P3P2P1P0)            Hex     Description
//  1           0           0           0               0000                    0x80    Odd,Active,SAV      10'h200
//  1           0           0           1               1101                    0x9d    Odd,Active,EAV      10'h274
//  1           0           1           0               1011                    0xab    Odd,Blank, SAV      10'h2AC
//  1           0           1           1               0110                    0xb6    Odd,Blank, EAV      10'h2d8//
// Every line(4400Bytes):
//                       EAV(8Bytes:3FF 3FF 000 000 000 000 XYZ XYZ)
//                       LineBlanking(560Bytes: 80 10 80 10....)
//                       SAV(8Bytes:3FF 3FF 000 000 000 000 XYZ XYZ)
//                       ActiveVideo(3840Bytes:Cb0 Y0 Cr0 Y1 Cb2 Y2 Cr2 Y3 Cb4 Y4 Cr4 Y5 .... Cb1918 Y1918 Cr1918 Y1919 )
//
// Every Field = 1125Lines
//  Line 0 - 40:odd field blanking
//  Line 41 - 1121:odd field active
//  Line 1122 - 1124:odd field blanking//
//  Clk:
//  2200*1125 = 2475000
//  2475000  * 60 = 148.5M
//****************************************************************//  // COLORBAR DEFINE                //生成颜色测试数据
//`define COLOR_HOR_TEST       //横向渐变条纹
`define COLOR_VER_TEST         //竖向渐变条纹
`define TB_DATA`define BT1120_1080P_30HZ      //选用1280p 30hz//`define BT1120_720P_30HZ           //选用720p 30hzmodule BT1120_1080p_720p (input Sys_rstn,input Clk,//input [7: 0] DataY_input,//input [7: 0] DataCb_input,//input [7: 0] DataCr_input,output   reg  Field_sync,                //Odd signaloutput  reg  DataY_req,                 //1280x720 每场output reg  DataCr_req,                //640x720 每场output  reg  DataCb_req,                //640x720 每场output [9: 0] BT1120_data_out);`ifdef BT1120_1080P_30HZ
parameter ROW_MAX = 1124;      //每场总计行数
parameter COL_MAX = 4399;      //每行总计像素点数parameter ROW_BLACK_S = 41;  //开始场有效
parameter ROW_BLACK_E = 1121;  //开始场消隐parameter SAV_COL = 552;        //276*2parameter BLANK_START = 7;      //开始272*2=544个消隐区域
parameter SAV_START   = 551;   //开始4*2=8个SAV定时基准码
parameter VIDEO_START = 559;    //开始每行有效像素点区域,560也可以正常显示图像
parameter EAV_START   = 4399;  //开始4*2=8个EAV定时基准码parameter DATA_CNT     = 1919;  //每行有效像素点
parameter VCNT_SUM    = 1079;  //每场有效行
`endif`ifdef BT1120_720P_30HZ
parameter ROW_MAX = 749;
parameter COL_MAX = 6599;parameter ROW_BLACK_S = 25;
parameter ROW_BLACK_E = 745;parameter SAV_COL = COL_MAX - 2567;// SAV_COL = 4032parameter BLANK_START = 7;
parameter SAV_START   = 4031;
parameter VIDEO_START = 4039;
parameter EAV_START   = 6599;parameter DATA_CNT      = 1279;
parameter VCNT_SUM    = 719;
`endif`ifdef TB_DATA  reg[7:0]    DataY,DataCr,DataCb;
reg[11:0]   cnt_Y;              //计数:每行有效像素点数
reg[11:0]   cntt;               //计数:每场有效行数wire[7:0] DataY_input,DataCr_input,DataCb_input;
assign      DataY_input  = DataY;
assign      DataCr_input = 8'd128;
assign      DataCb_input = 8'd128;
`endif`ifdef COLOR_VER_TEST                                       //竖条纹
always@(posedge Clk or negedge Sys_rstn)begin              //create tb dataif(!Sys_rstn)beginDataY     <=  255;cnt_Y   <=  12'd0;end   else if (DataY_req) beginif (cnt_Y==DATA_CNT) beginDataY <=  255;cnt_Y   <=  12'd0;endelse beginDataY   <=  DataY-1;cnt_Y   <=  cnt_Y+1;endend
end
`endif`ifdef COLOR_HOR_TEST                                   //横条纹
always @(posedge Clk or negedge Sys_rstn) begin        //creat tb dataif (!Sys_rstn) begincnt_Y    <=  12'd0;endelse if (DataY_req) beginif (cnt_Y==DATA_CNT) begincnt_Y    <=  12'd0;end  else begincnt_Y <=  cnt_Y+1;endend
end
always @(posedge Clk or negedge Sys_rstn) begin        //creat tb dataif (!Sys_rstn) beginDataY    <=  8'd0;cntt  <=  12'd0;endelse if (DataY_req) beginif (cnt_Y==DATA_CNT) beginDataY    <=  DataY+1;cntt   <=  cntt+1;    if (cntt==VCNT_SUM) beginDataY    <=  0;cntt  <=  0;endendend
end
`endifreg [12:0] hcnt;
reg [11:0] vcnt;
reg [9:0] data_out_temp;assign BT1120_data_out = data_out_temp;wire [9: 0] dataY_input_temp;
wire [9: 0] dataCb_input_temp;
wire [9: 0] dataCr_input_temp;// REAL DATA
assign  dataCb_input_temp = {DataCb_input,2'b00};
assign  dataY_input_temp  = {DataY_input,2'b00};
assign  dataCr_input_temp = {DataCr_input,2'b00};always @ (posedge Clk or negedge Sys_rstn )                      //行场计数
beginif (!Sys_rstn) begin       hcnt <= 13'd0;vcnt <= 12'd0;  endelse beginif (hcnt == COL_MAX) begin   hcnt <= 13'd0;vcnt <= (vcnt == ROW_MAX) ? 12'd0: (vcnt + 1'b1);     endelse beginhcnt <= hcnt + 1'b1;endend
endalways@(posedge Clk or negedge Sys_rstn)begin           //输出奇偶场同步if(!Sys_rstn)beginField_sync   <= 1'b0;endelse beginField_sync    <=  ((hcnt==13'd0)&&((vcnt==12'd0)))? 1:0; end
end reg V_VALID;
always @ (posedge Clk or negedge Sys_rstn )                //输出有效标志
beginif (!Sys_rstn) begin       V_VALID = 1'b1;endelse begincase (vcnt)0:           V_VALID = 1'b1;ROW_BLACK_S: V_VALID = 1'b0;                   //偶场有效区ROW_BLACK_E: V_VALID = 1'b1;default:     V_VALID = V_VALID;endcaseend
endreg[1:0] h_state;
always@(posedge Clk or negedge Sys_rstn)begin          //表示每行四个不同区间if(!Sys_rstn)beginh_state   <= 2'd0;endelse if(hcnt==10'd0)beginh_state <= 2'd0;endelse begincase(h_state)2'd0:begin      //EAVh_state    <= (hcnt==BLANK_START)?   2'd1:2'd0;end2'd1:begin      //BLANKh_state  <= (hcnt==SAV_START)? 2'd2:2'd1;end             2'd2:begin     //SAVh_state    <= (hcnt==VIDEO_START)?   2'd3:2'd2;end                     2'd3:begin     //VIDEOh_state  <= (hcnt==EAV_START)? 2'd0:2'd3;    //每行有效数据区end    default:beginh_state    <= 2'd0;endendcaseend
end             always@(posedge Clk or negedge Sys_rstn)begin              //产生输入请求信号if(!Sys_rstn)beginDataY_req       <= 1'b0;DataCr_req     <= 1'b0;DataCb_req     <= 1'b0;endelse beginif( h_state==2'd3 )beginDataY_req      <=  ( V_VALID == 1'b0 )?     hcnt[0]:1'b0;          DataCb_req      <=  ( V_VALID == 1'b0 )?     (hcnt[1:0]==2'b00):1'b0;DataCr_req      <=  ( V_VALID == 1'b0 )?     (hcnt[1:0]==2'b10):1'b0;  end else beginDataY_req       <= 1'b0;DataCr_req     <= 1'b0;DataCb_req     <= 1'b0;end
end
endalways @ (posedge Clk or negedge Sys_rstn )              //BT_1120协议
beginif (!Sys_rstn) begin           data_out_temp  <= 10'h200;endelse begin                                        //发EAV和SAV前两个数据if ((hcnt == 0 )|| (hcnt == 1) || (hcnt == SAV_COL) || (hcnt == (SAV_COL+1))) begin data_out_temp  <= 10'h3FF;endelse if ( (hcnt == 2) || (hcnt == 3) ||(hcnt == 4) ||(hcnt == 5) || (hcnt == (SAV_COL+2)) || (hcnt == (SAV_COL+3))|| (hcnt == (SAV_COL+4))|| (hcnt == (SAV_COL+5)) ) begindata_out_temp <= 10'h000;end       else if ((hcnt == 6) || (hcnt == 7)) begin  //发EAV最后两个数据//if (((vcnt >= 0) && (vcnt <= ROW_BLACK_S)) || ((vcnt >= ROW_BLACK_E) && (vcnt <= ROW_MAX))) begin if (V_VALID) begin  data_out_temp <= 10'h2D8;          //{8'hB6,2'b00}; EAV odd field blanking               endelse begindata_out_temp <= 10'h274;         //{8'h9D,2'b00}; EAV odd field active         endend  // BLACKINGelse if ((hcnt > 7) && (hcnt < SAV_COL) ) begindata_out_temp <= 10'h200;end                                           else if ((hcnt == (SAV_COL+6)) || (hcnt == (SAV_COL+7))) begin                //发SAV最后两个数据    if (V_VALID) begin  data_out_temp <= 10'h2AC;          //{8'hAB,2'b00}; SAV odd field blanking               endelse begindata_out_temp <= 10'h200;         //{8'h80,2'b00};  SAV odd field activeendend      // DATAelse begin           if (V_VALID) begin  data_out_temp <= 10'h200;endelse begincase (hcnt[1:0])2'd0: begindata_out_temp <= dataCb_input_temp;end   2'd1,2'd3: begindata_out_temp <= dataY_input_temp;end 2'd2: begindata_out_temp <= dataCr_input_temp;end  default: begindata_out_temp <= 10'h200;endendcaseend       end                 end
endendmodule/*-----------------------------------------------————————————————
版权声明:本文为CSDN博主「Davemissyou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Davemissyou/article/details/89016374

九、经验总结

SDI总结(调试包括:在不同分辨率下的BT656,BT1120)

SDI调试的关键是行计数,每行EAV和SAV的起始计数至关重要;10bit SDI_1080p和10bit SDI_sd存在两方面差异:1、bt656和bt1120的协议不同,2、硬件Pcb上RATE_SEL0引脚配置不同;

1、每一行的组成

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

起始码(SAV)和结束码(EAV),它是标志着一行开始结束的重要标记,bt656协议:

图3 10bit复用 SDI_sd接口时序

2、为什么一行中的有效数据是 1440 字节,因为PAL制式的SDTV的分辨率为 720*576,即一行有720个有效点,由于采集的是彩色图像,那么一行就是由亮度信息(Y)和色差信息(CbCr)组成的,由于YCbCr是422格式,故一行中有720列Y,720列CbCr,因此,一行的有效字节数就为 720 x 2 = 1440 字节。bt1120协议

图4  10bit复用 SDI_hd接口时序

3、定义行计数器时,需要明确每行的总数据和有效数据,总数据和有效数据即(EAV和SAV的起始计数)正确与否决定了是否显示图像,在整个模块代码编写中查阅总数据和有效数据的数值花费了80%的时间,最终在(bt1120文档(P12):数据流定时规范)中找到确定数值;

4、10bit复用时,每行有4400个数据,3840个有效数据,故一行中有1920列Y,1920列CbCr,分辨率:1920*1080

基于FPGA的GV7600驱动控制器设计,按照BT1120协议传输YCbCr数据相关推荐

  1. 基于FPGA的USB接口控制器设计(VHDL)(中)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第二篇,中篇,USB通信原理.USB 系统开发以及设计实例.话不多说,上货. 之前有关于 Veril ...

  2. 基于FPGA的XPT2046触摸控制器设计

    基于FPGA的XPT2046触摸控制器设计 小梅哥编写,未经许可,文章内容和所涉及代码不得用于其他商业销售的板卡 本实例所涉及代码均可通过向 xiaomeige_fpga@foxmail.com  发 ...

  3. 基于FPGA的USB接口控制器设计(VHDL)(上)

    今天给大侠带来基于 FPGA 的 USB 接口控制器设计(VHDL),由于篇幅较长,分三篇.今天带来第一篇,上篇,USB 接口简介 以及 USB 体系结构.话不多说,上货. 之前有关于 Verilio ...

  4. 基于FPGA的SPI FLASH控制器设计

    1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...

  5. 基于FPGA的GV7600驱动

    最近项目上用到FPGA驱动GV7600输出SDI信号,输出分辨率1920*1080p,首先,了解GV7600芯片的特性功能,按照bt1120协议传输10位Y,Cb,Cr数据:其次,我的项目中用的是10 ...

  6. 【工程源码】基于FPGA的XPT2046触摸控制器设计

    本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者. XPT2046是一款设计用于移动电话.个人数字助理.便携式一起.付款中断设备.触摸屏显示器等 ...

  7. imut FPGA课设 基于FPGA的VGA弹球游戏设计 *秋昊

    写在前面的话: 本文主要呈现了一篇IMUT的FPGA课设报告. 课设报告内容(word版),视频演示,程序源码,专业创新实践简介,专业创新实践指导书均已放入下面的百度云链接中,也不大,总共不到20MB ...

  8. 基于FPGA的CAN总线控制器的设计(下)

    今天给大侠带来基于FPGA的CAN总线控制器的设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,程序的仿真与测试以及总结.话不多说,上货. 导读 CAN 总线(Controller Area Netw ...

  9. 基于FPGA的CAN总线控制器的设计(上)

    今天给大侠带来基于FPGA的CAN总线控制器的设计,由于篇幅较长,分三篇.今天带来第一篇,上篇,CAN 总线协议解析以及 CAN 通信控制器程序基本框架.话不多说,上货. 导读 CAN 总线(Cont ...

  10. 基于FPGA的数字视频信号处理器设计(中)

    今天给大侠带来基于FPGA的数字视频信号处理器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,视频信号概述和视频信号处理的框架.话不多说,上货. 之前也有图像处理相关方面的文章,这里超链接几篇,给各 ...

最新文章

  1. Hash函数的安全性
  2. 清华大学《大数据系统基础》项目征集说明(2021年秋季)
  3. [转]学校的统一订书80%该烧掉——IT推荐书单
  4. Java RMI 框架(远程方法调用)
  5. PHP的$_FILES
  6. SQL基础【十五、join、Inner join、Left join、Right join、Full join】
  7. POJ - 3630 Phone List(字典树)
  8. 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)
  9. 使用jpa控制器层如何编写_用错误的方式编写Kubernetes控制器仍然有用
  10. java后端技术有哪些_Java后端精选技术:什么是JVM?
  11. 学习TypeScript4这一篇就够了
  12. [转载]班主任带着学生打副本 每周学习成绩就是DKP(这篇太雷人了,转载保持)...
  13. c语言编译 创建卡号信息表,C语言超市会员信息管理系统源程序
  14. 百分位(percentile)是什么概念?怎么理解第95个百分位(95th percentile)
  15. 理解杀毒软件的意义(完整---另加补充和总结)
  16. 烟花易冷,一指繁华了无痕:伤感QQ空间日志
  17. CPS模式是如何降低网络营销投入的?
  18. 第23课:专项能力修炼
  19. 加勒比海盗船——最优装载问题-贪心算法
  20. android开机图片修改工具栏,如何以编程方式更改android工具栏中的图标...

热门文章

  1. 所有Windows原版系统的下载地址
  2. html-mp3格式转换器,mp3格式转换器
  3. pq控制,vf控制和droop控制仿真模型
  4. 软件易用性文章分享第二篇-手机易用性: 一个经典的实验
  5. 做SEO优化第三步:学习了解HTML基础知识
  6. EditPlus 3编译运行设置
  7. 电商数据分析Excel案例
  8. 难得干货,揭秘支付宝的2维码扫码技术优化实践之路
  9. HBase权威指南阅读——第一章
  10. 【微信小程序使用阿里巴巴矢量图标库】