由于两个Nios II CPU使用同一个SDRAM作为程序存储器,因此需要用SoPC Builder提供的存储器分区功能来指定每个Nios II CPU使用的存储器区域。SoPC Builder的分区功能使用处理器的异常地址来定义不同处理器之间代码存放的分界,每个处理器的异常地址用来决定处理器代码存放的基地址,其末地址由下一个异常地址或存储器的末地址决定。每个Nios II CPU有5个主要的代码段需要被链接到存储器中,它们分别是: .text、.rodata、.rwdata、heap和stack段。在对程序存储器分区时,必须为每个处理器的heap和stack段提供足够的地址空间,否则heap和stack段可能溢出,进而破坏处理器的代码运行。
本设计中的两个Nios II CPU还共享了一个Flash存储器,作为启动存储器。与程序存储器类似,在多Nios II软核处理器系统中,每个处理器必须从自己独立的存储区域启动,多个处理器不能从同一非易失存储器的同一地址启动。SoPC Builder对启动存储器提供了与程序存储器类似的分区功能,用处理器的复位地址来定义不同处理器之间启动代码的分界。
在本设计中,多软核系统的所有硬件资源通过SoPC Builder连接矩阵的互联情况如图2所示。Mutex核用于两个Nios II CPU对On_chip_memory的互斥访问。两个Nios II CPU通过SoPC Builder中的连接矩阵与这些资源相连接,实现了资源共享。此外,本设计中每个Nios II CPU都有独立的cpu_timer(计时器)、custom_comp(自定义CSC MegaCore IP接口)外设。
Nios II IDE具有在片上对多处理器同时进行调试的能力。Nios II IDE multiprocessor collection支持在FPGA片上对多软核系统的软件进行调试。Nios II IDE下载软件代码到每一个处理器,然后运行软件。在multiprocessor collection中不同处理器的启动并不是在同一个时钟周期开始的,只要一个处理器对应的代码下载完毕,该处理器就开始执行代码。
运行在两个Nios II处理器上的软件通过硬件Mutex核协调对共享片上数据存储器的访问。运行在两个Nios II CPU上的程序各负责一半的图像数据处理任务,并将处理后的图像数据写入共享数据存储器中。最后由一个Nios II CPU将结果数据从共享缓存中读出,并输出到结果文件中。
此外,软核处理器上运行的代码通过Altera公司提供的Altera Host Based File System文件系统对存储在计算机上的文件进行读写操作。Altera Host Based File System文件系统与Altera Zip Read-Only File System只读文件系统相比,可以对文件进行写操作,更加符合本设计的需求。加入Altera Host Based File System后即可在代码中使用ANSI C对存储在计算机上的文件进行访问,代码如下:
FILE*fp_bin=NULL;
fp_bin=fopen(″/mnt/host/hostfs_read_binary.bin″,″r″);
fread(buffer,1,BUF_SIZE,fp_bin);
for(i=0;i< P>
{
printf(″%X″,buffer);
}
设计中进行读/写的文件是BMP位图文件。BMP位图文件由四个部分组成:位图文件头、位图信息头、调色板数据和图像数据区。为了对设计进行简化,假设处理的BMP位图文件为非压缩且没有调色板的位图文件。在这类文件中图像数据区开始于0036h,使用ANSI C中的fseek( )函数即可读到图像数据实体。 4 多核系统与单核系统的性能对比
由于本设计为多软核系统,为了与单Nios II软核系统进行比较,在软件设计中加入了监测软件执行时间的代码。对不同像素数的图像进行处理时,单核系统与多核系统的程序执行时间如表1所示。