[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

目录

1概述

1.1 显示器发展

1.1.1屏幕显示技术的变化

1.1.2视频接口的变化

1.2 分辨率

1.3 刷新率

2 VGA成像原理及时序标准

3 像素时钟

4 VTC控制器设计

5 VTC源码

6 RTL仿真

6.1仿真激励文件

6.2仿真结果

7 常用系统分辨率


1概述

Video Timing Controller 缩写VTC是我们在所有涉及FPGA图像、FPGA视频类方案中经常用到的一种用于产生视频时序的控制器。本课以 VGA 为切入点,学习视频传输的基本知识和相关概念,以及视频时序的控制器的相关内容。

1.1 显示器发展

1.1.1屏幕显示技术的变化

显示器如今已经成为我们日常生活中不可或缺的一部分,随着显示器技术的不断发展和创新,从最早的黑白CRT到今天的MicroLED,显示器行业已经发生了翻天覆地的改变,为我们提供更好的视觉体验,本章先和大家聊一聊显示器的发展历史。

CRT显示器

CRT的全称是Cathode Ray Tube,即阴极射线管,CRT显示器的成像原理是将输入的模拟信号经过放大,变换后直接驱动电子枪扫描屏幕,电子枪发射出来的电子光束撞击到在涂有荧光粉的屏幕上,产生 RGB 三基色(红、绿、蓝),合成一个彩色像素,电子光束由上到下、由左到右依次扫描屏幕,从而形成图像。由于起初阴极射线需保证发射点到屏幕任何一点半径需等长,所以屏幕就必须得是一个弧形,而为了屏幕做大,显示器的厚度也就越厚。

CRT显示器

液晶显示器:

在CRT显示器飞速发展的几年期间,也诞生了LCD(Liquid Crystal Display)液晶显示技术,由众多细小的液晶颗粒按照矩阵的形式排布而组成的显示屏,因此LCD显示屏的物理像素数量是确定的,每个像素点的颜色都可以对应一个图像数据。图像数据是数字信号,采用“电信号”显示方式,通过在液晶层中加电,改变对液晶像素点单元施加电压的电压大小,使用色彩滤光片,将白色光分解成红、绿、蓝三种基色的光,然后通过液晶面板控制光的透过与阻挡,从而显示出图像。LCD显示器的发展让显示设备彻底摆脱了厚重的机身,也为便携式计算机的出现创造了可能。

LCD显示器

1.1.2视频接口的变化

显示器显示画面质量的好坏,不仅与显示器有关,还与视频接口有直接关系。 显示器接口是计算机与外部显示设备之间进行数据传输和连接的通道,随着视频技术的发展,人们对于视频画面质量的显示也提出了更高的要求,这也推动了显示器视频接口的发展,本文介绍几种常见的显示接口及其特点。

CVBS接口:

CVBS将音频、视频分离的视频接口,一般由三个颜色组成,黄色的“V”代表连接混合视频信号,白色的“L”代表左声道音频信号,红色的“R”代表右声道的音频信号,常用于电视、DVD等产品。

S-VIDEO接口:

S-Video全称是Separate Video,也称为Super Video,将色度,亮度分离的视频信号,提高了稳定性。S-Video接口它实际上是一种五芯接口,由两路视频亮度信号、两路视频色度信号和一路公共屏蔽地线共五条芯线组成,避免了视频设备内信号串扰而产生的图像失真,极大地提高了图像的清晰度。

VGA接口:

1987年,第一台带有VGA模拟信号接口的显示器由IBM发布,VGA接口是一种D型接口,上面共有15针空,分成三排,每排五个,它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号),可以提供640 x 480分辨率的彩色显示屏,一次可以显示16种颜色,当把分辨率降低到320 x 200,则显示256种颜色。VGA接口是显卡上应用最为广泛的接口类型,从CRT显示器时代开始,VGA接口就被使用,并且一直沿用至今。由于液晶显示器发展比CRT显示技术晚,模拟信号驱动的VGA接口已经在显示器上得到广泛的使用,为了能够兼容传统的显示接口VGA,液晶显示器通过内部电路实现了对VGA接口的完全兼容。

当使用VGA接口传输图像时,生成的图像数字信息要先经过显示驱动芯片(如显卡)D/A(数字/模拟)转换器转换为R、G、B三原色信号和行、场同步信号,由VGA线缆送到显示器的VGA接口,对于CRT显示器,这些模拟信号会直接被放大后用于驱动电子枪发射电子,对于液晶显示器,则需要使用A/D(模拟/数字)转换器将模拟信号再转换为数字信号后,去驱动RGB接口的液晶显示屏显示图像。

