2.3 双口RAM的仿真结果
图4为该进程的仿真时序图,由图可见第一个时钟的上升沿数据输入端口data_in的值为4,这时写选通端口write_address选通地址1,然后对应着地址1的存储器模块ram_block1的内的值在此刻刷新为4,这说明写进程正确。同时应注意到读地址选通信号read_address的值被传递到读地址寄存器read_address_reg中,read_address_reg中的值被刷新为1。当第一个时钟的下降沿到来时,信号输出端口data_out根据读地址寄存器read_address_reg中的地址值1选通ram_block1,此时data_out的值刷新为4,这说明读进程也正确。
3 DSP的软件细分
采用大数可逆计数与小数细分计数的软件细分技术。其中大数计数是对莫尔条纹整周期数进行可逆的加减计数,这部分功能有采集模块中的FPGA来完成,小数计数是对莫尔条纹不到一个周期信号细分结果进行计数,其功能由DSP来完成。运算的结果为大数计数结果乘以光栅栅距与小数计数结果乘以细分当量之和,其中细分当量为光栅栅距除以细分倍数。该模块的硬件原理图如图5所示。
通过DSP的地址选通线依次选通读取FPGA中三个数据缓存区中的数据,缓存区分别存放两路模拟信号的数字量与加减计数器的累加计数值,然后利用公式R=N*w+K*L求出任意一点谐振子的幅值并输出。式中N为整周期的累加计数值,W为光栅栅距,K为细分计数,L=W/M,M为细分倍数。该细分模块主要是完成对细分计数K值、和幅值R值的求取,并完成对幅值的数字量转换并输出。
其中细分方法也就是对K值的求取采用了八卦限幅值分割法,根据上述方法设计了细分倍数可变的细分算法,利用DSP C语言的专用库函数实现了纯计算的算法。细分算法流程如图6所示。