FPGA數字訊號處理(十三)鎖相環位同步技術的實現

FPGADesigner發表於2018-07-22

前面介紹了數字通訊系統中ASK解調技術的FPGA實現,以及判決門限選擇的問題。本文將介紹解調系統中的位同步技術,只有在位同步模組的控制下,才能正確的提取出基帶訊號中攜帶的資料。本文設計參考自杜勇老師的《數字調製解調技術的MATLAB與FPGA實現》。


位同步

位同步模組的主要作用是產生一個與輸入資料頻率一致的時鐘訊號,保證每一位資料判決一次,且最好在訊雜比最大的時刻進行判決。目前常用的位同步技術有插入導頻法、非線性變換濾波法、鎖相環法和Gardner定時恢復演算法。本文將採用鎖相環實現位同步技術,其它方法將在後續的文章中介紹。


鎖相環位同步

鎖相環位同步技術的實現條件是獲取基帶資料的初始相位(即相鄰不同碼元之間的跳變時刻),這也就決定了該方法不適合於多進位制調製訊號的解調(如4ASK,比如00-11之間存在著01和10兩個過渡碼元,從而無法獲得00跳變到11時的初始相位)。對於2ASK而言,只有0和1兩個狀態,根據判決門限做簡單判決即可得到基帶資料碼元的初始相位。但是該方法沒有考慮最佳判決時刻,因此只適合於訊號質量好(SNR大)的訊號。

鎖相環位同步有超前-滯後型觸發器型兩種實現方式,本文以第一種方式實現,原理框圖如下:
這裡寫圖片描述
本地產生相互正交的超前脈衝和滯後脈衝,鑑相器(DPD)比較本地脈衝與輸入訊號(由判決門限判決後的單位元訊號)的相位差(超前或滯後),據此來調整位同步脈衝訊號的相位(扣除或附加一個時鐘週期)。


FPGA設計

根據功能劃分各子模組,頂層模組原理圖及各子模組程式碼如下:
這裡寫圖片描述
●clk_gen:該模組用於產生兩路相互正交、佔空比為1:3的時鐘訊號clk_d1、clk_d2,為了達到位同步脈衝的“扣除”和“附加”一個時鐘週期的目的。

`timescale 1ns/1ps
//-----------------------------------------------------
//   雙相時鐘訊號生成模組
//-----------------------------------------------------
module clk_gen
(
    input clk,      //32MHz系統時鐘
    input rst,      //高電平有效復位訊號
    output clk_d1,  //時鐘1
    output clk_d2   //時鐘2
);

//-----------------------------------------------------
//  產生佔空比為1:3,時鐘為取樣頻率(8MHz)的雙相時鐘
//  兩路時鐘輸出相位相差兩個系統時鐘週期 
//-----------------------------------------------------
reg [1:0] cnt;     //計數器
reg clkd1, clkd2;

//在計數器的控制下完成指定時鐘輸出
always @ (posedge clk or posedge rst)
    if (rst) begin
        cnt <= 'd0; clkd1 <= 1'b0; clkd2 <= 1'b0;
    end
    else 
        case (cnt)
            2'd0 : begin  
                clkd1 <= 1'b1;
                clkd2 <= 1'b0;
                cnt <= cnt + 1'b1;
            end
            2'd2 : begin
                clkd1 <= 1'b0;
                clkd2 <= 1'b1;
                cnt <= cnt + 1'b1;
            end
            default : begin
                clkd1 <= 1'b0;
                clkd2 <= 1'b0;
                cnt <= cnt + 1'b1;
            end
        endcase

assign clk_d1 = clkd1;
assign clk_d2 = clkd2;

endmodule

●phaseDetec:鑑相器,檢測輸入碼元的跳變情況以及完成與分頻器輸出的clk_i和clk_q之間的鑑相。

`timescale 1ns/1ps
//-----------------------------------------------------
//   鑑相器模組
//-----------------------------------------------------
module phaseDetec
(
    input clk,      //32MHz系統時鐘
    input rst,      //高電平有效復位訊號
    input datain,   //輸入單位元基帶資料 
    input clk_i,    //同相同步脈衝訊號,1:1佔空比
    input clk_q,    //正交同步脈衝訊號,1:1佔空比
    output pd_before,  //輸出超前脈衝訊號
    output pd_after    //輸出滯後脈衝訊號
);