DVI接口:

由于VGA接口采用的是模拟信号传输,在CRT显示器上使用时可以直接生成图像,在LCD显示器使用时,需要再配置A/D(模拟/数字)转换器,而在D/A和A/D两次转换的过程中,不可避免缺失一些图像细节。1999年,Intel发明了高速传输数字信号的DVI接口,设计的初衷是用来传输未经压缩的数字化视频,相比VGA接口来说,视频传输的清晰度更高。

HDMI接口:

HDMI接口是高清多媒体接口,也是现在的主流显示器接口,可以同时传输未经压缩的视频、音频的数字信号。HDMI1可以传输1080@60Hz全高清的影像输出,带宽达到4.85Gbps。到了2013年,HDMI2.0版本推出,带宽达到18Gbps,可以支持4K@60FPS画面输出。目前的HDMI2.1接口,可提供48Gbps的带宽,并且支持8K@60Hz以及4K@120Hz视频传输,现阶段主要还是以HDMI2.0为主。

DP接口:

DP(DisplayPort)接口,可以同时传输视频、音频的数字信号,相比HDMI接口,DP接口拥有更大的带宽,2009年的DP1.2接口的带宽达到21.6bps,2016年推出的DP1.4接口带宽已经达到了32.4Gbps,接近HDMI2.0接口带宽的2倍,可以支持8K@60Hz以及4K@120Hz输出,现在DP1.4接口已成为大部分显示器的标配接口。到了2019年,DP2.0推出,带宽达到80Gbps,速度是HDMI2.1的1.6倍左右。

1.2 分辨率

当提及电子设备的显示器时,就会提及一个词“分辨率”,例如1080P分辨率、2K分辨率、4K分辨率,分辨率是决定屏幕的清晰程度的重要参数。分辨率只是数学上的一个概念,仅仅是用来表示横向和纵向有多少个像素点,以1080P分辨率为例做说明:它的意思是,这块屏幕横向分布了1920列像素,在纵向分为1080行像素,那么一张分辨率为1920 x 1080的图像分辨率就达到了2073600像素,分辨率越高,所包含的像素就越多,图像就越清晰,它也会增加文件占用的存储空间。

1920 x 1080显示器的像素点排布

上图为1080P 显示器的像素点排布示意图,X 轴是显示器的横轴,Y 轴是显示器的竖轴,图中的一个小方块就是一个像素点2K 就是2560*1440个像素点4K是3840*2160 个像素点。显示屏大小尺寸固定时,显示分辨率越高图像越清晰,比如看视频时我们可以选择视频的清晰度,分辨率越高视频越清晰;反之,显示分辨率一定的情况下,显示屏越小图像越清晰,比如1080P的5寸的手机要比1080P的24寸显示器显示的图像细腻。

常见的显示屏分辨率标准:

1.3 刷新率

刷新率(FPS,Frames Per Second),单位为Hz,即每秒传输图像的帧数(帧数/s)。每秒钟帧数 (FPS) 愈多,一帧是静止的图象;快速连续地显示不同帧便形成了运动的假象,每秒钟帧数愈多,所显示的动作就会愈流畅。例如:60Hz的刷新率刷也就是指屏幕一秒内只扫描60次,即60帧/秒。

2 VGA成像原理及时序标准

由上面显示器的发展介绍中,我们了解到VGA标准兴起的时候,模拟信号驱动的VGA接口已经在显示器上得到广泛的使用,当时常见的彩色显示器一般由 CRT(阴极射线管)构成,我们以白底的”米联客logo”为例,将图片完全显示在CRT显示器有效区域上,并对比现在大规模使用的液晶显示器,来介绍显示器完整展现这幅图的各个阶段。

1、CRT显示器

一幅图像,可以理解成由多个像素点从左向右依次平铺构成的,CRT 显示器基于电子枪,每次只能点亮一个像素点上的荧光粉,类似我们看书的方式,从页面的左上方开始逐字按行从左到右阅读,显示一帧图像电子枪是按照‘Z’形在运动,如上图红色箭头的运动方向,当扫描速度很快的时候看起来就是一幅完成的画面了。

行扫描过程:

行时序

