MPEG-2编码复用器主要由DSP(数字信号处理器)和FPGA两大部分组成。其中,DSP作为整个系统的主控单元,而FPGA则完成相应的辅助逻辑功能。用FPGA实现的编码复用器,具有设计,升级都非常方便,快速的特点,提高了工作效率。
FPGA芯片简介
编码复用器中所使用的FPGA芯片是美国Altera公司生产的FLEX10K50V。 Flex10K系列是Altera公司在FLEX8000系列基础上发展起来的一种新型器件。它的结构的主要特点除了主要的逻辑阵列块(LAB)之外,首次采用了嵌入阵列块(EAB)。 FLEX10K50V的主要特性指标为:
●逻辑门数目为50,000门;
●最大I/O引脚数为274个;
●提供-1,-2,-3,-4四种速度级别;
●触发器数目为3,184个;
●LE(Logic Element,逻辑单元)数目为2,880个;
●总的RAM为20,480bits。
MAX+ PLUS II开发工具
MAX+ PLUS II是开发Altera公司FPGA产品(包括MAX系列和FLEX系列)的软件工具包。利用MAX+ PLUS II提供的设计环境和设计工具,可以灵活高效地完成各种数字电路设计。在MAX+ PLUS II的设计环境下, FPGA的整个设计流程如图1所示:
1. MAX+ PLUS II的设计输入可以有三种方式,即图形输入,文本输入和波形输入。此外,符号编辑器用于编辑用户自己的模块符号。需要说明的是: 在本系统中,我们使用AHDL(Altera,HDL) 语言作为文本输入方式。
2. 设计实现即在FPGA器件内物理地实现所需地逻辑.这个过程由MAX+ PLUS II中的核心部分编译器完成。它依据设计输入文件自动生成用于器件编程、波形仿真、延时分析等所需的数据文件。
3. 设计仿真是由仿真器和时延分析器利用编译器产生的数据文件,自动完成逻辑功能仿真和延时特性仿真。通过仿真,发现设计中的错误与不足,对设计输入进行修改和完善,最终达到设计要求。
4. 在仿真结果正确以后,就可以进行器件编程,即通过编程器(Programmer)将设计文件下载到FPGA芯片中,在实际芯片中进行实际信号的时序验证,就芯片的实际运行性能进行系统测试。
复用器中的FPGA逻辑设计
在MPEG-2编码复用器中,FPGA所实现的逻辑功能主要是:
(1)系统上电后,完成对其他器件(如DSP、、FIFO)的复位;
(2)响应系统主控单元DSP的指令,从相应的输入FIFO中读取TS流数据,做并串变换后传输至DSP的串行输入口;
(3)由于复用器必须对进入该系统的数据传送流(TS流)中的程 序参考时钟域(PCR域)中的数值进行补偿计数.因此,FPGA还需要完成:
a.在复用器的数据传送流输入端检测PCR域并纪录PCR域初值;
b.在复用器的数据传送流输出端检测PCR域并将经过补偿计数后的PCR的新值 装载进PCR域;
(4)其他一些逻辑。
1、输入输出FIFO的复位模块
输入输出FIFO复位模块较为简单.它由文本输入方式实现,内部主要由计数器和D触发器组成。它对电路的控制主要包括:整个系统上电后,主控单元DSP通过I/O端口向FPGA发出FIFO复位的指令, FPGA通过地址译码,产生RSFIFO信号.RSFIFO作为计数器内部的清0端信号,CLK38(全局时钟信号)作为计数器的时钟信号,并引导计数器开始计数。计数器计数到一定数值时,再连通D触发器先后产生RESET(输入输出FIFO复位信号)以及FO_ENA(输出FIFO读允许信号),完成了FIFO复位模块的逻辑时序.
2、并/串转换模块
图3是并串模块的上层图。其I/O引脚情况见表1:
表1 并/串转换模块I/O引管脚说明
管脚名称 管脚功能
CLK38 并串模块工作时钟
HF 输入FIFO半满信号
Q[8..0] TS流并行数据信号
P_CLK TS流串行数据包同步信号
S_DATA TS流串行数据信号
S_CLK TS流串行数据时钟信号
FIFO_R_CLK 输入FIFO读时钟信号
CLK_CONTROL 输入FIFO读时钟控制信号
由于MAX+PLUSII的老式宏函数中只提供了作4、5、8位和16位并串变换的移位寄存器 ,而此处系统完成的是9位并串变换(8位数据位加1位包同步位),因此必须自己编写tdf文件,而不能直接调用宏函数。具体的功能实现为:
选择使用9个D触发器,将它们相互连通组成9位的移位寄存器。一旦产生输入FIFO的半满信号(HF),模块开始工作,将输入FIFO中的9位并行数据读入移位寄存器中,在CLK38的工作时钟控制下,将9位数据顺序串行移出产生S_DATA(TS流串行数据)。并且,在模块中还设置了一个4位计数器A。计数器A同样在CLK38的工作时钟控制下,整体模块开始工作时开始同步计数。每计数到9时计数器清0,并输出一个高电平信号。而在其他计数值时,该信号输出为低电平。那么,产生的这个信号就是TS流的串行数据包同步信号(P_CLK)。而TS流串行数据的时钟信号(S_CLK),很显然就是CLK38。
此外,将CLK38时钟进行8分频作为输入FIFO的读时钟信号(FIFO_R_CLK)。而输入FIFO读时钟的控制信号(CLK_CONTROL),则由模块中设置的另外一个计数器B来产生,确保输入FIFO一次半满后,FPGA只从其中读取该FIFO最大容量之一半的数据。例如:在本系统中,输入FIFO的最大容量为512个字节。那么,设置的计数器B就必须是一个9位计数器。计数器的计数时钟为FIFO_R_CLK,从输入FIFO半满,FPGA启动读数时开始计数。每计数到256(输入FIFO容量的一半)时计数器清0,并将输入FIFO读时钟的控制信号(CLK_CONTROL)置为低电平,从而禁止再产生输入FIFO读时钟信号。
3、PCR补偿计数模块
根据MPEGII标准,TS流中的PCR域共有42位有效码字,由两部分组成:一部分以系统参考时钟的1/300(90KHZ)为单位,称为program_clock_reference_base,33字段;另一部分称为program_clock_reference_extension, 以系统参考时钟(27MHz)为单位的9位字段。
因此,整个PCR补偿计数模块分为两大部分:一部分是9位字段(E0~E8)的PCR域补偿计数模块,由一个8位计数器(调用宏函数8COUNT)和一个4位计数器(调用宏函数74161)组成。其中,8COUNT的计数时钟为27MHz时钟(由硬件电路中的27MHz晶振提供);而74161的计数时钟则为8COUNT提供的最高位进位时钟(由8COUNT中的最高位E7取反后得到);另一部分为33位字段(Q32~Q0)的PCR域补偿计数模块,由4个8位计数器(调用宏函数8COUNT)和一个4位计数器(调用宏函数74161)组成。其中,74161的计数时钟为27MHz时钟300分频后得到的90KHZ时钟,它只对33位字段中的最低位Q0进行补偿计数。第一个8COUNT的计数时钟为74161的Q0位的进位时钟(由Q0取反后得到);而其他3个8COUNT的计数时钟则分别为前一个8COUNT的进位时钟(即分别由Q8,Q16,Q24取反后得到)。
4、复用系统FPGA逻辑设计中一些技巧
在该系统FPGA逻辑设计过程中,由于系统结构比较复杂,整个FPGA逻辑设计也比较大,所以在作逻辑设计时,一般应有一个整体的考虑。具体作设计时,应该采用层次化的结构设计。另外,还必须结合整个系统的特点,有意识的对FPGA中逻辑设计进行优化和精简。例如:检测TS数据流的包同步字0X47,由于该同步头字节并不是唯一的,中间可能有码字也恰为其值。因此,一般情况下,FPGA搜索同步码字的逻辑如下:首先找到第一个0X47,然后进行计数,计到187字节后,再检测是否为0X47,如果是,输出包同步信号;接着每隔187检测一次,如是0X47,则继续输出包同步信号,如不是,则从事开始搜索0X47。
而在该系统的设计中,并没有采用这种方法,而是利用了I/O FIFO的9比特特性,FPGA直接搜索9位包同步字节0X147。另外,在PCR域补偿计数的模块中,也存在一个PCR域确认的问题。PCR域的长度为6个字节48位码字(42位有效码字加6位保留位),在FPGA已经装载PCR域的初值后,完全可以将PCR域中的6个字节改为预先设定好的协议码字(当然,它们必须对于码流而言是唯一的)。这样,在TS码流输出端进行将补偿计数后的PCR数值重新装载进PCR域的工作时,FPGA不仅能够很方便的识别出PCR域的具体位置,而且还可以从这些协议码字中读出较多的复用信息。
简洁而有效的FPGA逻辑设计,可以使系统运行的稳定性得到很大的改善。