从表1中可以看出:在存储器中存储的N个数值中仅有N-1-k个数据进行了自相关运算,超出这个范围的数据应视为无效数据被舍弃。因此如果N的长度过短或者k的数值过大,存储器中的数据将有相当一部分数据被舍弃,并且随着k值的增加被舍弃的数据量将在整个存储数据量中的比例越来越大;但是由于信号的自相关性随着延迟k增加而降低,在做自相关运算时一般采用较小的k值。为此,如果采用较大的RAM存储器和较小的k值,在一组存储数据中舍弃的数据其实是占比例很小的。例如在k=3的情况下,即延时为3个A/D转换周期,CyclmleⅡFPGA中存储器的最大存储长度为65 536个8 b存储单元,舍弃记录数据为3个8 b,舍弃数据量仅占存储数据量的0.004%,在自相关处理时是能够接受的。如图6所示。
2.2 累加器及1/N相乘单元实现:
如果使用2的N阶次幂数据用作自相关计算,在二进制下可以通过向右移位N个bit位实现除法功能。在设计中采用了2×16个采样数据组成的数组完成自相关计算,其算法具体流程图如图7所示。
3 微处理器的设计实现
嵌入式微处理器的设计包括3个部分:利用SoPCBuilder定制的软核CPU,在Quartus II环境下设计的电路和Nios II编程。
Nios II的软件编程主要基于嵌入式操作系统μC/OS-Ⅱ。μC/OS-Ⅱ是一个完整的、可移植、固化和剪裁的占先式实时多任务核(Kernel)。从1992年发布至今,μC/OS-II已经有上百个的商业应用案例,在40多种处理器上成功移植。其中Altera提供对μC/OS-II的完整支持,非常容易使用。
μC/OS—II提供以下系统服务:任务管理(Task Management);事件标志(Event Flag);消息传递(Mes-sage Passing);内存管理(Memory Management);信号量(Semaphores);时间管理(Time Management)。在应用程序中,用户可以方便地使用这些系统调用实现目标功能。
在该设计中,建立了一个主任务和两个子任务(任务1,任务2):主任务主要是负责启动子任务;任务1主要负责数据的采集和采集数据的存储,任务2主要负责调用存储器中存储的采集数据控制外围计算模块进行自相关计算。总体软件算法流程图如图8所示。图9为由SoPC实现的Nios II处理器图。
在Nios II系统中,首先,通过main()主函数调用OSTaskCreateExt()函数创建任务1,即数据采集任务。
由于AD7822作为AVALON的从外设挂接在了AVALON总线上,通过在任务1中通过调用IORD_16DIRECT()端口查询函数实时发起A从端口传输启动AD7822,获取采集数据,然后使能外围RAM的wren端口存储。当存储到该设计中存储器长度的数据以后,通过“尾触发”方式启动任务2,即自相关计算任务,并且调用延迟函数OSTimeDlyHMSM(),交出CPU的使用权。程序要点如下:
在任务2中,首先关闭两个存储器的写入使能,使之只能读出数据;然后输出相应的两个地址码:两个地址码之间有相对k的延时,并且同时使能18×18乘法器,累加器及1/N相乘单元,当循环完成后,自动删除任务2,交CPU使用权给数据采集任务。程序要点如下:
4 结 语
首先,该设计采用嵌入式操作系统实时控制外围运算逻辑电路的方式。实现了多乘加的DSP运算,由于嵌入式操作系统的灵活性和广泛的可移植性,使得该设计的可读性和移植性增强;其次,本设计采用天生并行结构的FPGA处理器完成多乘加运算,有利于提高运算速度和处理的稳定度;再次,将必要的外设作为AVALON总线器件,采用总线查询传输的方式进行访问,不必在嵌入式操作系统中过多的考虑底层硬件的驱动和时序,这样提高电路的稳定性且也增强了程序的通用性。