reg din_d, din_edge;
reg pdbef, pdaft;

always @ (posedge clk or posedge rst)
    if (rst) begin
        din_d <= 1'b0; din_edge <= 1'b0;
        pdbef <= 1'b0; pdaft <= 1'b0;
    end
    else begin 
        din_d <= datain;   //一級暫存器快取
        din_edge <= datain ^ din_d;   //異或檢測基帶邊沿
        pdbef <= din_edge & clk_i;    //與門鑑相
        pdaft <= din_edge & clk_q;    //與門鑑相
    end

assign pd_before = pdbef;
assign pd_after = pdaft;

endmodule

●moniflop:單穩態觸發器,檢測到高電平輸入後持續輸出4個時鐘週期的高電平脈衝(保證只通過clk_d1或clk_2),從而選擇扣除還是附加時鐘週期。

`timescale 1ns/1ps
//-----------------------------------------------------
//   單穩態觸發器模組
//-----------------------------------------------------
module moniflop
(
    input clk,      //32MHz系統時鐘
    input rst,      //高電平有效復位訊號
    input din,      
    output dout     
);
//-----------------------------------------------------
// 檢測到din的高電平脈衝後,dout輸出4個時鐘長的高電平 
//-----------------------------------------------------
reg [1:0] cnt;      //計數器控制輸出高電平的時間
reg start, dout_reg;

always @ (posedge clk or posedge rst)
    if (rst) begin
        cnt <= 0; start <= 0; dout_reg <= 0;
    end
    else begin
        /* 檢測到din的高電平脈衝,則開始輸出 */
        if (din) begin
            start <= 1'b1; dout_reg <= 1'b1;
        end
        /* 控制一次4個時鐘長高電平脈衝的輸出 */
        //輸出有效
        if (start) begin
            dout_reg <= 1'b1;
            if (cnt < 2'd3)    //有效輸出維持4個時鐘
                cnt <= cnt + 1'b1;
            else start <= 1'b0;
        end
        //輸出無效
        else begin
            cnt <= 'd0;
            dout_reg <= 1'b0;  //無效期間輸出低電平
        end
    end

assign dout = dout_reg; 

endmodule 

●control:控制模組,分頻產生超前脈衝和滯後脈衝clk_i、clk_q,並完成扣除或附加脈衝的工作。

`timescale 1ns/1ps
//-----------------------------------------------------
//    控制模組
//-----------------------------------------------------
module control
(
    input clk,      //32MHz系統時鐘
    input rst,      //高電平有效復位訊號
    input clk_d1,
    input clk_d2,
    input pd_before,
    input pd_after,
    output clk_i,
    output clk_q
);

wire gate_open = (~pd_before) & clk_d1;
wire gate_close = pd_after & clk_d2;
wire clk_in = gate_open | gate_close;   //分頻器驅動時鐘

reg clki, clkq;
reg [2:0] cnt;
always @ (posedge clk or posedge rst)
    if (rst) begin
        cnt <= 'd0; clki <= 0; clkq <= 0;
    end
    else begin
        if (clk_in) cnt <= cnt + 1'b1;
        clki <= ~cnt[2];
        clkq <= cnt[2];
    end

assign clk_i = clki;
assign clk_q = clkq;

endmodule

模擬與工程下載

編寫testbench,產生一個矩形脈衝來模擬對ASK調製訊號判決後的單位元訊號。Vivado中模擬效果如下圖所示:
這裡寫圖片描述
可以看到位同步訊號Sync是一個週期與碼後設資料相同、上升沿對應碼元初始相位(超前或滯後來回擺動)的訊號。即Sync與原始基帶資料一一對應。

相關文章