CRT 显示器扫描是按照一行一行的方式进行的,如上图红色实心箭头运动轨迹,扫描完一行有效数据段之后不会立马返回,而是会继续向右扫描一段区域,这个区域称为右边界区域(horizontal right border),该区域不在有效的显示范围内,对应的荧光屏玻璃上没有荧光粉也不能被点亮,可以理解为显示器右边的黑边。同样,显示器左边也有这样一段黑边,在开始显示有效数据之前,电子枪扫描到的这段区域也没有荧光粉,不会显示图像, 这个区域称为左边界区域(horizontal left border),如上图所示的蓝色区域范围为边界区域,

当电子枪扫描过了右侧没有荧光粉的边界区域后,并不会自动回到最左边准备下一行,而是需要有一个通知信号,即行同步信号脉冲(horizontal sync pulse,HSYC)。再没有收到行同步信号脉冲之前,需要关闭电子枪以实现消隐,这段时间就称为 horizontal front porch,消隐是为了不影响已经点亮的像从最右侧回到显示屏的最左侧,如图所示红素点。当收到HSYC信号,电子枪会在一定时间内色虚线箭头运动轨迹,这个回去的过程需要耗费一定的时间,这个时间就称为 horizontal back porch。当HSYC信号结束以后,电子枪就会重新打开,就可以显示新的一行图像数据了。

场扫描过程:

场时序

对于CRT显示器,电子枪扫描完所有有效行的图像后会继续向下扫描一段区域,这个区域称为下边界区域(vertical bottom border),该区域不在有效的显示范围内,对应的荧光屏玻璃上没有荧光粉也不能被点亮,可以理解为显示器下边的黑边。同样的,显示器上边也有这样一段黑边,在扫描有效数据之前,电子枪扫描到的这段区域不会显示图像, 这个区域称为上边界区域(vertical top border)。当电子枪扫描一场图像到达荧光屏的最下方后,其并不会自动回到最上边,而是需要有一个通知信号,即场同步信号脉冲(vertical sync pulse,VSYC)。再没有收到场同步信号脉冲之前,需要关闭电子枪以实现消隐,这段时间就称为 vertical front porch,消隐是为了不影响已经点亮的像素点。当收到VSYC信号,电子枪会在一定时间内从最下方回到最上方,如图所示红色虚线箭头运动轨迹,这个回去的过程需要耗费一定的时间,这个时间就称为 vertical back porch。当VSYC信号结束以后,电子枪就会重新打开,就可以显示新的一行图像数据了。

2、LCD显示器

由于CRT显示器采用电子枪显示图像,不可避免而存在黑边的原因,然而现在使用的液晶显示器不需要电子枪了,还有存在黑边是因为LCD 屏幕内部是有一个IC ,IC是集成电路芯片装置,用来对透明电极上电位信号的相位、峰值、频率等进行调整与控制,从而建立起驱动电场,从而实现液晶显示图像。然而发送一行或者一帧数据给 IC,IC需要反应时间去识别一行数据扫描完需要要换行,或者一帧图像扫描完了需要扫描下一帧图像。因此,在 LCD 屏幕中需要存在boder这些参数来锁定有效的像素数据。

3 像素时钟

像素时钟(Pixel clock,pclk),也叫RGB clock或Dot clock,即RGB的时钟信号,一个基准时钟clk对应一个像素点,根据上面我们分析的行时序和场时序,显示一帧图像需要的基准时钟N(CLK) =  H_FrameEnd * V_FrameEnd,结合刷新率,可以计算像素时钟 = H_FrameEnd * V_FrameEnd * 帧率。如果是标准分辨率,建议大家以标准分辨率参数直接填入,如果不是标准分辨率则根据实际情况可以用接近标准分辨率的参数去修改相关参数。视频数据在H_AcitiveSize和V_AcitiveSize同时有效时候有效,显示屏上的显示效果如下图所示:

H_ActiveSize:有效显示区域(Visible area)

H_Syncstart:有效显示区域+前沿(Front Porch+Right Border)

H_SyncEnd:有效显示区域+前沿+HSYC(Sync Pulse)

H_FrameEnd:有效显示区域+前沿+HSYC+后沿(Back Porch+Left Border)

V_ActiveSize:有效显示区域(Visible area)

V_Syncstart:有效显示区域+前沿(Front Porch+Bottom Border)

V_SyncEnd:有效显示区域+前沿+VSYC(Sync Pulse)

V_FrameEnd:有效显示区域+前沿+VSYC+后沿(Back Porch+Top Border)

常用标准系统分辨率时序参数:

分辨率@帧率

行时序参数(像素数量)

场时序参数(像素数量)

像素时钟

(MHz)

HSYC

后沿

有效显示区域

前沿

VSYC

后沿

有效显示区域

前沿

