FPGA數字訊號處理(24)數字相關器設計(簡化結構)

FPGADesigner發表於2018-07-24

廣義地講,數字相關器件就是完成兩路訊號之間的相關運算。該技術應用於幀同步字檢測、擴頻接收機、誤碼矯正、模式匹配等領域。但就數字相關器本身實現的功能而言,具有更為廣泛、通用的應用,如在“基於可程式設計邏輯器件FPGA的數字相關器_馬玉良”這篇論文中,就將數字相關器中應用在動態光散射技術中的散射光強的自相關函式計算上。

本文將先討論數字相關器在幀同步字檢測應用中的設計方法。本文使用簡化結構實現,第25篇採用了經典結構實現https://blog.csdn.net/fpgadesigner/article/details/81356491


幀同步字檢測

在數字通訊的資料傳輸過程中,為了保持資料在傳輸過程中的同步,在傳送端傳送資料前插入幀同步字,在接收端解調後的資料流中檢測幀同步字,以確定幀位置和幀定時資訊。

幀同步字一般為一個特定的序列,當在接收端檢測到一組連續碼元與預設的幀同步字吻合時,表示資料同步,開始接收資料。幀同步字的選取有如下要求:

  • 與資訊碼元區別度大;
  • 具有尖銳單峰特性的自相關函式;
  • 碼長適當,保證傳輸效率。

常用的幀同步字有全1碼、全0碼、10交叉碼和巴克碼。舉一個簡單的例子,GSM中一個幀結構為1250個連續碼元,前16個為幀同步字,後1234個為資訊碼元:
這裡寫圖片描述
接收端檢測到幀同步字時,開始接收資訊碼元;1234個接收時鐘週期之後,一幀資料傳輸完成。之後再開始檢測下一幀資料的幀同步字。


數字相關器

完成幀同步檢測的模組便是數字相關器,進行兩個數字訊號之間的相關運算。簡單來說,就是比較兩個輸入的數字序列之間有多少位相同,多少位不同。完成該工作的基本元件便是異或門

比如以16Bits的幀同步字為例,當檢測到輸入的16Bits碼元與預設的幀同步字完全相同時,數字相關器便輸出一個相關峰值表示幀同步。本設計中的相關峰值選擇為高電平脈衝即可。碼元的輸入方式可以選擇序列輸入並行輸入兩種。


FPGA設計思路

數字相關器的經典結構如下:
這裡寫圖片描述
延時線時鐘取值為取樣時鐘與資料碼元時鐘的倍數。當運算資料只有1bit時,可以採用異或門/同或門代替乘法器完成數字相關檢測,節約乘法器資源。

設計目標如下:輸入方式採用並行輸入(省略移位暫存器);碼元輸入速率與系統取樣時鐘相同(100MHz);兩個輸入碼元A和B為16Bits,A為預設的幀同步字(設定為10交叉碼)。

由於兩個16位資料的異或結果有2^16=256種,在編寫程式碼時比較麻煩。可以採用如下方法:設計一個4位數字相關器,16位的原始序列依次拆分為4組4位,分別統計結果再相加。

數字相關器的輸出設定一個5Bits寬的Out,負責統計兩組序列中相同位數的格式;設定一個單位元pulse,高電平表示檢測到一組完全相同的序列,pulse直接取Out的最高位即可(Out只有在取值為16,即序列完全相同時,最高位才會置1)。


無流水線設計

根據上述設計思路,在Vivado開發環境下完成Verilog HDL程式碼設計,對應的RTL原理圖如下:
這裡寫圖片描述
4個4位數字相關器完成對16Bits並行輸入的數字序列的檢測,結果直接相加作為輸出。模擬結果如下:
這裡寫圖片描述
A設定為10交叉碼,當B序列與A相同時,Out為16,且pulse輸出高電平脈衝。系統時鐘週期約束為10ns(100Mhz),時序分析報告如下:
這裡寫圖片描述
建立時間的最差負裕量為8.26ns,滿足時序要求。


