FPGA数字信号处理(25)数字相关器设计(经典结构)

上一篇介绍了帧同步字检测、数字相关器的一些基本概念,并设计了一种简化模型的数字相关器(异或单元+累加器)。本文将完成经典结构(移位寄存器+乘法器+累加器)的数字相关器的设计。


MATLAB设计

假设一帧包含1500个字节,前165个为帧同步字,后1350个为信息码元。由上一篇知数字相关器的经典结构如下:
这里写图片描述
延时线取值为采样时钟与数据码元时钟的倍数。在MATLAB中生成随机测试数据,进行算法仿真,完整MATLAB代码如下:

clc; clear; close all;

load('data.mat');      %导入帧同步头din,165点
din = din/max(din);
din_s = fliplr(din);

%生成测试数据
x = rand(1, 5340);
x = x*2-1;
x = [din_s,x(1:1335),din_s,x(1336:2670),din_s,x(2671:4005),din_s,x(4006:5340)];
%x = [(1:6000)',x'];
y = zeros(1,165);
res = zeros(1,5835);
for i = 1 : length(x)-165
   for j = 1 : 165
      y(j) = x(j+i-1)*din_s(j); 
   end
   res(i) = sum(y);
end
plot(res);

仿真结果如下:
这里写图片描述
可以明显看到检测结果中的相关峰。


FPGA设计

在Vivado中完成算法设计及仿真。设计中需要两组寄存器,一组寄存器用来存储本地帧同步字;一组165点长的移位寄存器存储输入码元。帧同步字的存储很简单,直接赋值即可。移位寄存器部分的代码如下:

//------------------------------------------------------
//   输入数据移位寄存器
//------------------------------------------------------
reg signed [7:0] a [164:0];
integer i,j;

always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
        for (i=0; i<165; i=i+1)
            a[i] <= 'd0;
    end
    else begin
        for (j=0; j<164; j=j+1)
            a[j+1] <= a[j];
        a[0] <= din;
    end

接下来是乘法器部分设计,采用全并行,需要165个乘法器同时对165点数据进行计算,乘法器配置为3级流水。如果一个一个实例化实在麻烦,可以用Verilog提供的generate语法实现批量实例化,代码如下:

//---------------------------------------------------------------------
//   相关运算
//---------------------------------------------------------------------
genvar gv_i;
wire signed [15:0] y [164:0];
generate
    for (gv_i = 0; gv_i < 165; gv_i = gv_i+1) 
    begin : ins0
        mult your_instance_name (
          .CLK(clk),  // input wire CLK
          .A(a[164-gv_i]),      // input wire [7 : 0] A
          .B(b[gv_i]),      // input wire [7 : 0] B
          .P(y[gv_i])      // output wire [15 : 0] P
        );
    end
endgenerate

以上便完成了165个乘法器的实例化。最后是累加器,累加器可以使用像上一篇一样的多级累加设计方法,这样做的好处是整个数据流程受设计者的控制。但是这样也需要像实例化乘法器一样实例化大量的加法器。其实如果直接在一个语句中将所有的乘法器结果相加,Vivado的综合器也可以将其综合为多级累加的结果,只不过从代码上看这种结构并不直观。

测试数据由MATLAB生成并存储到txt文件,在testbench中读取。Vivado中仿真结果如下:
这里写图片描述
可以明显看到其中的相关峰。系统时钟约束为500MHz(K7410的芯片),综合后时序分析报告如下,完全满足:
这里写图片描述


System Generator设计

System Generator的设计方法可以参考博主的《学会System Generator系列》。模型的部分结构如下图所示(完整的图太大):
这里写图片描述
延迟线便相当于移位寄存器,与本地帧同步字乘法结果送入多级累加器。仿真结果如下:
这里写图片描述
可以明显看到其中的相关峰。系统时钟设置为500MHz(k7410的芯片)。到处HDL模型。综合后时序分析结果如下:
这里写图片描述
最大路径延迟为1.326ns,时序完全满足。综合后的资源分析结果如下:
这里写图片描述
本文使用Vivado和System Generator两种设计方法完成了同样的设计,且仿真结果相同。实际中只需要选择一种即可,而且System Generator可以将设计以IP核的形式导出,供其它工程调用。

猜你喜欢

转载自blog.csdn.net/FPGADesigner/article/details/81356491