640*480@60

96

48

640

16

2

34

480

9

25.175

640*480@75

64

120

640

16

3

16

480

1

31.5

800*600@60

128

88

800

40

4

23

600

1

40

1024*768@60

136

160

1024

24

6

29

768

3

65

1280*720@60

40

220

1280

110

5

20

720

5

74.25

1280*1024@60

112

248

1280

48

3

38

1024

1

108

1920*1080@60

44

148

1920

88

5

36

1080

4

148.5

比如对于分辨率1920*1080*60的分辨率通常采用148.5MHZ的像素时钟。H_FrameSize* V_FrameSize*帧率 = 2,200* 1,125*60= 148,500,000,在时钟晶振足够精确的情况下,可以确保帧率以恒定60fps输出。我们可以给出以下参数设置:

H_ActiveSize    =1920 
H_SyncStart     =1920+88
H_SyncEnd       =1920+88+44
H_FrameSize     =1920+88+44+148V_ActiveSize    =1080
V_SyncStart     =1080+4
V_SyncEnd       =1080+4+5
V_FrameSize     =1080+4+5+36 

但是很多时候如果某个参数不能满足要求,那么我们也可以重新调整参数,尽量来接近标准分辨率。

对于非标准分辨率,比如当以140MHZ输出1080*1920*60的视频时,H_FrameSize* V_FrameSize *帧率=2,123*1099*60=139,990,620 这样每一帧的精确度误差为0.000067,用户可以以上面介绍的方法计算相近参数。

H_ActiveSize    =1920
H_SyncStart     =1920+88
H_SyncEnd       =1920+88+44
H_FrameSize     =1920+88+44+71V_ActiveSize    =1080
V_SyncStart     =1080+4
V_SyncEnd       =1080+4+5 
V_FrameSize     =1080+4+5+16

对于140MHZ的时钟输出帧率会稍微快点。我们给出以下参数:对于非标准75MHZ像素时钟,输出1280*720*60

H_ActiveSize    =1280
H_SyncStart     =1280+88
H_SyncEnd       =1280+88+44
H_FrameSize     =1280+88+44+239V_ActiveSize    =720
V_SyncStart     =720+4
V_SyncEnd       =720+4+5 
V_FrameSize     =720+4+5+28

4 VTC控制器设计

通过学习VGA 时序,我们知道设计一个VGA 控制器需要包括行计数器、场计数器、行、场同步信号,有效图像数据输出的使能信号。本实验以1920*1080的分辨率为例,使用2个计数器分别产生hs行时序vs场时序中各个时间参数信号,以及有效图像数据输出的de使能信号。

hcnt列计数器:

每1个像素时钟列计数器hcnt加 1,一行像素扫描完成后,计数器清零并重新计数。

