CH7301C控制DVI接口输出
1原理
设计一个符合DVI协议的接口,显示。要求:
1) 利用 FPGA 实现DVI 接口;
2) 输入为复位信号,输出为640x480的24位真彩图片;
3) 图片以文件形式预先写入FPGA中RAM;
4) 时钟信号为开发板上100MHz时钟信号。
实验中DVI接口中有芯片CH7301C,要求用IIC总线正确配置
DVI的数据与VGA的类似
PLL锁相环的双差分时钟的输出
ROM的IP核的调用存储24位图片的RGB的数据
Matlab程序:jpg图片到rom的coe固化文件
系统描述:
① 此系统以通过DVI驱动芯片CH7301C控制DVI接口输出VGA,12位RGB数据传输图片信号;
② 外部为系统提供时钟,复位
③ 系统为CH7301C芯片在IIC模块初始化后,提供像素数据,行、场同步,数据使能,像素时钟等信号:同时提供存储器地址信号。
④ 输入像素数据为24位RGB信号,由于硬件资源的有限,实际图片是240*160的大小;
⑤ 输出存储器地址信号共16位,8位数据输出;
⑥ 输出VGA格式为800*600@60Hz+40MHz的双差分时钟(锁相环)
1 DVI简介
DVI---全称为(Digita Visual Interface),DVI传送的不同讯号类别,不同种类的DVI插头格式不尽相同,详细如下:
DVI-D(DVI Digital)Single Link
DVI-D(DVI Digital)Dual Link
DVI-A(DVI Analog)
DVI-I(DVI Digital&Analog)Single Link
DVI-I(DVI Digital&Analog)Dual Link DVI-D:只传送数码影像讯号,现时一般DVD机附设的DVI输出端子,由于必是传送数码影像,所以全部是DVI-D格式。 DVI-A:只传送模拟影像讯号,这个格式一般相信是过渡性产品,事实上,DVI-A和传统的VGA线功能一模一样。有电脑显示卡的DVI输出端子可以选择输出模拟讯号,此时便可接驳DVI-A格式的DVI线,不过相信很少人会这样做了。 DVI-I:可传送数码或模拟影像讯号,有些电脑显示卡,由于可以DVI端子输出数码或模拟讯号,所以端子为DVI-I规格,另一方面,DVI-I线材亦可以传送模拟数码不同讯号。
DVI是由DDWG(Digital Display working Group,数字显示工作组)发明的一种高速传输数字信号的技术,有DVI-D和DVI-I两种不同的接口形式。DVI-D只有数字接口,DVI-I有数字和模拟接口,目前应用主要以DVI-D为主。DVI是基于TMDS(Transition Minimized Differential Signaling,转换最小差分信号)技术来传输数字信号,TMDS运用先进的编码算法把8bit数据(R、G、B中的每路基色信号)通过最小转换编码为10bit数据(包含行场同步信息、时钟信息、数据DE、纠错等),经过DC平衡后,采用差分信号传输数据,它和LVDS、TTL相比有较好的电磁兼容性能,可以用低成本的专用电缆实现长距离、高质量的数字信号传输。
2 IIC简介
IIC 总线支持任何IC 生产过程NMOS CMOS 双极性两线――串行数据SDA 和串行时钟SCL 线在连接到总线的器件间传递信息每个器件都有一个唯一的地址识别无论是微控制器LCD驱动器存储器或键盘接口而且都可以作为一个发送器或接收器由器件的功能决定
主控器向被控器发送的信息种类有:启动信号、停止信号、7位地址码、读/写控制位、10位地址码、数据字节、重启动信号、应答信号、时钟脉冲。
总线空闲状态。
I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
启动信号。
在时钟线SCL保持高电平期间,数据线SDA上的电平被拉低(即负跳变),定义为I2C总线总线的启动信号,它标志着一次数据传输的开始。
启动信号是一种电平跳变时序信号,而不是一个电平信号。启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态。
停止信号。
在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。
停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。
数据位传送。
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。 只有在SCL为低电平期间,才允许SDA上的电平改变状态。逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时)。
应答信号。
I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。
插入等待时间。
如果被控器需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL电平拉低并且保持,使主控器进入等待状态。一旦被控器释放时钟线,数据传输就得以继续下去,这样就使得被控器得到足够时间转移已经收到的数据字节,或者准备好即将发送的数据字节。
3 CH7301C简介
CH7301C的DVI发送器可达165MHz频率,最高能支持1 600×1 200分辨率,支持DVI的热拔插 检测,为RGB 输出提供10位高速视频DAC(数模转换器);支持I2 C端口完全可编程,完全支持Windows和DOS驱动器,低电压接口,很方便与图形控制器连接
电路设计
下图为CH7301C的内部功能框图,图中CH7301C 的输入信号如:一对差分对时钟(XCLK,XCLK*);12位并行像素数据(D[11..0]);行同步信号(H)、场同步信号(V)、消影信号(DE)及参考电压信号(VREF)。CH7301C的输出信号如下:DVI(数据差分对
TDC0、TDC0*,TDC1、TDC1*,TDC2、TDC2*以及时钟差分对TLC、TLC*);VGA(DAC2、DAC1、DAC0、HSYNC、VSYNC)。
CH7301C-TF内部结构图
I2C时序
CH7301C的I2 C时序如图4所示,I2C有一个起始状态和结束状态;Device ID为CH7301C内部7位I2C串口地址,文中设计地址为0x76h;R/W*为读/写控制信号,0表示写串口,1表示读串口;DeviceID 和R/W*组成一个DAB(设备地址寄存器),ACK为I2C确认信号。图4 CH7301C的I2C串行传输协议图。
CH7301C的I2C串行传输协议图
//// 初始化memery
////ch7301 IIC register setN NAME Address R[7]=1,R[6:0] Value
//OX76+R/W=0(write) =>111 0110 0
//0 CM ,0x1c,0x00 default:0x00
//1 DCR,0x21,0x09 default:00000000 control for VGA signal out
//2 ICR,0x1D,0x43 default: 10001000 delay clkinn/p
//3 HPD,0x23,0x08 *************
//4 TSTP,0x48,0x18 default:xxx11000
//5 TPCP,0x33,0x08 default:11100100 111 to drive level
//6 TPD,0x34,0x16 *************
//7 TPF,0x36,0x60 default:00000000 bit7-4 to DVI low pass filter
//8 TPVT,0x35,0x70 default:00110000 11 to DVIpll supply
//9 PMR,0x49,0xc0 default:00000001 ch7301 circuit block
对CH7301C 的寄存器进行写操作,在FPGA 内使用了状态机来完成CH7301C以上寄存器的I2C写操作。
差分时钟信号,12位RGB视频数据,数据使能信号以及行场同步信号输入到CH7301C-TF之后首先进行锁存和分解复用,然后通过编码器进行编码,最后通过TMDS通道将编码的数据包发送至接收端,接收端再进行解码,最终通过显示终端显示出来。在DVI输出模式下,多路复用的数据,同步信号,数据使能信号和时钟信号输入到CH7301C-TF。数据时2X复用的,而时钟信号可以是像素时钟的1X倍或者2X倍。下表列举了一些支持模式的例子,表中的时钟频率是根据VESA的显示时序而来,但是CH7301C-TF并不是仅仅依赖表中时序规格的设置,只要像素时钟低于165MHz,任意的像素/行,行/帧和时钟速率都是可以接收的。但是对于正确的DVI操作,输入数据必须是一种RGB输入模式。
模式(IDF) |
描述 |
0 |
12位多路RGB输入(24位),(复用方案1) |
1 |
12位多路RGB输入(24位),(复用方案2) |
2 |
8位多路RGB输入(16位,565) |
3 |
8位多路RGB输入(15位,555) |
4 VGA简介
VGA(视频图形阵列Video Graphics Array)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域得到了广泛的应用。
VGA时序发生器模块产生显示器所需的时序,这是完成设计的关键,时序稍有偏差,显示必然不正常,甚至会损坏彩色显示器。
VGA时序分析:
显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT(阴极射线管)屏幕上从左到右(受水平同步信号 HSYNC控制)、从上到下(受垂直同步信号 VSYNC控制)做有规律的移动。光栅扫描又分逐行扫描和隔行扫描。隔行扫描指电子束在扫描时每隔一行扫一线,完成一屏后再返回来扫描剩下的线,与电视机的原理一样。隔行扫描的显示器扫描闪烁的比较厉害,会让使用者的眼睛疲劳。目前微机所用显示器几乎都是逐行扫描。逐行扫描是指扫描从屏幕左上角一点开始,从左向右逐点进行扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步;当扫描完所有行,形成一帧时,用场同步信号进行场同步,并使扫描回到屏幕的左上方,同时进行行场消隐,开始下一帧的扫描。完成一行扫描所需时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描所需的时间称为垂直扫描时间,其倒数为垂直扫描频率,又称刷新频率,即刷新一屏的频率。常见的有 60Hz、75Hz等。
VGA显示器要正确显示图像关键还是如何实现 VGA时序。视频电子标准协会( VESA, Video Electronics Standards Association)对显示器时序进行了规范。 VGA的标准参考显示时序如下图。行时序和场时序都需要产生同步脉冲(Sync a)、显示后沿 (Back porch b)、显示时序段(Display interval c)和显示前沿 (Front porch d)四个部分。 VGA工业标准显示模式要求:行同步、场同步都为负极性,即同步头脉冲要求是负脉冲。
VGA的行时序如图所示:每一行都有一个负极性行同步脉冲( Sync a),是数据行的结束标志,同时也是下一行的开始标志。在同步脉冲之后为显示后沿 (Back porch b),在显示时序段(Display interval c)显示器为亮的过程,RGB数据驱动一行上的每一个象素点,从而显示一行。在一行的最后为显示后沿(Back porch b)。在显示时序段( Display interval c)之外没有图像投射到屏幕时插入消隐信号。同步脉冲(Sync a)、显示后沿(Back porch b)和显示前沿(Front porch d)都是在行消隐间隔内( Horizontal Blanking Interval),当行消隐有效时, RGB 信号无效,屏幕不显示数据。
VGA的场时序与 VGA的行时序基本一样,如图3所示,每一帧的负极性帧同步脉冲(Sync a)是一帧的结束标志,同时也是下一帧的开始标志。而显示数据是一帧的所有行数据。
几种常用的时序参数如表 1和表2 所示,首先,根据显示器的性能选择一种合适的VGA模式,然后由象素时钟频率和图像分辨率计算出行总周期数,再把表 1和表 2中给出的 a、 b、c、d各时序段的时间按照象素计数脉冲源频率折算成时钟周期数。在 FPGA/CPLD中用计数器和触发器,以计算出的各时序段时钟周期数为基准,产生不同宽度和周期的脉冲信号,再利用它们的逻辑组合构成图 2和图 3中的 a、b、c、d各时序段以及 ADV7125的空白信号 BLANK和同步信号 SYNC。
5 图像存储原理简介
本文选择240X160@60Hz的24位BMP真色彩的图片来进行硬件测试设计的功能,首先要将图片转化为数据流的形式,只有数据流才能存在存储器里面,然后才能通过时序进行输出,实施的过程中需要产生包含所有像素信息的coe文件来对ROM进行初始化,然后会自动生成mif文件,mif文件是以二进制顺序存储,根据寻址输出数据。有很多功能软件可以观察图片的数据流信息,如UE和Winhex,都可以观察图片的十六进制数据信息,但是UE不能复制信息,而Winhex可以进行复制,然后稍微处理一下,保存为coe文件的格式。本文采用Matlab库函数imread进行数据流的读取,函数调用形式为 “A=imread('地址:图片名称');函数运行之后产生3个矩阵,矩阵里的信息即为R,G,B的数据信息,然后通过c做简单的处理保存为coe文件,coe文件中保存的数据类型可以为二进制,八进制,十进制和十六进制,Matlab产生为十进制的数据,coe的文件格式如下图所示,其中最后一个数据之后以分号结束。
产生coe文件包含240*160=38400个字节。ROM地址计算:
Rom_addr16=ypix*240+xpix
Xpix和ypix是图像本地存储的位置
而乘法时采用移位相加算法:
Ypix*240=ypix*(128+64+32+16)=ypix*(8'b1000 0000+7'b1000000+6'b100000+5'b10000)
附:matlab程序
A=imread('D:\xilinx_files\cheshe\matlab_jpgtocoe\gongda.bmp');
for i=1:160;
for j=1:240;
B(i,j)=A(i,j,1);
G(i,j)=A(i,j,2);
R(i,j)=A(i,j,3);
end
end
fid=fopen('D:\xilinx_files\cheshe\matlab_jpgtocoe\B.txt','w');%写入文件路径
matrix=B %input_matrix为待输出矩阵
[m,n]=size(matrix);
for i=1:1:m
for j=1:1:n
if j==n
fprintf(fid,'%g\n,',matrix(i,j));
else
fprintf(fid,'%g,',matrix(i,j));
end
end
end
fclose(fid);