2 系统原理与实现
为了说明本设计如何利用FPGA和CPLD来解决慢速总线Local Bus对扩充系统性能的瓶颈限制,下面将分两部分来说明。
(1)Local Bus总线速度对系统性能的影响
由图1中虚线处所示,本系统的设计思想是将多路输入视频数据经过压缩编码后通过Local Bus总线输入到嵌入式处理器EM8560的内存中,再从内存写入IDE硬盘上进行存储。这也是EM8560设计的一个主要功能。但是,这种设计由于受到Local Bus总线速度的制约,一般只能输入两路分辨率为D1的数字视频图像,要如框图中增加为4路、8路或更多路数据输入是不可能的。首先,MPEG-4编码芯片IME6400的1KB输出数据缓冲区的数据最多只能保持400 u s时间。400 us时间一到,IME6400将会向缓冲区写入新的数据;如果旧数据读不完,就会丢失数据。其次,Local Bus数据传输率低,IME6400通过向EM8560发中断到EM8560,通过Local Bus将IME6400 1KB输出缓冲区的数据读入需要100 us时间。最后,由于Local Bus总线接口内部不具有真正的DMA控制器,所以数据的传输需要占用处理器CPU的时间。如果EM8560正在将内存中数据向硬盘中写操作,IME6400中断到来,这时处理器要停止当前的写硬盘工作,执行中断处理程序,花100 us左右时间读入IME6400的编码数据;如果在这100 us内,又有一片IME6400的编码数据满发出中断,则处理器读完当前片的数据后又要去读另一片的数据;如果另一片IME6400在内存中的数据还没有写入硬盘,则新数据将会覆盖原来的数据,造成视频数据的丢失。同时,如果输入超过2片,那CPU几乎都在中断的触发下读数据,无时间写硬盘,造成视频数据的丢失,也无时间去做其它的事情,这显然是不行的。因此,要想用这种设计在400 u s内传输4路图像或更多路图像数据到EM8560内存中是不能实现的。
(2)解决LocaI Bus总线速度对系统性能的影响
在嵌入式系统中,处理器外部总线的主要目的是将外部的数据块输入到处理器内部缓存中,外部总线速度一般是不会超过处理器访问它的外存(如SDRAM)的速度,否则会引起数据内部拥塞而丢失数据。因此,在一些需要传输大量数据到处理器内存的嵌入式系统中,能否使从外部输入到内存的数据以处理器访问内存的速率在处理器外部直接放入外存呢?答案是肯定的。我们可以通过CPLD和FPGA来实现,如系统框图中所示。下面说明这样实现的方法。 首先,就处理器内部来讲,一般嵌入式处理器将它的片外物理存储空间映射到内存地址空间的高端。EM8560处理器就是这样映射的,如图2所示。
当系统启动时,引导程序将操作系统从Flash中引入SDRAM中的低2M×32位内存中, 即操作系统获得系统控制权后只在sDRAM的两个低BANK内运行。这时不访问两个高BANK。因为将两个高BANK作为输入视频数据缓冲区,只有当缓冲区满要将数据写入硬盘时才访问两个高BANK,因此,用两片SDRAM分别作为一片SDRAM的两个高BANK和两个低BANK使用。高片SDRAM用来存放输入视频数据,由FPGA直接写入;低片sDRAM运行操作系统和系统程序。这样可以把外部输入的视频数据不通过Local Bus总线直接输入到内存。在输入到内存的过程中,CPU是不参与传输数据的。值的注意的是:高片中只用了两个高BANK,低片中只用了两个低BANK。
其次,我们已经把一片SDRAM用两片来代替,分别为外部输入数据缓存和系统程序运行空间;可是对CPU来讲,它认为它的外存只有一片,它从两个高BANK取数时认为是从同一片SDRAM的两个高BANK取数,因此,需要在CPU访问两个高BANK时将数据线、地址线和控制线切换到高片SDRAM;反之,在CPU访问两个低BANK时,将数据线、地址线及控制线切换到低片SDRAM。这个切换是无法用EM8500的CS来完成的。因为它只有一个CS信号,只允许挂一片SDRAM。所以,我们用CPLD来完成这个切换工作。CPLD根据输入到它的SDRAM地址线和控制线,在CPU发布ACTTIVE命令时,根据地址线中的两位BANK地址线确定是访问两个高BANK还是访问两个低BANK,如果是访问两个低BANK,CPLD输出控制信号,关断连到高片SDRAM数据线和地址命令线的两个高速数据开关,同时打开连到低片SDRAM的高速数据开关,这样CPU就访问低片SDRAM;反之,如果CPU要访问两个高BANK,则CPLD输出控制信号,关断低片数据线上的开关,同时打开高片SDRAM数据线和地址命令线上的开关,这时CPU访问高片SDRAM;如果CPU要访问FPGA中映射的寄存器,则所有的开关都关断,这时CPU可以从FPGA中读入数据。因此,通过CPLD就完成了CPU访问FPGA以及两片SDRAM之间的数据切换。
第三,我们来看看FPGA如何将外部输入视频数据直接输入到处理器内存中两个高BANK的数据缓冲区中。当IME6400输出缓冲区的编码压缩数据满时,它向FPGA发中断,而不是向CPU发中断。FPGA收到中断后,将IME6400来的数据放入它自己的缓冲区。由于FPGA内部嵌入的存储空间小,要缓冲多路视频数据流是不够的,所以外加一片SDRAM作为FPGA自己的缓存。新加这片缓存最大的好处是可以缓存更多路的视频数据,并且每路视频数据的缓存大小可以自己指定,相当于扩展了IME6400输出BUFFER的空间,因此减少了向CPU发中断的次数。当FPGA缓存中存储的某一路数据满时,FPGA向CPU发中断,CPU进入中断服务程序。在中断服务程序中,CPU是不访问高片SDRAM的。这时CPU会读FPGA中特定的寄存器,根据寄存器的值判断FPGA是否已经把它的缓存中的视频数据输入到高片SDRAM中。如果输入结束,FPGA修改寄存器的值,通知CPU数据输入完毕,然后CPU退出中断处理程序,执行其它操作。这样,FPGA就将多路视频数据经过缓存后以内存总线的速度转入处理器内部缓存的地址空间中。值得说明的是:FPGA与IME6400输入视频部分的传输速度是比较低的,而FPGA从它的缓存中将数据传到高片sDRAM中的速度是比较高的,是以内存总线接口的同步时钟传输的。
3 改进的系统性能分析
首先,对于CPU所要访问的外部设备,通过加入FPGA的缓存,等价于增大了外部设备输出数据缓冲区的空间,并且该空间的大小可以通过改变FPGA的缓存来任意改变,大大减小了频繁地向CPU发中断的次数。例如,一片IME6400的1KB输出数据缓冲区满,就要发出中断信号,要求主机在400 us内读空缓冲区中的数据。如果中断信号发往CPU,则IME6400满1KB就中断CPU一次;如果将中断信号发往FPGA,则FPGA会将这1KB数据先放到自己的缓存中,等到积累到一定大小,比如16KB、32KB时,再由FPGA向CPU发中断,进行高速数据拷贝,大大减小了系统中断次数。其次,由于数据的输入由Local Bus总线改为由FPGA缓存以后再高速输入,这就大大增加了输入视频数据的通道数,即能挂更多的IME6400。原来用Local Bus从IME6400中读lKB数据需要100 u s左右时间,现在通过FPGA读只用不到25 u s的时间,相当于原来所用时间的1/5。这就允许在400 us内增加更多的通道数,由原来最大的两路可以扩充到四路、八路、十路等等,大大改善了系统性能。
值得注意的是:以上系统性能的改进是牺牲了两片SDRAM部分空间换得的。在低片sDRAM中只用了两个低BANK,在高片SDRAM中只用了两个高BANK。当然这种划分也可以不相等,视具体情况而定。
综上所述,对于那些由于受到总线速度制约的嵌入式系统来讲,上述方案具有一定的参考价值。