always @(posedge I_vtc_clk)beginif(rst_sync == 1'b0) //复位hcnt <= 12'd0;else if(hcnt < (H_FrameSize - 1'b1))//计数范围从0 ~ H_FrameSize-1hcnt <= hcnt + 1'b1;else hcnt <= 12'd0;
end  

vcnt行计数器:

行计数器vcnt的前提条件是列计数器hcnt计数到设定值,行计数器vcnt加 1,所有行的像素扫描完成后,计数器清零并重新计数。

always @(posedge I_vtc_clk)beginif(rst_sync == 1'b0)vcnt <= 12'd0;else if(hcnt == (H_ActiveSize  - 1'b1)) begin//视频水平方向,是否一行结束vcnt <= (vcnt == (V_FrameSize - 1'b1)) ? 12'd0 : vcnt + 1'b1;//视频垂直方向,行计数器加1,计数范围0~V_FrameSize - 1end
end 

行场同步信号

根据VGA时序,我们知道在消隐段期间,产生行同步信号和场同步信号,我们设置行同步信号和场同步信号为高电平时有效。根据行、列计数器的值,当相应的计数器计数到消隐时间段时,拉高同步信号。SyncStart

表示边界区域扫描完成即将进入消隐区域,此时产生行/场同步信号,SyncEnd表示行/场同步信号产生完成,边界区域扫描完成即将进入边界区域。同时扫描到场有效显示区域和行有效显示区域时,vtc_de信号拉高,表示数据有效。

wire hs_valid  =  hcnt < H_ActiveSize; //行信号有效像素部分
wire vs_valid  =  vcnt < V_ActiveSize; //场信号有效像素部分
wire vtc_hs    =  (hcnt >= H_SyncStart && hcnt < H_SyncEnd);//产生hs,行同步信号
wire vtc_vs    =  (vcnt > V_SyncStart && vcnt <= V_SyncEnd);//产生vs,场同步信号      
wire vtc_de    =  hs_valid && vs_valid;//只有当视频水平方向,列有效和视频垂直方向,行同时有效,视频数据部分才是有效

RGB时序转为stream时序

stream是一种标准协议接口,可用于芯片内部的数据流传输,不同于内存数据传输相关协议,基础篇没有用到这个接口,这里只给出相关代码,详细介绍请参考“总线篇”。

reg   vtc_vs_r1  ;
reg   vtc_hs_r1  ;
reg   vtc_de_r1  ;
reg   vtc_user_r1 ,vtc_user_r2;
reg   vtc_valid_r1,vtc_valid_r2;
reg   vtc_last_r2;
reg   vs_start;always @(posedge I_vtc_clk )beginif(rst_sync == 1'b0) //复位vs_start <= 1'b0;else if(vtc_user_r1)//清除VS帧同步vs_start <= 1'b0;else if(vtc_vs && vtc_vs_r1==1'b0)//当vtc_vs发生上升沿跳变代表一帧开始vs_start <= 1'b1;
end  always @(posedge I_vtc_clk  )beginvtc_vs_r1    <= vtc_vs;vtc_hs_r1    <= vtc_hs;vtc_user_r1  <= ~vtc_user_r1 & vs_start & vtc_de;//vtc_user延迟1拍vtc_last_r2  <= ~vtc_de & vtc_valid_r1; //产生stream video last 延迟于数据输入2拍vtc_valid_r1 <= vtc_de;//vtc_valid延迟1拍vtc_valid_r2 <= vtc_valid_r1;//vtc_valid对输入信号延迟2拍,以和vtc_last_r2信号配套同步vtc_user_r2  <= vtc_user_r1; //vtc_user 对输入信号延迟2拍,以和vtc_last_r2信号配套同步    
end    assign O_vtc_vs       =  vtc_vs_r1;
assign O_vtc_hs       =  vtc_hs_r1;
assign O_vtc_de_valid =  vtc_valid_r2;
assign O_vtc_user     =  vtc_user_r2;
assign O_vtc_last     =  vtc_last_r2;

5 VTC源码

`timescale 1ns / 1ns //仿真时间刻度/精度module uivtc#
(
parameter H_ActiveSize  =   1920,               //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
parameter H_FrameSize   =   1920+88+44+148,     //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
parameter H_SyncStart   =   1920+88,            //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号 
parameter H_SyncEnd     =   1920+88+44,         //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分parameter V_ActiveSize  =   1080,               //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
parameter V_FrameSize   =   1080+4+5+36,        //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
parameter V_SyncStart   =   1080+4,             //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 
parameter V_SyncEnd     =   1080+4+5            //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分
)
(
input           I_vtc_rstn,     //系统复位
input           I_vtc_clk,      //系统时钟
output          O_vtc_vs,       //场同步输出
output          O_vtc_hs,       //行同步输出
output          O_vtc_de_valid, //视频数据有效    
output          O_vtc_user,     //满足stream时序产生 user 信号,用于帧同步
output          O_vtc_last      //满足stream时序产生 later 信号,用于每行结束
);reg [11:0] hcnt = 12'd0;    //视频水平方向,列计数器,寄存器
reg [11:0] vcnt = 12'd0;    //视频垂直方向,行计数器,寄存器   
reg [2 :0] rst_cnt = 3'd0;  //复位计数器,寄存器
wire rst_sync = rst_cnt[2]; //同步复位always @(posedge I_vtc_clk or negedge I_vtc_rstn)begin //通过计数器产生同步复位if(I_vtc_rstn == 1'b0)rst_cnt <= 3'd0;else if(rst_cnt[2] == 1'b0)rst_cnt <= rst_cnt + 1'b1;
end    //视频水平方向,列计数器
always @(posedge I_vtc_clk)beginif(rst_sync == 1'b0) //复位hcnt <= 12'd0;else if(hcnt < (H_FrameSize - 1'b1))//计数范围从0 ~ H_FrameSize-1hcnt <= hcnt + 1'b1;else hcnt <= 12'd0;
end         //视频垂直方向,行计数器,用于计数已经完成的行视频信号
always @(posedge I_vtc_clk)beginif(rst_sync == 1'b0)vcnt <= 12'd0;else if(hcnt == (H_ActiveSize  - 1'b1)) begin//视频水平方向,是否一行结束vcnt <= (vcnt == (V_FrameSize - 1'b1)) ? 12'd0 : vcnt + 1'b1;//视频垂直方向,行计数器加1,计数范围0~V_FrameSize - 1end
end wire hs_valid  =  hcnt < H_ActiveSize; //行信号有效像素部分
wire vs_valid  =  vcnt < V_ActiveSize; //场信号有效像素部分
wire vtc_hs    =  (hcnt >= H_SyncStart && hcnt < H_SyncEnd);//产生hs,行同步信号
wire vtc_vs    =  (vcnt > V_SyncStart && vcnt <= V_SyncEnd);//产生vs,场同步信号      
wire vtc_de    =  hs_valid && vs_valid;//只有当视频水平方向,列有效和视频垂直方向,行同时有效,视频数据部分才是有效//**********************  video stream video rgb  ***************************
//如果是输入RGB时序,那么转为stream时序
reg   vtc_vs_r1  ;
reg   vtc_hs_r1  ;
reg   vtc_de_r1  ;
reg   vtc_user_r1 ,vtc_user_r2;
reg   vtc_valid_r1,vtc_valid_r2;
reg   vtc_last_r2;
reg   vs_start;always @(posedge I_vtc_clk )beginif(rst_sync == 1'b0) //复位vs_start <= 1'b0;else if(vtc_user_r1)//清除VS帧同步vs_start <= 1'b0;else if(vtc_vs && vtc_vs_r1==1'b0)//当vtc_vs发生上升沿跳变代表一帧开始vs_start <= 1'b1;
end  always @(posedge I_vtc_clk  )beginvtc_vs_r1    <= vtc_vs;vtc_hs_r1    <= vtc_hs;vtc_user_r1  <= ~vtc_user_r1 & vs_start & vtc_de;//vtc_user延迟1拍vtc_last_r2  <= ~vtc_de & vtc_valid_r1; //产生stream video last 延迟于数据输入2拍vtc_valid_r1 <= vtc_de;//vtc_valid延迟1拍vtc_valid_r2 <= vtc_valid_r1;//vtc_valid对输入信号延迟2拍,以和vtc_last_r2信号配套同步vtc_user_r2  <= vtc_user_r1; //vtc_user 对输入信号延迟2拍,以和vtc_last_r2信号配套同步    
end    assign O_vtc_vs       =  vtc_vs_r1;
assign O_vtc_hs       =  vtc_hs_r1;
assign O_vtc_de_valid =  vtc_valid_r2;
assign O_vtc_user     =  vtc_user_r2;
assign O_vtc_last     =  vtc_last_r2;endmodule

6 RTL仿真

6.1仿真激励文件

为简化仿真,这里模拟的视频格式为320*5 即一行的有效数据为350个像素,一帧数据有5行像素数据。

`timescale 1ns / 1ns //仿真时间刻度/精度module vtc_tb;localparam SYS_TIME = 20;//系统时钟周期20nsreg I_vtc_rstn,I_vtc_clk;
wire O_vid_vs,O_vid_hs,O_vtc_de_valid,O_vtc_user,O_vtc_last;//例化视频时序产生模块
uivtc#
(
.H_ActiveSize(320),         //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素,设置320个像素
.H_FrameSize(320+88+44+239),//视频时间参数,行视频信号,一行视频信号总计占用的时钟数 
.H_SyncStart(320+88),       //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
.H_SyncEnd(320+88+44),      //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行数据有效数据部分
.V_ActiveSize(5),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
.V_FrameSize(5+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
.V_SyncStart(5+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 
.V_SyncEnd (5+4+5)          //视频时间参数,场同步结束,即多少行数后停止产生场同步信号,之后就是场有效数据部分
)
uivtc_inst
(
.I_vtc_clk(I_vtc_clk),  //系统时钟
.I_vtc_rstn(I_vtc_rstn),//系统复位
.O_vtc_vs(O_vid_vs),    //图形的vs信号
.O_vtc_hs(O_vid_hs),    //图形的hs信号
.O_vtc_de_valid(O_vtc_de_valid),      //de数据有效信号
.O_vtc_user(O_vtc_user),     //满足stream时序产生 user 信号,用于帧同步
.O_vtc_last(O_vtc_last)      //满足stream时序产生 later 信号,用于每行结束
);initial beginI_vtc_clk  = 1'b0;I_vtc_rstn = 1'b0;#100;I_vtc_rstn = 1'b1;
endalways #(SYS_TIME/2) I_vtc_clk= ~I_vtc_clk;endmodule

6.2仿真结果

7 常用系统分辨率

对于148.5MHZ像素时钟,输出1080*1920*60

H_ActiveSize    =1920 
H_SyncStart     =1920+88
H_SyncEnd       =1920+88+44
H_FrameSize     =1920+88+44+148
V_ActiveSize    =1080
V_SyncStart     =1080+4
V_SyncEnd       =1080+4+5
V_FrameSize     =1080+4+5+36 

对于74.25MHZ像素时钟,输出1280*720*60

H_ActiveSize    =1280 
H_SyncStart     =1280+110
H_SyncEnd       =1280+110+ 40
H_FrameSize     =1280+110+ 40+220
V_ActiveSize    =720
V_SyncStart     =720+4
V_SyncEnd       =720+4+5
V_FrameSize     =720+4+5+21

对于42MHZ像素时钟,输出640*480*60

H_ActiveSize    =640 
H_SyncStart     =640+16
H_SyncEnd       =640+16+96
H_FrameSize     =640+16+96+48
V_ActiveSize    =480
V_SyncStart     =480+9
V_SyncEnd       =480+9+2
V_FrameSize     =480+9+2+34

对于非标准分辨率,用户可以以上面介绍的方法计算相近参数。

比如对于非标准140MHZ像素时钟,输出1080*1920*60

H_ActiveSize    =1920
H_SyncStart     =1920+88
H_SyncEnd       =1920+88+44
H_FrameSize     =1920+88+44+71V_ActiveSize    =1080
V_SyncStart     =1080+4
V_SyncEnd       =1080+4+5 
V_FrameSize     =1080+4+5+16

比如对于非标准75MHZ像素时钟,输出1280*720*60

H_ActiveSize    =1280
H_SyncStart     =1280+88
H_SyncEnd       =1280+88+44
H_FrameSize     =1280+88+44+239V_ActiveSize    =720
V_SyncStart     =720+4
V_SyncEnd       =720+4+5 
V_FrameSize     =720+4+5+28

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/380011.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACM中国图灵大会专题 | 图灵奖得主Manuel Blum教授与仓颉团队交流 | 华为论坛:面向全场景应用编程语言精彩回顾

ACM 中国图灵大会&#xff08;ACM Turing Award Celebration Conference TURC 2024&#xff09;于2024年7月5日至7日在长沙举行。本届大会由ACM主办&#xff0c;in cooperation with CCF&#xff0c;互联网之父Vinton Cerf、中国计算机学会前理事长梅宏院士和廖湘科院士担任学术…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【26】【内网穿透】cpolar

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【27】【内网穿透】cpolar 内网穿透cpolar内网穿透联调配置练习—使用公网地址访问gulimall.com参考 内网穿透 正常的外网需要访问我们项目的流程是&#xff1a; 买服务器并且有公网固定…

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划&#xff08;ERP&#xff09; 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理&#xff08;计划&#xff09;3.7.2.3 经营计划&#xff08;生产计划大纲&#xff09;3.7.2.4 …

小白新手搭建个人网盘

小白新手搭建个人网盘 序云服务器ECS重置密码远程连接ECS实例 安装OwnCloud安装Apache服务PHP运行环境NAS挂载挂载验证操作体验 序 阿里云文件存储NAS&#xff08;Apsara File Storage NAS&#xff09;是一个可大规模共享访问&#xff0c;弹性扩展的分布式文件系统。本文主要是…

好玩的调度技术-场景编辑器

好玩的调度技术-场景编辑器 文章目录 好玩的调度技术-场景编辑器前言一、演示一、代码总结好玩系列 前言 这两天写前端写上瘾了&#xff0c;顺手做了个好玩的东西&#xff0c;好玩系列也好久没更新&#xff0c;正好作为素材写一篇文章&#xff0c;我真的觉得蛮好玩的&#xff…

免费视频批量横转竖

简介 视频处理器 v1.3 是一款由是貔貅呀开发的视频编辑和处理工具&#xff0c;提供高效便捷的视频批量横转竖&#xff0c;主要功能&#xff1a; 导入与删除文件&#xff1a;轻松导入多个视频文件&#xff0c;删除不必要的文件。暂停与继续处理&#xff1a;随时暂停和继续处理。…

【JavaEE进阶】——Spring AOP

目录 &#x1f6a9;Spring AOP概述 &#x1f6a9;Spring AOP快速⼊⻔ &#x1f393;引入AOP依赖 &#x1f393;编写AOP程序 &#x1f6a9;Spring AOP 详解 &#x1f393;Spring AOP核⼼概念 &#x1f393;通知类型 &#x1f393;PointCut &#x1f393;切⾯优先级 Ord…

泰迪科技2024年高校(本科/职业院校)大数据实验室建设及大数据实训平台整体解决方案

高校大数据应用人才培养目标 大数据专业是面向信息技术行业&#xff0c;培养德智体美劳全面发展的大数据领域的高素质管理型专门人才&#xff0c;毕业生具备扎实的管理学、经济学、自然科学、技术应用、人文社科的基本理论, 系统深入的大数据管理专业知识和实践能力&#xff0c…

如何学习Spark:糙快猛的大数据之旅

作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。 目录 Spark是什么?学习Spark的"糙快猛"之道1. 不要追求完美,在实践中学习2. 利用大模型作为24小时助教3. 根据自己的节…

宠物空气净化器哪款品牌好?口碑好的猫用空气净化器排名

猫咪每年掉毛两次&#xff0c;一次掉半年的现象真让人头疼。作为一位5年资深铲屎官&#xff0c;特别是在掉毛季节&#xff0c;猫毛无处不在&#xff0c;对此深有体会。宠物空气净化器已成为铲屎官们的救星&#xff0c;能迅速清理家中的宠物毛发和异味&#xff0c;是养猫家庭的必…

四个节点即可实现的ComfyUI批量抠图工作流

原文链接&#xff1a;ComfyUI面部修复完全指南 (chinaz.com) 下图就是批量抠图的工作流 虽然工作流很简单&#xff0c;但是我们前提还是需要安装好我们的节点 首先安装我们的抠图节点 安装 BiRefNet 所需依赖&#xff1a;timm&#xff0c;如已安装无需运行 requirements.txt…

【最新发布】生成式人工智能全球研究报告

7月10日&#xff0c;美国著名的大数据分析平台和全球最大的数据分析公司之一SAS在其官网发布了一份关于生成式人工智能&#xff08;AIGC&#xff09;深度应用的调查报告。 本次的报告主要对以美国、中国、英国、法国、巴西、日本等为主的北美、拉美、欧洲、亚太地区主要国家的1…

云计算实训09——rsync远程同步、自动化推取文件、对rsyncd服务进行加密操作、远程监控脚本

一、rsync远程同步 1.rsync基本概述 &#xff08;1&#xff09;sync同步 &#xff08;2&#xff09;async异步 &#xff08;3&#xff09;rsync远程同步 2.rsync的特点 可以镜像保存整个目录树和文件系统 可以保留原有权限&#xff0c;owner,group,时间&#xff0c;软硬链…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX并下载(下载模版)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

AI 绘画|Midjourney设计Logo提示词

你是否已经看过许多别人分享的 MJ 咒语&#xff0c;却仍无法按照自己的想法画图&#xff1f;通过学习 MJ 的提示词逻辑后&#xff0c;你将能够更好地理解并创作自己的“咒语”。本文将详细拆解使用 MJ 设计 Logo 的逻辑&#xff0c;让你在阅读后即可轻松上手&#xff0c;制作出…

机器学习-18-统计学与机器学习中回归的区别以及统计学基础知识

参考通透!一万字的统计学知识大梳理 参考3万字长文!手把手教你学会用Python实现统计学 参考统计学的回归和机器学习中的回归有什么差别? 1 研究对象 一维:就是当前摆在我们面前的“一组”,“一批数据。这里我们会用到统计学的知识去研究这类对象。 二维:就是研究某个“事…

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿

切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…

【electron6】浏览器实时播放PCM数据

pcm介绍&#xff1a;PCM&#xff08;Puls Code Modulation&#xff09;全称脉码调制录音&#xff0c;PCM录音就是将声音的模拟信号表示成0,1标识的数字信号&#xff0c;未经任何编码和压缩处理&#xff0c;所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信…

【Langchain大语言模型开发教程】模型、提示和解析

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、使用Langchain实例化一个LLM的接口 2、 使用Langchain的模板功能&#xff0c;将需要改动的部分抽象成变量&#xff0c;在具体的情况下替换成需要的内容&#xff0c;来达到模板复用效…

AIoTedge 智能边缘物联网平台

AIoTedge智能边缘物联网平台是一个创新的边云协同架构&#xff0c;它为智能设备和系统提供了强大的数据处理和智能决策能力。这个平台的核心优势在于其边云协同架构设计&#xff0c;它优化了数据处理速度&#xff0c;提高了系统的可靠性和灵活性&#xff0c;适用于多种场景&…