流水線化設計

從上面設計的RTL圖中可以看出加法器採用組合邏輯實現,組合邏輯會帶來一定的路徑延遲。考慮將加法器流水線化,縮短延時路徑,從而優化時序。改進後設計的RTL原理圖如下:
這裡寫圖片描述
第一級先將4個4位數字相關器的輸出兩兩相加,結果再使用一級加法器相加。兩級加法器的Latency都設定為1,因此係統會帶來兩個時鐘週期的延時。Vivado中模擬結果如下圖:
這裡寫圖片描述
從圖中可以清楚地看到流水線帶來的延時。系統時鐘週期約束為10ns(100Mhz),時序分析報告如下:
這裡寫圖片描述
可以看到最差建立時間和保持時間都有一定程度的改善。不過加法器的流水線化設計不會像乘法器的流水線化提升那麼明顯。

分別進行綜合後資源分析:無流水線的設計使用了37個LUT,12個Slice;流水線化的設計使用了39個LUT,25個Slice。流水線帶來了速度上的提升,但增加了額外資源的消耗,尤其是觸發器資源的消耗。


4位數字相關器程式碼

從上面的RTL檢視中也可以看出整體設計都很簡單,這裡只列出4位數字相關器子模組的程式碼:

//------------------------------------------------------
// 異或進行4位數字相關檢測
//------------------------------------------------------
module detect
(
    input clk,
    input rst_n,
    input [3:0] a,b,
    output [2:0] sum
); 

reg [2:0] sum_reg;
wire [3:0] ab = a ^ b; 

always @(posedge clk or negedge rst_n) 
    if (!rst_n) sum_reg <= 'd0;
    else 
        case(ab) 
            'd0: sum_reg <= 'd4; 
            'd1,'d2,'d4,'d8: sum_reg <= 'd3; 
            'd3,'d5,'d6,'d9,'d10,'d12: sum_reg <= 'd2; 
            'd7,'d11,'d13,'d14: sum_reg <= 'd1; 
            'd15: sum_reg = 'd0;
        default: sum_reg <= 'd0;
        endcase 

assign sum = sum_reg;

endmodule

在case中對異或結果進行檢測,統計其中位數相同(即異或結果為0)的個數。本文設計的數字相關器很簡單。在擴頻通訊中,使用到的數字相關器會是經典的“移位暫存器+乘法器+累加器”結構,將在後面的文章中介紹。其實本文的設計也是該結構的一種特例。


System Generator設計方法

System Generator是Xilinx推出的一款模型設計工具,在Simulink環境下完成設計,可以搭建高效快速的模擬系統,並將設計匯出到HDL模型。

本章設計將實現數字相關器的經典結構,設計方式採用序列輸入,需要移位暫存器來快取資料。為了簡化模型,碼元設定為8Bits位寬,系統時鐘仍為100MHz。System Generator的模型連線圖如下:
這裡寫圖片描述
中間為延遲寄存鏈;下面為相關檢測部分,Constant模組儲存本地碼元(10交叉碼),Relational模組完成資料比較;上面為累加器模組,包含三級加法器。很明顯,系統為流水線設計,從輸入到輸出共有4級延時。模擬結果如下圖:
這裡寫圖片描述
在輸入與本地碼元相同的10101010序列後,經過4個時鐘延時,累加器才輸出8,表示兩序列完全相同。比較有無流水線對系統效能的影響。將模型中加法器、比較器的Latency設定為0,表示使用純組合邏輯實現。執行模擬結果如下:
這裡寫圖片描述
組合邏輯沒有延時,因此在檢測到10交叉序列後累加器馬上得到了結果。執行時序分析,沒有任何流水線的設計最差路徑延時為3.804ns,最大工作頻率約為250MHz;流水線設計後的最差路徑延時為1.872ns,最大工作頻率約為500MHz,提升了2倍多,當然如上一章所述,所消耗的資源也有所增加。

相關文章