引言
SOPC(System On Programmable Chip)即可编程片上系统,或者说是基于大规模FPGA的单片系统,是美国Altera公司于2000年提出的。它将处理器、存储器、I/O口、LVDS、CDR等系统设计需要的功能模块集成到一个PLD器件上,将其构建成一个可编程的片上系统;具有灵活的设计方式,可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。由于SOPC系统具有灵活的设计方式、高效的开发手段、廉价的设计成本,可以实现过去不可能实现的更高的系统性能,因此它在通信和工业控制等领域正得到日益广泛的应用。
NiosII嵌入式处理器是FPGA生产厂商Altera公司推出的软核CPU,是一种面向用户的,可以灵活定制的通用精简指令集架构(RISC)32位嵌入式CPU。NiosII以软核的方式提供给用户,并专门在Altera公司的FPGA上实现了优化,用于SOPC集成,最后在FPGA上实现。
本文将以VOD 视频点播系统为例,介绍采用NiosII构建可编程片上系统SOPC的过程,以及双CPU 及其同步通信技术实现的视频点播系统主机部分的设计思想和工作原理。
1工程应用
1.1VOD相关内容及双CPU使用的必要性
视频点播是一种交互式多媒体信息点播系统。 其本质是, 信息使用者可根据自己的需求主动获取多媒体信息,打破目前用户收看节目的被动方式,使用户从“播什么节目看什么节目”变成 “想看什么节目就播什么节目”, 从而按照自己的意愿通过网络点播视频服务器中的视频节目。视频点播以电视技术、计算机技术、通信技术为基础,它区别于信息发布的最大不同是用户具有主动性与选择性。
VOD系统主要由3部分构成:视频点播服务器、传输网络和视频点播终端。当点播终端发出点播请求时,点播服务器就会根据点播信息,将存放在节目库中的影视信息检索出来,并将视频数据流通过高速传输网络传送到各个点播终端。点播终端接收到数据流后,将其解码送到显示器播放。
本设计采用一块大容量硬盘作为VOD系统的点播数据源,将MPEG1格式的影音文件按照FAT 32标准存放在硬盘上。由于视频点播系统对硬盘访问的速度要求非常高,采用操作系统已无法满足要求,所以利用SOPC技术将Altera公司的第2代嵌入式处理器NiosII嵌入到FPGA中,并通过DMA控制器直接对硬盘进行最底层的操作,完成对影音文件的管理、检索和数据读取,充分发挥了FPGA的高速优势。本视频点播服务器可以驱动多达64个完全独立的视频终端。
为实现64路终端实时播放影片,必须对视频数据流的传输速率严格规定,由于所有终端播放的文件均为MPEG1格式,此格式下影片连续播放所需的数据流速率为1.416 Mb/s。本系统采用的数据收发器AM7968/7969的传输率为80 Mb/s,因此只要逻辑电路设计得当且处理器定时发送数据,就可达到视频不间断播放的设计要求。但点播系统在满足视频数据定时发送的条件下还应当实现读取硬盘中存放MPEG1数据的功能,对终端作出的点播信息作出及时响应的功能,对USB中影音文件录入的功能以及显示屏的刷新与按键的处理功能。如果只采用一个处理器,则无法对每个环节作出及时响应,无法保证数据的定时发送和硬盘数据的按时读取,所以采取在Altera公司的高性能FPGA中嵌入双NiosII软核的方式达到系统设计目的。
1.2系统原理框图及架构
点播服务器主要由主控制器部分和外围接口电路两大部分组成,硬件系统框图如图1所示。主控制器单元主要由FPGA、存储器电路、电源电路、时钟、复位电路和配置芯片电路组成。外围接口主要有:OLED显示屏、动态扫描键盘、数据缓冲区、SD卡、USB控制器、IDE接口、CAN总线接口、光纤接口等。

