基于FPGA的高效并行HDMI 2.0编码器设计
2021-04-17龚家亮唐清善
龚家亮,唐清善,白 创
(长沙理工大学 物理与电子科学学院,湖南 长沙 410114)
多路视频技术在视频监控[1-2]、全景视频图像显示等方面被广泛应用,但其在设计时仍存在一些问题,例如电路面积过大、I/O资源消耗较多、多路视频扩展性差等。造成这些问题的主要原因是视频采集或发送需要使用专门的编解码芯片,例如HDMI(High-Definition Multimedia Interface)[3]的发送芯片ADV7511以及DVI(Digital Visual Interface)[4]的接收芯片TFP401[5-6]。使用这类外接芯片会占用较大的电路面积和I/O口资源。虽然使用片上集成的编解码器不会存在这些问题,但是片上集成的编解码器数量一般较少,对多路视频的扩展性较差。FPGA集成度高,可并行处理,可重配置逻辑,且具有丰富的I/O资源[7]。结合这些优点并基于FPGA编解码器的设计方式能较好地解决上述问题。
现有的多路视频显示系统大多采用DVI、光纤等视频接口[8-9],但DVI或光纤的接口体积较大且传输带宽不高。目前,具备超高清视频传输能力的视频接口标准主要有HDMI和DisplayPort两种,HDMI凭借其先发的优势已经成为多媒体接口主要的应用标准之一[10],因此本文选择对HDMI编码器进行设计。
目前,文献[11~13]基于FPGA的HDMI编解码器进行了设计,所设计的编解码器基于HDMI 1.4版标准。魏国基于HDMI 2.0版标准设计了编码器和加扰器[10,14],但只进行了原型验证。本文基于FPGA设计了一种高效并行HDMI 2.0编码器,可在占用少量电路面积和使用较少的I/O资源的情况下实现多路视频扩展。
1 HDMI编码原理
HDMI用于传输视频数据、音频数据和信息帧包(InfoFrame Packet)[15-16]。视频数据不经过压缩直接传输;音频数据则以数据包的方式传输。HDMI支持的数据包包括HDMI标准和CEA-861-D[15]与CEA-861-F[16]定义的信息帧包和音频数据包。为保证数据的有效传输,数据包在进行传输编码前需进行纠错编码(Error Correction Code,ECC)[17]。
HDMI定义了3种传输周期,分别为控制周期(Control Period)、数据岛周期(Data Island Period)和视频数据周期(Video Data Period)[3]。各数据周期传输特定类型的数据,具有不同的编码方式:控制周期用于传输视频的行同步信号、场同步信号和控制数据,采用控制周期编码[10];数据岛周期传输音频或辅助信息等数据包,采用TERC4(TMDS Error Reduction Coding)[2]编码;视频数据周期传输视频数据,采用视频数据编码[10]。为降低EMI(Electro Magnetic Interference)和RFI(Radio Frequency Interference)的影响,HDMI 2.0版标准增加了加扰特性,除了8个周期长度的非加扰控制周期外[10,12],其余数据在编码器都需进行加扰。
2 HDMI 2.0编码器设计
按照数据流的方向,原始数据经过多路复用器进入3个数据通道,然后根据HDMI接收端的HDMI标准,选择是否进行加扰处理,最后按照数据周期类型选择不同的编码方式。编码之后的数据通过串行发送器,以TMDS(Transition-Minimized Differential Signaling)的方式传输。HDMI 2.0编码器设计框图如图1所示。发送控制状态机Tx_Ctrl_FSM用于控制数据岛周期、前导带、非加扰控制周期和扩展控制周期的发送。
图1 HDMI 2.0编码器设计框图
本文设计的HDMI 2.0编码器保留了必要的编码功能且提供了简化的数据接口,可根据需要增加不同颜色深度的打包模块来实现对多种颜色深度的视频格式的支持。
3 FPGA逻辑设计
3.1 ECC电路设计
在HDMI标准中,数据包由1个包头(Packet Header)和4个子包(Subpacket 0/1/2/3)[2]组成。包头和4个子包分别进行BCH(32,24)和BCH(64,56)纠错编码[17]。BCH(32,24)和BCH(64,56)生成多项式如式(1)所示[2]。ECC编码器电路[17]如图2所示。
图2 1-bit ECC编码器
G(x)=1+x6+x7+x8
(1)
由图2可知,一次完整的BCH(32,24)纠错编码需要32个时钟周期,一次完整的BCH(64,56)纠错编码则需要64个时钟周期。为使BCH(32,24)编码和BCH(64,56)编码能够在相同时间内完成,本文设计了并行的ECC编码器。设第n个时钟的寄存器组的状态为Q(n),输入数据为in(n),输入使能为e(n)。图2中的ECC编码器电路,可用式(2)表示。
Q(n)=M((Q(n-1)+I(n-1))·E(n-1))
(2)
式中,“·”表示Schur-Hadamard积;M是传递矩阵;I(n)=[in(n)0 0 0 0 0 0 0]T;E(n)=[e(n)1 1 1 1 1 1 1]T。2 bit并行ECC编码电路表达式可通过式(3)计算得到。
(3)
将式(3)中I(n-1)和I(n-2)用I0(n-1)和I1(n-1)替换,用E′(n-1)表示输入使能。然后,将Q(n)替换为Q′(n),式(3)整理可得
Q′(n)=M((M((Q′(n-1)+I0(n-1))·E′(n-1))+I1(n-1))·E′(n-1))
(4)
由式(4)可设计得到2-bit 的ECC编码器电路。4-bit和8-bit并行ECC编码器可通过同样的方式设计得到。
3.2 加扰器电路设计
HDMI 2.0版标准中引入了新的加扰技术,对3个数据通道进行加扰[14]。整个加扰过程包括生成加扰因子和加扰运算;加扰运算如式(5)~式(7)所示。
SCV[0:4]={IToggle,controlVector[0:3]⊕
lq[14:11]}
(5)
SDI[0:3]=ID[0:3]⊕lq[15:12]
(6)
SDV[0:7]=VD[0:7]⊕lq[15:8]
(7)
式中,各标量以二进制的形式表示;ID为数据岛数据;VD为视频数据;SCV、SDI和SDV为加扰后的结果;lq为加扰因子;“{}”为拼接运算符;“⊕”为异或运算符,以上3式均为二进制按位异或运算;“[]”代表二进制的取值范围;controlVerctor是控制矢量,如式(8)所示。
controlVerctor[3:0]={D1,D0,LN1,LN0}
(8)
式中,{D1,D0}为控制数据;{LN1, LN0}是数据通道通道数的编码。
每个数据通道的加扰因子由一个线性移位寄存器(Linear Feedback Shift Register,LFSR)生成。LFSR生成多项式如式(9)所示,LFSR电路[14]如图3所示。
图3 LFSR电路图
H(x)=1+x11+x12+x13+x16
(9)
用于LFSR初始化的加扰因子称为种子值,种子值作为第一个加扰因子对非加扰控制周期后的第一个数据进行加扰,LFSR输出的第一个加扰因子用于非加扰控制周期后的第二个数据的加扰,以此类推,直到下一个非加扰控制周期[14]。在此需特别指出,LFSR输出的第一个加扰因子是种子值输入后LFSR的第8个状态,LFSR输出的第二个值是LFSR输出第一个加扰因子后的第8个状态,以此类推。为使加扰因子生成器与整个编码器具有相同的速率,设计了并行的加扰因子生成器。设寄存器组在第n个时钟时的状态为LQ(n),LQ(n)∈R16×1,则LFSR可表示为
LQ(n)=NLQ(n-1)
(10)
式中,N为传递矩阵。串行加扰因子生成器电路可根据式(11)得到
LQ(n)=N8LQ′(n-1)
(11)
式中,LQ′(n-1)=LQ(n-8);N8是N的8次幂。同理可设计两字符并行的加扰因子生成器。该生成器输出的第一个加扰因子实际上是原生成器输出的第二个加扰因子,即种子值与第一个加扰因子之间间隔一个加扰因子。若要实现同时输出两个连续的加扰因子,则需使用两个生成器,两个生成器的种子值分别为原来的种子值和输出的第一个加扰因子。同理可设计出四字符并行的加扰因子生成器。
3.3 视频数据编码器设计
HDMI的编码共有3种:控制数据编码、TERC4编码和视频数据编码。控制数据编码和TERC4编码均有固定的对应关系[18]。在此仅对视频数据编码器的设计进行讨论。
视频数据编码是将8位的数据编码为10位的字符,编码后的字符可近似的达到直流平衡,并且编码后的字符中相邻两位为二进制01或者10的次数少于或等于5,这种字符被称为最小传输码(A Transition-Minimized Code)。整个的视频数据编码过程可分为两步:第一步将8位的数据转换成9位的最小化传输码;第二个步添加1位数据使得传输的字符流保持直流平衡。化简后的视频数据编码算法如图4所示[17]。
在图4中,D[0:7]为输入的原始数据,cnt(n)表示当前数据流中0和1的数量差异(Data Stream Disparity),cnt(n)初始化值为0;q_m表示第一步得到的9位码字,q_out表示第二步得到的10位码字,即最后的编码结果;N0{x}和N1{x}分别表示二进制x中0和1的个数;为简化后续的判决,引入diff_q_m用于表示q_m[0:7]中0和1的个数差异;Judge1、Judge2和Judge3分别代表3次判决。整个编码器由若干个异或、同或、加法和选择器等逻辑运算组成。为了获得较高的性能,采用流水线的方式设计视频数据编码器。考虑到编码结果输出的连续性,将包含第二次判决及第二次判决以后的运算作为流水线的最后一级。N1{D[0:7]}或N1{q_m[0:7]}是8个1位二进制数的加法运算,需将它们分开设置为一级。为平衡性能与逻辑资源的使用量,将N1{D[0:7]}计算设置为流水线的第一级,从第一次判决(包含第一次判决)到第二次判决之间设置为流水线的第二级。
图4 视频数据编码算法流程图
由于编码器的第二次判决需以cnt(n-1)作为条件,相邻两个字符的编码之间仅传递cnt(n)。对于两字符并行的编码器,仍然可以采用上述流水线的方式进行编码。高位字符的编码流水线滞后于低位字符的编码流水线一个时钟周期,在这个滞后的时钟周期中,通过寄存器对数据进行缓存。两字符并行的视频数据编码器电路图如图5所示,同理可用相同的方式设计四字符并行的视频数据编码器。
图5 两字符并行的视频数据编码器电路图
4 仿真与测试
本文使用Verilog HDL实现HDMI 2.0编码器,在VIVADO 17.4软件平台上进行仿真测试,在PYNQ-Z2开发板上进行系统测试。
对于ECC电路,本文采用PacketHeader = 24'h05_02_82(十六进制数,下同)作为BCH(32,24)编码的测试数据,Subpack0 = 56'h00_C0_01_70_08_00_3E作为BCH(64,56)编码的测试数据。为便于观察,对ECC编码后的结果进行了解码。1-bit、2-bit、4-bit和8-bit的ECC电路仿真结果如图6(a)所示,解码的仿真结果如图6(b)所示。由如图6(a)可知,1-bit、2-bit、4-bit和8-bit的ECC电路编码结果相同,PacketHeader的8位纠错码是8′h3e(图中已标出),Subpack0的8位纠错码是8′hbd(图中已标出)。由图6(b)可知,原始包数据能够被正确的解码,接收的8位纠错码与ECC解码所得的纠错码一致。
(a)
HDMI 2.0标准给出了3个数据通道的前32个加扰因子,可通过将生成的加扰因子与HDMI 2.0标准中的加扰因子进行比较来实现对加扰因子生成器的功能验证。除种子值外,3个数据通道的加扰因子生成器电路完全相同,在此仅对数据通道0的加扰因子生成器进行仿真。数据通道0的前32个加扰因子如表1所示,一个字符、两个字符和四个字符的加扰因子生成器的仿真结果如图7所示。图7中标出了第32个加扰因子,对比图7和表1可知,加扰因子生成器所生成的加扰因子与HDMI 2.0标准所给出的加扰因子完全吻合。
表1 数据通道0的前32个加扰因子
加扰因子不同,即使3个数据通道的原始数据完全一致,加扰后的数据也会不同。为便于观察仿真结果,本文对视频数据编码后的结果进行解码,通过对比原始数据和解码后的数据来验证视频数据编码器的功能,仿真结果如图8所示。图8中原始数据与解码后的数据完成一致。
图8 视频数据编码器的仿真
为验证所设计的HDMI 2.0编码器是否可用于系统设计中,本文对编码器进行了系统测试。本文以PYNQ-Z2开发板作为测试平台,以OSERDESE2逻辑资源作为HDMI接口的物理层,以1 280×720@60Hz作为测试视频的格式,通过按键来切换视频画面来测试视频画面切换的流畅度。显示结果如图9所示,测试中通过按键切换了黑白方格、彩条、全红等多个画面,未发现任何与整幅画面不协调的显示点,显示画面没有明显的跳动、闪烁或变形。由此可知,所设计的HDMI 2.0编码器能够稳定得编码和输出。
图9 系统测试
最后,本文对串行和并行编码器的相关参数进行了对比和分析,综合后的数据如表2所示。根据CEA-861-F对4K视频的定义,4K@30Hz的像素频率为297 MHz,4K@60Hz的像素频率为594 MHz,HDMI 2.0标准中TMDS时钟频率最高600 MHz。通过对比可以发现,串行HDMI 2.0编码器可以编码4K@30Hz的视频;并行HDMI 2.0编码器可编码4K@60Hz的视频,可达到HDMI 2.0版标准的最大数据速率。
表2 HDMI 2.0编码器的参数对比
5 结束语
本文设计了一种高效并行HDMI 2.0编码器,并详细介绍了并行的ECC编码器、加扰因子生成器和视频数据编码器的设计方式,最后对编码器进行了功能仿真和板上测试。测试结果表明,HDMI 2.0编码器符合HDMI标准,并行设计的HDMI 2.0编码器具备编码超高清视频的能力。所设计的HDMI 2.0编码器可作为软核应用于显示系统的设计中,结合FPGA的可重配置逻辑资源和丰富的I/O资源,可轻松实现多路视频扩展。该方法在减小电路面积和I/O使用数量的同时,也降低了设计成本。目前,大多数FPGA已经集成了吉比特收发器,由普通I/O的数据速率不高而导致的无法进行多路超高清视频信号传输问题将逐步得到解决。