短波扩频通信系统中数字相关器的FPGA设计与实现
值到FPGA。每个样点值是用10bit的二进制补码表示的,需先通过一个串/并转换器转化为宽度为10bit的并行信号。样点值首先要进行的是希尔波特变换,希尔波特变换有多种实现方法,这里采用一个129阶的滤波器来实现,滤波器的抽头系数由MATLAB函数remez产生,如图3所示。
将10bit的并行信号输入到一个10bit×129的RAM模块,采用循环写入的方式,RAM模块类似一个桶形循环存储器?熏较早存入RAM的信号值就会被新来的数据覆盖掉,这样就与图3所示的输入信号先进先出是等效的。经MATLAB函数remez产生的抽头系数是一组变换范围很大的带有小数部分的十进制数,为了能够进行后续的硬件运算,需要对这组十进制数作归一量化处理,把它们映射到宽度为14bit的有符号的二进制数所能表示的范围上去,即转化为14bit的二进制补码数。这组抽头系数在运算的过程中是固定不变的,所以可以把它们固化在片内ROM模块中,与RAM中的值同步读出,再经过两组D触发器对齐后,送到一个10bit×14bit的有符号数的相乘累加器做相乘累加运算。相乘后的数据宽度是24bit,但是由于对固定数据宽度的有符号的二进制数进行加减运算时,会出现结果超出固定数据宽度所能表示的范围,即溢出现象,导致运算结果错误,所以就要为这里进行的129次累加操作留有一定的数据宽度富裕量,每次把乘积符号扩展4bit再进行累加操作,这样输出就是一个28bit的有符号数,即是所需的虚部。由于在将抽头系数从十进制到二进制的归一量化过程中,人为地将其扩大了许多倍,所以与每个虚部相对应的实部从中心抽头输出后,需经过一个固定倍数的乘法器,扩大同样的倍数来与虚部保持一致。
相乘累加模块是希尔波特变换部分的核心单元,这里用到了Stratix器件独特的嵌入式DSP模块。在Quartus的MegawizardPlus_InManager中选择ALTMULT_ACCUM(MAC)定制相乘累加模块。首先系统会提示只有Stratix系列才可以定制此类型模块,本例选择的两个输入端分别是10位和14位的有符号数,与RAM和ROM的输出端相连,再将累加后的输出端设为28位。这里有意预留了4位,用来防止在129次累加的过程中出现数据溢出的现象。将时钟、使能、清零等设置好后,即可生成所需的相乘累加模块,在编译的过程中Quartus就会自动把这部分配置到嵌入式DSP模块中,而不去占用片内的逻辑单元。这样就把原本用几个模块完成的功能用单个模块实现了,同时也提高了运行的可靠性。
2.2相关运算部分
样点值经过希尔波特变换得到的实部和虚部两部分,将分别存储到两个具有80个存储单元的RAM中,同样是采用循环写入的方式,类似于DSP编程中的桶形存储区。由于本文所应用的短波系统采用的是每个码元取五个采样点,而本地序列是一个码元对应一个数值,所以在做相关运算时是从当前的80个样点值里,每隔4个点取一个值,共取出16个样点值,依次与本地序列的16个值做相乘累加。下一次操作就把当前样点向后移一位,按同样的方法取点运算。这样依次进行,每一个样点值都会产生一个与其相对应的相关值。反映在FPGA内部,就要求RAM从当前存入的值开始,向前每隔4个单元取一个值作为输出。这样在一个样点间隔内,就从RAM中依次读出16个值,与从ROM中同步读出的16个本地序列值做相关运算。此时的相关运算中的乘法就需要是复数相乘,其结果也是复数,分两路输出实部和虚部,对这两路结果分别进行累加运算,即可得到所需的相关值的实部和虚部。
复数相乘模块是相关运算部分中的重要环节。从RAM中读出的实部和虚部组成的信号值,与从ROM中读出的本地序列值,在这里要进行复数相乘运算。复数相乘模块结构图如图4所示,a、b、c、d分别代表信号和本地序列的实部和虚部,按照式子(a+jb)×(c+jd)=(ac-bd)+j(ad+bc)的组合进行相乘加减。这里需要说明的是,考虑到后面要与DSP相连,数据的宽度被限制在32位。所以对于乘法器B和D而言,28bit与9bit相乘得到的结果应是37bit。这里在定制乘法器的时候强行把它限制为32bit,去掉了最高位的多余符号位,舍去了低4位。这样处理带来的后果就是人为地将乘积缩小了16倍。如果对乘法器A和C的结果不做处理,直接进行加减运算,则结果将导致严重的错误。因此对于乘法器A和C,应该人为地将其输出值右移4位,同样地缩小16倍,再进行下一步的加减运算,就可以有效地避免上述的错误。这样输入的4个数值经过几个时钟周期的运算后,输出的两个数值就是所求的复数相乘结果。这里的4个有符号数乘法器都会在编译时自动地配置到Stratix器件的嵌入式DSP模块上去。
2.3总体控制模块和接口部分
2.3.1总体控制模块
系统上电后,FPGA内部各模块都处于运行状态,各个模块相互连接,各自 《短波扩频通信系统中数字相关器的FPGA设计与实现(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/143882.html
将10bit的并行信号输入到一个10bit×129的RAM模块,采用循环写入的方式,RAM模块类似一个桶形循环存储器?熏较早存入RAM的信号值就会被新来的数据覆盖掉,这样就与图3所示的输入信号先进先出是等效的。经MATLAB函数remez产生的抽头系数是一组变换范围很大的带有小数部分的十进制数,为了能够进行后续的硬件运算,需要对这组十进制数作归一量化处理,把它们映射到宽度为14bit的有符号的二进制数所能表示的范围上去,即转化为14bit的二进制补码数。这组抽头系数在运算的过程中是固定不变的,所以可以把它们固化在片内ROM模块中,与RAM中的值同步读出,再经过两组D触发器对齐后,送到一个10bit×14bit的有符号数的相乘累加器做相乘累加运算。相乘后的数据宽度是24bit,但是由于对固定数据宽度的有符号的二进制数进行加减运算时,会出现结果超出固定数据宽度所能表示的范围,即溢出现象,导致运算结果错误,所以就要为这里进行的129次累加操作留有一定的数据宽度富裕量,每次把乘积符号扩展4bit再进行累加操作,这样输出就是一个28bit的有符号数,即是所需的虚部。由于在将抽头系数从十进制到二进制的归一量化过程中,人为地将其扩大了许多倍,所以与每个虚部相对应的实部从中心抽头输出后,需经过一个固定倍数的乘法器,扩大同样的倍数来与虚部保持一致。
相乘累加模块是希尔波特变换部分的核心单元,这里用到了Stratix器件独特的嵌入式DSP模块。在Quartus的MegawizardPlus_InManager中选择ALTMULT_ACCUM(MAC)定制相乘累加模块。首先系统会提示只有Stratix系列才可以定制此类型模块,本例选择的两个输入端分别是10位和14位的有符号数,与RAM和ROM的输出端相连,再将累加后的输出端设为28位。这里有意预留了4位,用来防止在129次累加的过程中出现数据溢出的现象。将时钟、使能、清零等设置好后,即可生成所需的相乘累加模块,在编译的过程中Quartus就会自动把这部分配置到嵌入式DSP模块中,而不去占用片内的逻辑单元。这样就把原本用几个模块完成的功能用单个模块实现了,同时也提高了运行的可靠性。
2.2相关运算部分
样点值经过希尔波特变换得到的实部和虚部两部分,将分别存储到两个具有80个存储单元的RAM中,同样是采用循环写入的方式,类似于DSP编程中的桶形存储区。由于本文所应用的短波系统采用的是每个码元取五个采样点,而本地序列是一个码元对应一个数值,所以在做相关运算时是从当前的80个样点值里,每隔4个点取一个值,共取出16个样点值,依次与本地序列的16个值做相乘累加。下一次操作就把当前样点向后移一位,按同样的方法取点运算。这样依次进行,每一个样点值都会产生一个与其相对应的相关值。反映在FPGA内部,就要求RAM从当前存入的值开始,向前每隔4个单元取一个值作为输出。这样在一个样点间隔内,就从RAM中依次读出16个值,与从ROM中同步读出的16个本地序列值做相关运算。此时的相关运算中的乘法就需要是复数相乘,其结果也是复数,分两路输出实部和虚部,对这两路结果分别进行累加运算,即可得到所需的相关值的实部和虚部。
复数相乘模块是相关运算部分中的重要环节。从RAM中读出的实部和虚部组成的信号值,与从ROM中读出的本地序列值,在这里要进行复数相乘运算。复数相乘模块结构图如图4所示,a、b、c、d分别代表信号和本地序列的实部和虚部,按照式子(a+jb)×(c+jd)=(ac-bd)+j(ad+bc)的组合进行相乘加减。这里需要说明的是,考虑到后面要与DSP相连,数据的宽度被限制在32位。所以对于乘法器B和D而言,28bit与9bit相乘得到的结果应是37bit。这里在定制乘法器的时候强行把它限制为32bit,去掉了最高位的多余符号位,舍去了低4位。这样处理带来的后果就是人为地将乘积缩小了16倍。如果对乘法器A和C的结果不做处理,直接进行加减运算,则结果将导致严重的错误。因此对于乘法器A和C,应该人为地将其输出值右移4位,同样地缩小16倍,再进行下一步的加减运算,就可以有效地避免上述的错误。这样输入的4个数值经过几个时钟周期的运算后,输出的两个数值就是所求的复数相乘结果。这里的4个有符号数乘法器都会在编译时自动地配置到Stratix器件的嵌入式DSP模块上去。
2.3总体控制模块和接口部分
2.3.1总体控制模块
系统上电后,FPGA内部各模块都处于运行状态,各个模块相互连接,各自 《短波扩频通信系统中数字相关器的FPGA设计与实现(第2页)》