图1硬件系统框图
其中数据缓冲区由2个容量各为32 MB的SDRAM组成,用于暂时存放DMA控制器从硬盘读出的视频数据;USB接口用于节目源的录入;IDE接口用于与磁盘阵列连接;各终端的点播信息通过CAN总线送到点播服务器;视频数据流通过4根光纤传送到各个终端,每16个终端共用1根光纤,4根光纤可以驱动64个终端。
其中FPGA中,双NiosII逻辑设计架构实现如图2所示。

图2FPGA中的双NiosII逻辑设计
NiosII Execution Core 1为主CPU,在这个处理器系统里面,DMA控制器负责将视频数据从硬盘读到缓冲区中;USB驱动器负责从其他移动存储设备中录入节目源到硬盘阵列;CAN BUS驱动器负责接收终端的点播信息;Tristate Bridge用来连接外部程序存储器SDRAM和Flash;OLED驱动器用来控制OLED显示屏;Uart核为RS232接口。
Nios II Execution Core 2为从CPU,专门用于向终端传输视频数据流。最为关键的部分为Transmit BUS Driver,它负责将DMA控制器写入缓冲区的数据读出来,并送给光纤发送模块向终端发送。
此外,还必须有一个握手模块(handshake module),负责2个CPU之间的信息传递,使2个CPU协调工作。
1.3相关设置及添加过程
(1) NiosII CPU定制
根据不同设计的要求,有3种不同的内核类型可供选择——快速型、经济型和标准型。快速型内核具有最高的处理性能,经济型内核具有最低的资源占用,而标准型在性能和资源之间作了个平衡。本设计中,CPU1需要实现硬盘数据读取、显示屏控制、总线请求、键盘处理等各种功能,因此选用标准型内核;而CPU2只要定时读取数据并发送至输出模块,功能单一,因此选取快速型内核便可胜任。
(2) NiosII外围设备定制
Altera公司推出SOPC设计技术的同时也为用户提供了一些可以选用的存储、接口和功能模块的IP核。这些核可以直接添加到用户的设计中。启动SOPC Builder后,在GUI界面中左边是可供用户选择的模块资源池,包括处理器和各种外设(其中有自己开发的模块),也包括第3方开发的模块。用户模块也可以放入资源池,用户逻辑在第一次定义后,就可以将其放入模块资源池,以后使用时当成普通模块一样使用。
(3) 自定义控制组件设计
Altera公司提供了使用第3方核的简单接口。只要符合这些接口规范,就可以使用各种IP核进行SOPC设计。
由于Altera公司并未直接提供硬盘、CAN控制器、USB及2个CPU握手模块等接口,因此必须自己设计接口连接各种器件和处理器。这些接口既要符合Avalon总线规范,又要满足各种器件的工作时序。图3为点播服务器系统在SOPC Builder工作窗口中的截取图。

