FPGA數字訊號處理(25)數字相關器設計(經典結構)

FPGADesigner發表於2018-08-02

上一篇介紹了幀同步字檢測、數字相關器的一些基本概念,並設計了一種簡化模型的數字相關器(異或單元+累加器)。本文將完成經典結構(移位暫存器+乘法器+累加器)的數字相關器的設計。


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核的形式匯出,供其它工程呼叫。

相關文章