发明内容
本发明目的在于提供一种基于NIOS II的视频处理方法,解决了现有的视频处理的方法未能充分利用NIOS II软核,且方法单一的技术问题。
本发明针对上述技术问题的技术解决方案如下:
一种基于NIOS II的视频处理方法,其特殊之处在于,该方法包括以下步骤:
[1.1]解码:将BT656视频信号通过BT656解码解码为隔行的YCbCr数字视频信号及隔行的同步信号I;
[1.2]去隔行:将隔行的YCbCr数字视频信号及隔行的同步信号I通过去隔行转换为逐行的YCbCr数字视频信号及逐行的同步信号I;
[1.3]视频缩放:将逐行的YCbCr数字视频信号以及逐行的同步信号I通过视频缩放至YCbCr转RGB,转换为RGB数字视频信号;
[1.4]时序调配:将RGB数字视频信号以及NIOS II配置时钟信号通过VGA时序发生消隐调配为RGB数字视频信号、同步信号II以及供VGA显示的时钟信号;
[1.5]视频缩放:根据VGA时序发生输出的同步信号II、NIOS II控制系统提供的配置缩放参数、去隔行输出的同步信号I,将去隔行输出的逐行的YCbCr数字视频信号通过视频缩放缩放为YCbCr数字视频信号;
[1.6]数字视频信号格式转换:将缩放的YCbCr数字视频信号通过YCbCr转RGB转换为RGB数字视频信号;
[1.7]时序调配:RGB数字视频信号以及NIOS II配置时钟信号通过VGA时序发生输出RGB数字视频信号、VGA同步信号II以及供VGA显示的时钟信号;将RGB数字视频信号、同步信号II以及供VGA显示的时钟信号一路输至MUX选择,另一路经NIOS II控制系统22输至MUX选择;
[1.8]信号选择:VGA时序发生输出的RGB数字视频信号、VGA同步信号II以及供VGA显示的时钟信号直接经MUX选择输出供VGA显示,或VGA时序发生输出的RGB数字视频信号、VGA同步信号II以及供VGA显示的时钟信号经NIOS II控制系统控制后再经MUX选择输出供VGA显示。
以上所述的步骤[1.5]具体的实现方法为:
1)计算插值步长
视频缩放(213)根据输入的同步信号I和同步信号II计算插值步长,即计算:插值步长=同步信号I/同步信号II得插值步长;
1.1)确定新像素点X插值的位置
根据插值步长来确定新像素点X插值位置;
2)计算当前像素点X的非线性插值结果x_lans
以2n个原始像素点为方阵式区域,形成X1~X2n个像素点,得到X位置的像素值即非线性插值结果x_lans,其中n取≥4的偶数;
3)确定当前像素点的线性插值结果x_bi;
4)通过自适应判断确定最终插值结果。
以上所述的步骤2)的具体实现方法是:
2.1)计算方阵的列缩放系数para_v、方阵的行缩放系数para_h、
应用Lanczos非线性插值函数,
来确定方阵的列缩放系数para_v以及方阵
的行缩放系数para_h;
2.2)确定查找表
将步骤2.1)所得的方阵的列缩放系数para_v、方阵的行缩放系数para_h写入查找表;
2.3)确定每列的垂直向系数
查找步骤2.2)中所得查找表的方阵的列缩放系数para_v,计算归一化的系数的和sum1以及每列的垂直向系数;
归一化的系数的和sum1为方阵的列缩放系数para_v之和;
计算:垂直向系数X_m1=(X1*para_v1+X5*para_v2+X9*para_v3+X13*para_v4)/sum1
垂直向系数X_m2=(X2*para_v1+X6*para_v2+X10*para_v3+X14*para_v4)/sum1
垂直向系数X_m3=(X3*para_v1+X7*para_v2+X11*para_v3+X15*para_v4)/sum1
垂直向系数X_m4=(X4*para_v1+X8*para_v2+X12*para_v3+X16*para_v4)/sum1
则得每列的垂直向系数;
2.4)确定最终X位置的非线性插值结果X_lans
查找步骤2.2)中所得查找表的方阵的行缩放系数para_h计算水平向归一化的系数的和sum2;
水平向归一化的系数的和sum2为方阵的行缩放系数para_h之和;
计算:X_lans=(X_m1*para_h1+X_m2*para_h2+X_m3*para_h3+…)/sum2,得非线性插值结果X_lans;
2.5)过冲和下冲控制
2.5.1)选取方阵相邻列的原始像素点位置的最大值XL_max以及方阵相邻列的原始像素点位置的最小值XL_min;
2.5.2)根据设计要求选择n位过冲控制门限0T_ctrl和n位下冲控制门限UT_ctrl,其范围是0~2n-1;
2.5.3)判定过冲和下冲控制以确定非线性插值结果X_lans1;
2.5.3.1)将经步骤2.4)所得的非线性插值结果X_lans与原始像素点位置的最大值XL_max进行比较后,控制过冲,确定非线性插值结果X_lans1;
2.5.3.2)将经步骤2.4)所得的非线性插值结果X_lans与原始像素点位置的最小值X_min进行比较后,进行下冲控制,确定非线性插值结果X_lans1。
以上所述的步骤3)的具体实现方法是:
3.1)确定待插值的水平左右点
计算:
待插值的水平左点LL1=[X1*N_ctrl1+X2*(2n-N_ctrl1)]/2n
待插值的水平右点LR1=[X4*N_ctrl1+X3*(2n-N_ctrl1)]/2n
待插值的水平左点LL2=[X5*N_ctrl1+X6*(2n-N_ctrl1)]/2n
待插值的水平右点LR2=[X8*N_ctrl1+X7*(2n-N_ctrl1)]/2n
待插值的水平左点LL3=[X9*N_ctrl1+X10*(2n-N_ctrl1)]/2n
待插值的水平右点LR3=[X12*N_ctrl1+X11*(2n-N_ctrl1)]/2n
待插值的水平左点LL4=[X13*N_ctrl1+X14*(2n-N_ctrl1)]/2n
待插值的水平右点LR4=[X16*N_ctrl1+X15*(2n-N_ctrl1)]/2n
其中n位门限N_ctrl1选取范围为0~2n-1,得待插值的水平左右点;
3.2)确定线性插值点
计算:
线性插值点X_l1=LL1*(1-x_offset)+LR1*x_offset,
线性插值点X_l2=LL2*(1-x_offset)+LR2*x_offset,
线性插值点X_l3=LL3*(1-x_offset)+LR3*x_offset,
线性插值点X_l4=LL4*(1-x_offset)+LR4*x_offset,
其中x_offset为水平向偏移量,得线性插值点;
3.3)确定垂直方向的上点X_UP,垂直方向的下点X_DN
计算:
垂直方向的上点X_UP=[X_11*N_ctrl1+X_l2*(2n-N_ctrl1)]/2n,
垂直方向的下点X_DN=[X_l3*N_ctrl1+X_l4*(2n-N_ctrl1)]/2n,
得垂直方向上的点X_UP及垂直方向的下点X_DN;
3.4)得到线性插值结果X_bi
计算:
X_bi=X_UP*(1-y_offset)+X_DN*y_offset,其中y_offset为垂直向偏移量,得线性插值结果X_bi;
以上所述的步骤4)的具体实现方法是:
将线性插值结果X_bi与非线性插值结果X_lans1进行对比以确定最终插值结果;
4.1)选取原2n个像素点的位置的最大值Ymax,选取原2n个像素点的位置的最小值Ymin;
4.2)将原2n个像素点的位置的最大值Ymax与原2n个像素点的位置的最小值Ymin的差值和n位门限N_ctrl2进行比较,确定插值结果;
以上所述的步骤2.1)的具体实现方法为:
计算方阵的列缩放系数para_v=sinc(距X位置的垂直向行数-X)*sinc((距X位置的垂直向行数-X)/a),其中X取0/256~256/256中的任意值,a=n/2,则得方阵的列缩放系数;
计算方阵的行缩放系数para_h=sinc(距X位置的水平向列数-X)*sinc((距X位置的水平向列数-X)/a),其中X取0/256~256/256中的任意值,a=n/2,则得方阵的行缩放系数。
以上所述的步骤2.5.3.1)的具体实现方法为:
2.5.3.1.1)如果X_lans>X_max,则非线性插值结果X_lans1=X_lans-(X_lans-X_max)*0T_ctrl/2n;
当X_lans1>255时,则非线性插值结果X_lans1值确定为X_lans1=255;
2.5.3.1.2)如果非线性插值结果X_lans<原始像素点位置的最小值X_min,则非线性插值结果X_lans1=X_lans+(X_min-X_lans)*UT_ctrl/2n;当非线性插值结果X_lans1<0时,则非线性插值结果X_lans1值确定为X_lans 1=0。
以上所述的步骤4.2)的具体实现方法是:若原2n个像素点的位置的最大值Ymax-原2n个像素点的位置的最小值Ymin>n位门限N_ctrl2,则插值结果为线性插值X_bi;若原2n个像素点的位置的最大值Ymax-原2n个像素点的位置的最小值Ymin<n位门限N_ctrl2,则插值结果为非线性插值结果X_lans,其中n位门限N_ctrl2的取值范围为0~2n-1。
以上所述的步骤[1.1]中的去隔行(212)采用双口RAM来实现。
以上所述的步骤[1.6]中的YCbCr转RGB(214)应用矩阵
来实现。
本发明的优点如下:
1)适用性强,输出不同的VGA制式可通过参数配置;
2)本发明使用多相位插值方法减少计算的复杂度;
3)本发明使用插值系数查找表方法易于更新:
在视频处理的过程中只需要调整查找表的内容,即可实现视频处理中的视频缩放;
4)本发明插值精度达到1/256个像素值,使得图像清晰度更高;
5)本发明理论上可无限放大视频信号,可将视频信号最小缩至原视频信号的1/2。
具体实施方式
参见图1,视频监视系统一般主要由视频信号转换1(ADV7181B)、视频计算处理/系统控制2、数据存储/通信3、视频显示信号转换4(DAV7213)以及VGA显示5构成;其中视频计算处理/系统控制2由视频处理21和NIOS II控制系统22构成,视频监视系统实现方法如下所述:a.将模拟视频信号输至视频信号转换1(ADV7181B),经视频计算处理/系统控制2中的NIOSII控制系统22控制后,该模拟视频信号转换为数字视频信号以及同步信号I;b.将数字视频信号以及同步信号I经视频计算处理/系统控制2中视频处理21的处理,输出RGB数字视频信号以及同步信号II;c.将视频计算处理/系统控制2中的视频处理21输出的RGB数字视频信号以及同步信号II直接输至视频显示信号转换4(DAV7213),转换为模拟的RGB数字视频信号;或者将视频处理21输出的RGB数字视频信号以及同步信号II经NIOSII控制系统22输至数据存储/通信3中的SDRAM32存储后,输至视频显示信号转换4(DAV7213)转换为模拟的RGB数字视频信号;或者将将视频处理21输出的RGB数字视频信号以及同步信号II经NIOSII控制系统22先输至数据存储/通信3中的串行接口31,后经串行接口31上传至上位机;d.将模拟的RGB数字视频信号输至VGA显示5以供输出。
以下结合附图对本发明具体实现方法进行详细阐述,视频处理的主要实现方法参见图2。
[1.1]解码:BT656视频信号以及同步信号I是视频计算处理/系统控制2中的NIOS II控制系统21控制视频信号转换1(ADV7181B),将NTSC/PAL/S-Video模拟视频信号转换为数字视频信号,进行视频解码,输出的标准8位BT656视频信号以及同步信号I,供后端的BT656解码211处理。
BT656解码211要遵守BT.656时序及数据格式得到隔行的YCbCr数字视频信号,同步信号I的输出信号,其中YCbCr数字视频信号具体的可以是4∶4∶4、4∶4∶2等的YCbCr数字视频信号。
参见图3,视频信号转换2(ADV7181B)输出BT656行信号时序,“80 10…”表示当前视频信号处于行消隐阶段。“FF 00 00 XY”是时间参考代码。当XY的bit6=’1’,是EAV(有效视频结束),bit6=’0’,是SAV(有效视频开始)Cb Y Cr Y…为有效视频信号(占用1440个CCL)。XY时间参考代码参见表1。
表1
数据比特号 |
第一字节 |
第二字节 |
第三字节 |
第四字节 |
7(MSB) |
1 |
1 |
1 |
1 |
6 |
1 |
1 |
1 |
F |
5 |
1 |
1 |
1 |
V |
4 |
1 |
1 |
1 |
H |
3 |
1 |
1 |
1 |
P3 |
2 |
1 |
1 |
1 |
P2 |
1 |
1 |
1 |
1 |
P2 |
0 |
1 |
1 |
1 |
P0 |
XY定义为:
F=“0”forField 0,F=“1”for Field 1;V=“1”during vertical blanking;H=“0”at SAV H=“1”at EAV;
BT656解码211的输入信号是视频信号转换1(ADV7181B)输出的BT656视频信号、同步信号I,输出的是YCbCr数字视频信号及同步信号I。BT656解码主要接口参见图4:Clk_bt656是FPGA 27MHZ时钟;BT656_in[7:0]:视频信号转换1(ADV7181B)输出的BT656视频信号;Hsync1:BT656解码解出的行同步信号I;Vsync1:BT656解码解出的场同步信号I;Data_valid1:BT656解码输出的有效数据信号;Field1:BT656解码输出的场标志信号,0代表偶场,1代表奇场;Y_data1,Cb_data1,Cr_data1:BT656解码输出的YCbCr信号。BT656解码接口时序参见图5。
[1.2]去隔行:去隔行212的输入信号是BT656解码211得到的隔行的YCbCr数字视频信号及同步信号I。为节省资源,去隔行采用行复制的转逐行方法,即奇、偶数行每行多复制一行输出。这样,奇、偶数场各可以拼成一帧输出。
偶场同步信号I时序及奇场同步信号I时序分别参见图6、图7。
因为要完整的复制每一行数据,并且要保存下一行的数据,可采用双口RAM来存数据。因视频信号转换2采样的BT656数字视频信号以及同步信号I的传输速率为13.5MHz,而去隔行212输出的YCrCb数字视频信号以及同步信号I的传输速率为27MHz,去隔行211采用双口RAM,去隔行212每一行数据读两次,回复频率,同时完成隔行扫描到逐行扫描的转换。
去隔行212采用双口RAM,可缓存一场数据。去隔行212的读写是同时进行。双口RAM工作监测波形参见图8,address_a为写地址计数,地址计数时钟为13.5M.使能地址计数为TD_HS,低电平有效;address_b为读地址计数,地址计数时钟为27M.使能地址计数为BLANK,高电平有效。从信号波形看,address_a和address_b计数相等为720,满足设计要求。同时每写入一场可准确读出两场数据,没有偏差,完全符合设计要求。
去隔行212接口参见图9,Hsync2去隔行212输出的逐行的行同步信号I;Vsync2去隔行212输出的逐行的场同步信号I;Data_valid2去隔行212输出的有效数据信号;Y_data2,Cb_data2,Cr_data2去隔行212输出的YCbCr数字视频信号。
完整YCbCr输出时序参见图10,当data_valid2为高电平时,YCrCb输出有效视频数据,为低电平时,输出消隐数据,Y输出”0x00”,Cr、Cb输出”0x80”。
[1.3]视频缩放:将逐行的YCbCr数字视频信号以及逐行的同步信号I通过视频缩放213至YCbCr转RGB214,转换为RGB数字视频信号;
[1.4]时序调配:将RGB数字视频信号以及NIOS II配置时钟信号通过VGA时序发生215消隐调配为RGB数字视频信号、同步信号II以及供VGA显示的时钟信号;
[1.5]视频缩放:视频缩放213根据NIOSII配置缩放参数、由去隔行212输出的逐行的同步信号I、以及又VGA时序发生215输出的同步信号II,对由去隔行212输出的YCbCr数字视频信号进行缩放。
视频缩放213的功能是把输入的视频水平和/或垂直缩放成显示需要的格式。例如将输入的YCbCr数字视频信号以及同步信号I(720X480或720X576)缩小为YCbCr数字视频信号以及同步信号II(640X480)。视频缩放213的接口参见图11,其中Clk_27为系统27MHZ时钟;Clk_vga为系统VGA显示时钟;Hsync_vga,vsync_vga为VGA时序发生215输出的供VGA显示的同步信号II;Y_data,Cb_data,Cr_data为经视频缩放213输出的视频数据信号。
视频缩放213具体应用如下的方法来实现,其流程示意图参见图12。
1)视频缩放213根据输入的同步信号I和同步信号II计算插值步长,计算:插值步长=同步信号I/同步信号II得插值步长。
1.1)根据插值步长来确定新像素点X插值位置。
例如输入视频缩放213的逐行同步信号I为720X480,输入视频缩放的同步信号II是640X480,则可得缩放比(640*480)/(720*480)=0.889。根据缩放精度确定以一个或多个有效像素为一个像素点单位。例如每一个有效像素为一个像素点单位,那么得到需要插值的步长是(720x480)/(640*480)=1.125。
参见图13,以原始每个有效像素点的步长为1,则所产生的插值点步长1.125,2.25,3.375…是新像素点的位置即要插值点X的位置,见图示的虚点。虚点表示要产生640X480的一行像素点,实点表示原始720X480的一行像素点。
2)以16个原始像素点为方阵式区域,形成X1~X16个像素点,得到X位置的像素值即非线性插值结果x_lans。
从当前像素点周围的16个像素点得到当前像素点的非线性插值结果x_lans。例如以16个原始像素点为方阵,形成X1~X16个像素点,得到X位置的像素值,参见图14。
具体实现方法如下:
2.1)计算方阵的列缩放系数para_v、方阵的行缩放系数para_h、
由于非线性插值函数频谱具有很宽的通带特性,可以得到高频损失较少的插值结果。因此这里用Lanczos非线性插值函数,通过多相位插值以及查找表的形式来实现,表的值可以通过软件来配置。
在查找表中,采用128X4个插值,即128个位置,根据函数对称性,可以得到256个采样位置。所以精度可以达到1/256像素位置。
下面的公式是Lanczos非线性插值函数
Lanczos公式中a的值的幅频响应参见图15,这里采用多相位插值函数方式,取插值点周围四个点对应的插值系数para_v1,para_v2,para_v3,para_v4,这四个点每个点之间间隔是单位1,范围是-2<x<2,因此取a=2。
例若取x插值位置为其中某一个值(0/256,1/256,2/256…255/256,256/256),根据下述公式,得到四个插值像素点对应的系数分别是,para_v1,para_v2,para_v3,para_v4。
para_v1=sinc(-1-x)*sinc((-1-x)/2);
para_v2=sinc(-x)*sinc(-x/2);para_v3=sinc(1-x)*sinc((1-x)/2);
para_v4=sinc(2-x)*sinc((2-x)/2);
2.2)确定查找表
将步骤2.1)所得的方阵的列缩放系数para_v、方阵的行缩放系数para_h写入查找表。
得到查找表参见表2:
插值位置x |
para_v1 |
para_v2 |
para_v3 |
para_v4 |
0/256 |
0.000 |
1.000 |
0.000 |
0.000 |
1/256 |
0.002 |
1.000 |
0.003 |
0.000 |
2/256 |
-0.005 |
1.000 |
0.005 |
-0.000 |
... |
... |
... |
... |
... |
129/256 |
0.065 |
0.584 |
0.562 |
0.062 |
130/256 |
0.062 |
0.562 |
0.584 |
0.065 |
... |
... |
... |
... |
... |
256/256 |
-0.000 |
0.000 |
1.000 |
0.000 |
因为所用的插值函数具有偶对称关系,因此,从表2中可看出,偏移x从129/256到256/256和偏移x从127/256到0/256的插值系数具有对称关系,所以只需要从0/256到128/256的查找表系数即可。
查表时,比如,当X垂直插值位置是0时,即偏移位置是0/256,通过查找表,可以得到4个插值系数为[0,1,0,0]。当X垂直插值位置是7/256时,即偏移位置是7/256,通过查找表,可以得到4个插值系数为[-0.016,0.998,0.018,0]。
同理,可以通过水平偏移,查表得到水平方向的插值系数。
2.3)查找步骤2.2)中所得查找表的方阵的列缩放系数para_v,计算归一化的系数的和sum1以及每列的垂直向系数以确定每列的垂直向系数。
归一化的系数的和sum1为方阵的列缩放系数para_v之和;
计算:
垂直向系数X_m1=(X1*para_v1+X5*para_v2+X9*para_v3+X13*para_v4)/sum1
垂直向系数X_m2=(X2*para_v1+X6*para_v2+X10*para_v3+X14*para_v4)/sum1
垂直向系数X_m3=(X3*para_v1+X7*para_v2+X11*para_v3+X15*para_v4)/sum1
垂直向系数X_m4=(X4*para_v1+X8*para_v2+X12*para_v3+X16*para_v4)/sum1
则得每列的垂直向系数。
2.4)查找步骤2.2)中所得查找表的方阵的行缩放系数para_h计算水平向归一化的系数的和sum2以确定最终X位置的非线性插值结果X_lans。
水平向归一化的系数的和sum2为方阵的行缩放系数para_h之和。
计算:X_lans=(X_m1*para_h1+X_m2*para_h2+X_m3*para_h3+X_m4*para_h4)/sum2得非线性插值结果X_lans。
2.5)为了控制视频插值点的平滑度,需要对插值结果X进行过冲和下冲控制。具体实现方法是:
2.5.1)选取方阵相邻列的原始像素点位置的最大值XL_max以及方阵相邻列的原始像素点位置的最小值XL_min。
即:XL_max=MAX(X6,X7,X10,X11);XL_min=MIN(X6,X7,X10,X11)
2.5.2)根据设计要求选择n位过冲控制门限0T_ctrl和n位下冲控制门限UT_ctrl,其范围是0~63。
2.5.3)判定过冲和下冲控制以确定非线性插值结果X_lans1。
2.5.3.1)将经步骤2.4)所得的非线性插值结果X_lans与原始像素点位置的最大值XL_max进行比较后,控制过冲,确定非线性插值结果X_lans1。
2.5.3.2)将经步骤2.4)所得的非线性插值结果X_lans与原始像素点位置的最小值X_min进行比较后,进行下冲控制,确定非线性插值结果X_lans1。
X_lans>X_max,则X_lans1=X_lans-(X_lans-X_max)*0T_ctrl/64;
若X_lans<X_min,则X_lans1=X_lans+(X_min-X_lans)*UT_ctrl/64
最终插值结果X_lans1要限制在0~255,若X_lans1>255则确定非线性插值结果X_lans1的值为255;若X_lans1<0则确定非线性插值结果X_lans1的值为0。
3)通过线性插值方法,从当前像素点周围的16个像素点得到当前像素点的线性插值结果x_bi。
具体实现方法如下:
3.1)计算:
待插值的水平左点LL1=[X1*N_ctrl1+X2*(64-N_ctrl1)]/64
待插值的水平右点LR1=[X4*N_ctrl1+X3*(64-N_ctrl1)]/64
待插值的水平左点LL2=[X5*N_ctrl1+X6*(64-N_ctrl1)]/64
待插值的水平右点LR2=[X8*N_ctrl1+X7*(64-N_ctrl1)]/64
待插值的水平左点LL3=[X9*N_ctrl1+X10*(64-N_ctrl1)]/64
待插值的水平右点LR3=[X12*N_ctrl1+X11*(64-N_ctrl1)]/64
待插值的水平左点LL4=[X13*N_ctrl1+X14*(64-N_ctrl1)]/64
待插值的水平右点LR4=[X16*N_ctrl1+X15*(64-N_ctrl1)]/64
其中n位门限N_ctrl1选取范围为0~63,得待插值的水平左右点。
3.2)计算:
线性插值点X_l1=LL1*(1-x_offset)+LR1*x_offset,
线性插值点X_l2=LL2*(1-x_offset)+LR2*x_offset,
线性插值点X_l3=LL3*(1-x_offset)+LR3*x_offset,
线性插值点X_l4=LL4*(1-x_offset)+LR4*x_offset,
其中x_offset为水平向偏移量,得线性插值点。
3.3)计算:
垂直方向的上点X_UP=[X_l1*N_ctrl1+X_l2*(64-N_ctrl1)]/64,
垂直方向的下点X_DN=[X_l3*N_ctrl1+X_l4*(64-N_ctrl1)]/64,
得垂直方向上的点X_UP及垂直方向的下点X_DN。
3.4)计算:
线性插值结果X_bi=X_UP*(1-y_offset)+X_DN*y_offset,其中y_offset为垂直向偏移量。
得线性插值结果X_bi。
在噪声情况下,线性插值可以得到较好的插值效果,因为其低通滤波特性使其有很好的降噪的功能。
4)通过自适应判断确定最终插值结果:
将线性插值结果X_bi与非线性插值结果X_lans1进行对比以确定最终插值结果。
4.1)选取原16个像素点的位置的最大值Ymax,选取原16个像素点的位置的最小值Ymin。
4.2)将原16个像素点的位置的最大值Ymax与原16个像素点的位置的最小值Ymin的差值和n位门限N_ctrl2进行比较,确定插值结果。
若原16个像素点的位置的最大值Ymax-原16个像素点的位置的最小值Ymin>n位门限N_ctrl2,则插值结果为线性插值X_bi;若原16个像素点的位置的最大值Ymax-原16个像素点的位置的最小值Ymin<n位门限N_ctrl2,则插值结果为非线性插值结果X_lans,其中n位门限N_ctrl2的取值范围为0~63。
[1.6]数字视频信号格式转换:由视频缩放213输出的缩放的YCbCr数字视频信号输至YCbCr转RGB214,经YCbCr转RGB 214转换后得到的RGB数字视频信号输至VGA时序发生215。
YCrCb转RGB214接口参见图16。其中Y_data2,Cb_data2,Cr_data2为从视频缩放输出的数据;Y_data2指亮度,Cb_data2指蓝色分量,Cr_data2指红色分量。输出是转换了的RGB数据,R_data指红色,G_data指绿色,B_data指蓝色。
所用转化方阵如下式所示:
R=Y+1.403Cr=Y+Cr+0.403Cr=Y+Cr+0x19CCr
为计算方便把0x19C表示为小数0.403右移10位的十六进制计算出的R,G,B最后还要通过纠正,因有些坏值使RGB值大于1023或小于0。当大于1023时,纠正RGB值为1023,小于0时,RGB赋值0。这样RGB可用10位二进制来表示。
[1.7]时序调配:RGB数字视频信号以及NIOS II配置时钟信号输入VGA时序发生215进行调配,经VGA时序发生215调配后输出的同步信号II、RGB数字视频信号以及供VGA显示的时钟信号一路输至MUX选择;另一路经NIOSII控制系统22输至MUX选择216;同时经VGA时序发生215消隐调配后输出的同步信号II反馈至视频缩放213。
VGA时序发生215产生VGA显示需要的时序,与输出有效数据同步,产生标准的640*480的VGA显示数据的行场同步信号II。
一般计算机VGA(640×480,60Hz)图像格式的信号时序,其点时钟DCLK为25.175MHz,场频为59.94Hz。场周期为16.683ms,每场有525行,其中480行为有效显示行,45行为场消隐期。场同步信号Vs每场有一个脉冲,该脉冲的低电平宽度为63μs(2行)。场消隐期包括场同步时间、场消隐前肩(13行)、场消隐后肩(30行),共45行。行周期为31.78μs,每显示行包括800点,其中640点为有效显示,160点为行消隐期(非显示区)。行同步信号Hs每行有一个脉冲,该脉冲的低电平宽度为3.81μs(即96个DCLK);行消隐期包括行同步时间,行消隐前肩(19个DCLK)和行消隐后肩(45个DCLK),共160个点时钟。复合消隐信号是行消隐信号和场消隐信号的逻辑与,在有效显示期复合消隐信号为高电平,在非显示区域它是低电平。
VGA时序发生215接口参见图17。其中Clk_vga为VGA的显示时钟,也是模块的时钟。R_data1,g_data1,b_data1为输出给视频显示信号转换4(DAV7213)的最终数据。Hsync,vsync,是输出给视频显示信号转换4(DAV7213)的同步信号II,也是给视频缩放213输入的信号。
行同步信号II(hsync)产生的时序参见图18,其中第一个下降沿到第二个下降沿为一个完整周期,共800个像素点,其中有效像素点为640个。
场同步信号II(vsync)产生的时序参见图19第一个下降沿到第二个下降沿为一个完整周期,共525个行,其中有效像行为480个。
[1.8]信号选择:VGA时序发生215输出的RGB数字视频信号、同步信号II以及供VGA显示的时钟信号直接经MUX选择216输出供VGA显示,或VGA时序发生215输出的RGB数字视频信号、同步信号II以及供VGA显示的时钟信号经NIOS II控制系统22控制后再经MUX选择216输出供VGA显示。
参见图20,NIOSII控制系统22主要由NIOSIICPU224、采集控制核225、SDRAM控制核221、DMA控制核223、串行接口控制核222以及VGA控制核226构成。
在SOPC中添加了用户自定义外设,简化硬件的设计。在SOPCBuilder中生成的NIOSII控制系统22的硬件连接参见图21。其中Cpu_0为NIOSII CPU;tri_state_bridge为Avalon总线;timer0,timer1为定时器;sdram为SDRAM控制核;button_pio,switch_pio为输入/输出端口;Dma为DMA控制核;UART_0为串行接口(UART)控制核;Vga为VGA控制核,to_sdram为采集控制核。
NIOSII控制系统22的控制方法主要包括以下步骤:
[2.1]NIOSIICPU224控制采集控制核225将视频处理21输出的数据经DMA控制核223传输到SDRAM控制核221和串行接口控制核222;
[2.2]NIOSIICPU224控制SDRAM控制核221中的数据经DMA控制核223存至SDRAM32;
[2.3]NIOSIICPU224控制VGA控制核226将转换后的数据输出至视频处理21;
[2.4]NIOSIICPU224控制SDRAM控制核221将数据经DMA控制核223送至VGA控制核226;
[2.5]NIOSIICPU224控制串行接口控制核222将采集控制核225中的数据传输至上位机。
以下结合附图对于NIOSII控制系统22中的相关控制核进行详细的阐述。
SDRAM芯片时钟和AVALON总线接口的时钟驱动必须同步,像其它的同步设计,必须确保地址,数据,控制信号在时钟边沿到来时必须保持稳定。所以必须用锁相环PLL在SDRAM控制核221和SDRAM芯片之间稳定时钟。在低速时钟的时候,时钟相对延时较小,锁相环PLL可以不用。SDRAM控制核221接口示意图参见图22。
AVALON从接口是SDRAM控制核221的用户接口部分。当访问从接口时,SDRAM控制核221整个传输协议对用户是透明的。可通过控制逻辑控制AVALON从接口的地址(Adress),数据(Data),等待请求(Waitrequest),读取数据有效(Readdatavalid)信号经由SDRAM接口适配处理后来实现SDRAM芯片读写操作。
时钟源(Clock source)是NIOSII控制系统22时钟50Mhz,通过锁相环PLL相位调整,产生50MHZSDRAMclock(SDRAM芯片时钟)和50MHz不同相位的SDRAM控制核时钟(controllerclock)。
在NIOSII控制系统22设计中,采用DMA控制核传输SDRAM的数据操作,视频数据通过AVALON总线由DMA方式传输到SDRAM控制核221。通过SDRAM控制核221将视频数据批量写入SDRAM32。
DMA控制核223由AVALON从接口控制实现批量数据的传输。主读端口(READ MASTER PORT)连接读数据源模块,主写端口(WRITE MASTER PORT)连接写数据目的模块。DMA控制核可以非常有效的传输数据,只要配置好DMA控制核内部寄存器,连接好读写模块,DMA控制核就可以批量的传输数据。当DMA控制核传输结束时,DMA控制核223发出中断请求信号,NIOSIICPU224可对其响应。DMA控制核223接口示意图参见图23.
采集的视频数据通过AVALONG总线端口传输到的DMA控制核223,通过NIOSIICPU224控制DMA控制核223批量传输视频数据到SDRAM控制核221。
串行接口(UART)控制核222为嵌入式系统和外部器件之间通信传输提供了方便。串行接口(UART)控制核222遵守RS-232协议时序经波特率分频提供了可调的波特率,奇偶校验位,停止位和数据位。串行接口控制核222接口示意图参见图24。
串行接口控制核222连接AVALON从接口,经由控制寄存器将并行数据转换成串行数据后上传至上位机;输入的串行数据经由控制寄存器转换为并行数据后传至AVALON从接口从而实现了串行接口通信。
采集控制核225主要由采集模块和FIFO传输模块构成,NIOSIICPU224控制采集控制核225中的采集模块采集视频处理21输出的数据,并将数据写入采集控制核225中的FIFO传输模块。
采集控制核225符合Avalon总线规范,该采集控制核225将视频处理21输出的的数据通过DMA控制核223完整送入SDRAM控制核,实现数据的存储和处理。
视频处理21输出的数据频率是27MHz,每帧图像数据为640×480×16bit像素。然而NIOSIICPU224工作时钟为50MHz,因此需要FIFO传输模块实现前后传输的连贯性。采集控制核225结构示意图参见图25。
采集控制核225包括采集模块和FIFO传输模块。采集模块实现视频处理21输出数据的采集,其输入接口有:写时钟(write_clk)、写使能(write_en)与16位数据总线(RGB[15:0])。挂在Avalon总线上的接口有数据输出总线(FIFO Q[15:0])、片选信号(chipselect)、读请求信号(read_req)、Avalon总线地址(address)、读空信号(read_empty)、读时钟(read_clk)。
使用视频处理21输出的同步信号II(RGB USEFUL)作为写使能信号,NIOSIICPU224控制采集控制核225中的采集模块向FIFO传输模块写数据。由于FIFO传输模块输出时钟大于写时钟,所以不会将FIFO传输模块写满,而只会读空FIFO传输模块。所以读请求信号(read_req)由Avalon总线发出,经读空信号(read_empty),由NIOSIICPU控制DMA控制核读取FIFO传输模块中数据的时间,在读空信号(read_empty)为低电平即FIFO传输模块为非空时开始读取FIFO传输模块中的数据。Avalon总线的从端口读取传输的数据时序参见图26,其中有效RGB数据信号(Data available)接FIFO传输模块输出的读空信号(read_empty)。FIFO传输模块仿真波形参见图27。
参见图26,当FIFO传输模块非空,即Data available为1时,Avalon总线的片选信号(chipselect)、读使能信号(read_en)同时为高,读取FIFO传输模块输出的数据;当FIFO传输模块为空时,即有效数据(Data available)为0时,Avalon总线的片选信号(chipselect)、读使能信号(read_en)同时为低,等待读取FIFO传输模块的数据,直到FIFO传输模块非空时,Avalon总线的片选信号(chipselect)、读使能信号(read_en)同时为高,继续读取数据。
VGA控制核226包括VGA时序发生器、FIFO存储模块其结构示意图参见图28。通过Avalon总线接口的RGB数字视频信号、同步信号II、输至VGA控制核226然后输出到视频显示信号转换4。
参见图29,当FIFO存储模块非满时,即读数据(read for data)为1时,Avalon总线的片选信号(chipselect),写信号(write)同时为高,FIFO存储模块读取Avalon总线输出数据,当FIFO存储模块写满时,即读数据(read for data)为0时,Avalon总线的片选信号(chipselect),写信号(write)同时为低,FIFO存储模块等待Avalon总线输出数据,直到FIFO存储模块非满时,Avalon总线的片选信号(chipselect),写信号(write)同时为高,FIFO存储模块继续读取Avalon总线输出数据。
由于NIOSIICPU224系统时钟为50MHz,而VGA显示时序发生输入时钟为25MHz,这需要FIFO存储模块起一个缓冲作用,而控制FIFO存储模块读写数据的是另一个外设——DMA控制核223。在NIOSII控制系统22中,NIOSIICPU224控制采集控制核225采集的视频处理21输出的数据,NIOSIICPU224控制SDRAM控制核221将采集的数据经由DMA控制核223存入SDRAM32。然后使用DMA控制核223提供数据传输通道,并且控制FIFO存储模块读写使能,使FIFO存储模块在50MHz和25MHz的时钟频率调配时数据不溢出。从FIFO存储模块以25MHz时钟读出的数据经过VGA时序发生器产生VGA需要的同步信号II、RGB数字视频信号、供VGA显示的时钟信号。
单独对VGA时序发生器进行仿真,其仿真后波形图参见图30。
步骤[2.2]中的具体实现方法如下,其流程示意图参见图31。
(1)初始化DMA控制核:按照设计要求配置DMA控制核的内部寄存器。
初始化DMA控制核223主要是配置DMA控制核223的寄存器参数。DMA控制核223共有5个寄存器。分别是:
状态寄存器:寄存器的每位代表DMA控制核223当前传输状态,可通过读该寄存器值判断DMA控制核223的状态,该寄存器的值不能写入。状态寄存器包括传输完成标志(done)、忙碌标志(busy)、DMA控制核223传输完毕是由于读端口发出包结束事件(reop)、DMA控制核223传输完毕是由于写端口发出包结束事件(weop)、DMA控制核223传输完毕是由于传输字节数满足指定长度(len)。
读地址寄存器:向此寄存器写入DMA控制核223读取外端口或SDRAM芯片的地址。
写地址寄存器:向此寄存器写入DMA控制核223输出外端口或SDRAM芯片的地址。
传输字节长度寄存器:规定DMA控制核223传输的总字节长度,DMA控制核223每传输一字节寄存器值减1,直到寄存器值为0时,DMA控制核223传输结束。
控制寄存器:控制DMA控制核223传输数据的方式。控制寄存器每位的名称及其功能描述见表3,DMA控制核223的传输方式、传输方向、传输性质(地址的固定性)及其他使能均由控制寄存器控制。
表3
位序号 |
位名称 |
功能描述 |
0 |
BYTE |
字节传输 |
1 |
HW |
半字传输 |
2 |
WORD |
字传输 |
3 |
GO |
DMA使能 |
4 |
LEN |
中断使能 |
5 |
REEN |
读端包结束使能 |
6 |
WREN |
写端包结束使能 |
7 |
LEEN |
指定长度结束 |
8 |
RCON |
固定地址读 |
9 |
WCON |
固定地址写 |
初始化DMA控制核223首先将控制寄存器和状态寄存器清零,向长度寄存器(LENGTH)写入需要传输的数据长度,接着配置主读端口开始地址、主写端口的开始地址,最后配置控制寄存器,使DMA控制核223处于从固定地址读数据、使能DMA控制核223传输、半字节传输状态。此功能是从FIFO传输模块中读取数据传输到SDRAM32中。因此,在该模块中,DMA控制核223的工作是将长度为640×480×16的一帧图片数据从主读端口(地址为0x00c010b8)写入主写端口(SDRAM的指针基地址)。对照表3将控制寄存器配置成394,完成采集数据的存储。
配置完DMA控制核223的传输参数后,便可控制DMA控制核223读取数据。DMA控制核223开始从FIFO传输模块读数据的使能信号由NIOSII控制系统22的写控制开关和有效像素信号提供。一旦使能DMA控制核223,DMA控制核223自行传输,NIOSIICPU224可处理别的事务,只要处理DMA控制核223何时终止传输即可。在软件里通过DMA控制核223的使能信号调用DMA控制核223传输函数,每使能一次DMA传输,可传送一帧图像数据存入系统主内存。
若读取存放于SDRAM32的多帧图像数据,用NIOS IICPU224直接调度传输会耗费太多NIOSIICPU224资源且不宜控制,而DMA控制核223可实现大量数据的传输,控制简单,准确率高。
(2)使能DMA控制核223
对DMA控制核223进行使能以判定DMA控制核223能否传输数据;
(3)数据存储
(3.1)判定FIFO传输模块是否为空:
若FIFO传输模块为空,则执行DMA控制核223等待。
若FIFO传输模块为非空,则DMA控制核223控制FIFO传输模块将图像数据存储至SDRAM32。
(3.2)判定存储至SDRAM32的图像数据是否为一帧,当一帧数据未存完,则返回至步骤(3.1);
(3.3)当一帧数据已存完,判断是否有下一帧数据等待存储;当没有下一帧数据等待存储时,则结束存储;
(3.4)当有下一帧数据等待存储时,判定SDRAM32是否存满,若SDRAM32未存满则返回至步骤(1);若SDRAM32已存储满,则结束数据存储。
DMA控制核223传输过程具体实现过程如下:
a)NIOSIICPU224通过其控制端口(control port)配置DMA控制核223,准备启动DMA控制核223传输。
b)NIOSIICPU224启动DMA控制核223,DMA控制核223进行传输,即DMA控制核223开始在没有NIOSIICPU224干涉的情况下传送数据。
c)DMA控制核223的主写端口从读地址读取数据,然后向FIFO传输模块依序写入数据,DMA控制核223的主写端口从FIFO存储模块中读取数据并向目标地址写入数据;在传输过程中可以不需要NIOSIICPU224干预,但NIOSIICPU224可以终止当前的DMA控制核223传输过程。
d)当传送数据达到指定长度或者遇到结束符(EOP),DMA控制核223传输结束,DMA控制核223将产生一个DMA控制核223传输结束中断。
图像数据输出的具体实现方法如下:图像显示流程示意图参见图32。
1)按照设计要求配置DMA控制核223的内部寄存器,对DMA控制核223进行初始化;
初始化配置DMA控制核223的控制寄存器,状态寄存器,中断函数,及读写地址,具体配置如下所示:
void init_dma()
{alt_irq_register(DMA_0_IRQ,NULL,DMA_0_isr);
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE,0x00);
IOWR_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE,0x00);
IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_0_BASE,LENTH);
IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_0_BASE,FRAME_BUFFER[0]);
IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_0_BASE,0x00C010B4);
IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE,730);
}
2)对DMA控制核223进行使能以判定DMA控制核223能传输数据;
3)应用DMA控制核223中断将图像数据写入FIFO存储模块
3.1)判定FIFO存储模块是否为满?
若FIFO存储模块为满,则执行DMA控制核223等待;
若FIFO存储模块为非满,则DMA控制核223控制FIFO存储模块读取SDRAM32中的数据并将其写入FIFO存储模块;
3.2)判定是否刷新FIFO存储模块,当一帧数据未写完,则返回至步骤3.1);
3.3)当一帧数据已写完,刷新FIFO存储模块,判断是否有下一帧数据等待写入;当有下一帧数据等待写入时,则返回至步骤1);
3.4)当没有下一帧数据等待写入时,判定是否停止向FIFO存储模块中写入数据;当不停止向FIFO存储模块中写入数据时,返回至步骤1),当停止向FIFO存储模块中写入数据时,则结束写入数据至FIFO存储模块。
与采集图像数据到SDRAM32方式不同,DMA控制核223传输数据到VGA要保持图像静止显示或连续幻灯片播放,用到了DMA控制核223中断函数。其作用就是要保持图片数据发送的连续性。当DMA控制核223发送完一场数据,便产生中断信号,使DMA控制核223的状态寄存器的值发生改变,随即进入中断函数,发送另一场数据。这里碰到的问题是DMA控制核223一旦进入中断函数,为保持画面的稳定就要不间断的传输数据,占用数据总线,若NIOSIICPU224处理别的数据,就会对DMA控制核223传输数据总线产生影响,画面就会产生抖动。为解决此问题只能使NIOSIICPU224在显示静态画面时,处于等待状态。等结束显示静态画面信号有效时,NIOSIICPU224才能正常工作。
串行接口(UART)控制核222实现图像数据传输具体流程参见图33。和DMA控制核223传输设置相似,通过设置串行接口(UART)控制核222相应的寄存器,执行不同的串行接口(UART)控制核操作,但注意的是串行接口(UART)控制核222传输的是字节,而存储的数据格式是字型。根据表4串行接口(UART)控制核222的内部寄存器说明,通过配置相应的寄存器可以使能、结束、初始化串行接口(UART)控制核222的传输。
表4
通过配置串行接口(UART)控制核222的状态寄存器和控制寄存器结束串行接口(UART)控制核222的传输。
变量赋初值,状态,控制寄存器的准备接收和准备发送位置‘1’,等待进入串行接口(UART)控制核222中断。进入串行接口(UART)控制核222中断后,依据串行接口31(UART)协议进行数据传输,当一帧图像数据传送完毕时,结束串行接口(UART)控制核222传输,跳出串行接口(UART)控制核222中断。