图3SOPC Builder设计界面
2程序下载
2.1方案确定
下面是对2个CPU的写入探讨。
方案一
指导思想: 将硬件配置信息和cpu2写入EPCS中,将CPU的程序写入Flash中。具体步骤:
① CFI_FLASH的3个时间改为50、160、50;
② cpu1——reset Address CFI_FLASH
Exception Address sdram3/s1;
③ cpu2——reset Address onchip_memory0
Exception Address onchip_memory0;
④ 将整个硬件编译成功;
⑤ 将memery_test编译,进行Flash测试,测试成功转下一步;
⑥ 分别编译newnios1和newnios2的工程;
⑦ 将整个硬件进行二次编译,此时pof文件中已经包含了newnios2的程序;
⑧ 将pof文件下载到EPCS中去;
⑨ 将硬件工程换成只有一个CPU的,将newnios1的程序下载到CFI_FLASH中去;
⑩ 重新上电启动。
方案二
指导思想: 将2个CPU的程序均下载到Flash中,硬件配置在EPCS中。
① CFI_FLASH的3个时间改为50、160、50;
② cpu1——reset Address EPCS_CONTROLLER
Exception Address sdram3/s1
③ cpu2——reset Address onchip_memory0
Exception Address onchip_memory0
④ 将整个硬件编译成功;
⑤ 将memery_test编译,进行Flash测试,测试成功转下一步;
⑥ 分别编译newnios1和newnios2的工程;
⑦ 重新进行硬件的编译;
⑧ 将pof文件下载到EPCS中去;
⑨ newnios1和newnios2的程序下载分别指定为0、1或1、2;
⑩ 重新上电启动。
方案三
指导思想: 将2个CPU的程序均下载到EPCS中,硬件配置在EPCS中。
① 首先在SOPC builder中将2个作CPU如下配置:
cpu1——reset Address EPCS_CONTROLLER
Exception Address sdram3/s1
cpu2——reset Address onchip_memory0
Exception Address onchip_memory0
这代表将CPU的程序在EPCS中进行存储,而程序运行在SDRAM中;而CPU_0的存储和运行都在片上存储器中。
② 先将SOPC进行编译,成功后选择“Exit”,硬件提示是否进行升级,选择“yes”,进行升级,然后将整个硬件全编译。
③ 硬件编译通过后,通过SOPC Builder打开IDE,在IDE下分别编译newnios1和newnios2的工程,由于第2个CPU的程序在内部存储器,则生成一个以内部存储器为名称的hex文件。
④ 重新进行硬件的编译,会发现硬件将HEX文件当作一个部件,编到整个硬件中了。编辑完毕后,查看SOF和pof的大小,其实都没什么变化,但时间修改了。
⑤ 利用命令行指令:
sof2flashepcsinput=new.sofoutput=my1.flash,
该命令将new.sof转换成EPCS中存储的格式;将POF文件下载到EPCS中去。
Elf2flashepcsafter=my1.flashinput=newnios1.elfoutput=my2.flash
⑥ 下面有2种处理方法都可以下载成功。
第1种方法:将另一个只有CPU的工程(sof)下载到EP2C20中(QuartusII无法在下载过程中识别2个CPU),然后利用以下命令:
Nios2flashprogrammerepcsbase=0x02900800 my1.flash
Nios2flashprogrammerepcsbase=0x02900800 my2.flash
重新上电,就可以了
第2种方法:将instance参数带上,方法同上,进行Flash文件的转换,然后将整个工程sof下载到硬件中。
利用命令:
Nios2flashprogrammerepcsbase=0x02900800
instance 1 my1.flash
Nios2flashprogrammerepcsbase=0x02900800
instance 1 my2.flash
注意,instance后面的参数为1。如果为0,就会出现错误:no EPCS register found。如果是2,则会发生如下情况:
There are no niosII processors available which match the value specified,please check your PLD……
⑦ 重新上电启动即可。
2.2命令行在EPCS中的写入过程
① 将sof文件下载到FPGA中,并将sof文件转换成.flash烧写中间格式,使用命令:
sof2flashepcsinput=./new.sofoutput=my1.flash
然后用.flash文件烧写epcsbase项为nios2工程中epcs在avalon总线中的地址位:
nios2flashprogrammerepcsinstance=1base=0x02900800 my1.flash
② 将elf文件也转换为.flash格式,并且要加入一些参数。after是后来刷写的内容,不会冲掉前面的数据,使用命令:
elf2flashepcsafter=my1.flashinput=newnios1
.elfoutput=my2.flash
烧写:nios2flashprogrammerepcsinstance=1
base=0x02900800 my2.flash
③ 重新上电启动。
3小结
本文结合视频点播服务器的设计,阐述了双NiosII软核嵌入到FPGA并通过SOPC技术将IP核嵌入并构建系统的过程及方法,充分发挥FPGA的高速优势,提供系统性能。其创新点是,将双NiosII软核应用到嵌入式系统中,通过IP核的设计实现底层驱动,提高系统集成度,充分发挥SOPC技术的优势。