FPGA數字訊號處理(十三)鎖相環位同步技術的實現
前面介紹了數字通訊系統中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與原始基帶資料一一對應。
相關文章
- FPGA數字訊號處理(22)FSK調製技術FPGA
- FPGA數字訊號處理(24)數字相關器設計(簡化結構)FPGA
- FPGA數字訊號處理(25)數字相關器設計(經典結構)FPGA
- FPGA數字訊號處理(23)FSK解調技術(包絡檢波法)FPGA
- 訊號處理技術:現代通訊技術的基石
- 數字訊號處理實驗一(離散時間訊號的MATLAB實現)Matlab
- FPGA數字訊號處理(26)加擾器與解擾器設計FPGA
- 數字訊號處理實驗(四):數字濾波器結構
- 【iCore4 雙核心板_FPGA】例程九:鎖相環實驗——鎖相環使用FPGA
- 【iCore3 雙核心板_FPGA】例程十:鎖相環實驗——鎖相環使用FPGA
- 【iCore1S 雙核心板_FPGA】例程九:鎖相環實驗——鎖相環的使用FPGA
- FPGA數字訊號處理(27)卷積編碼器與Viterbi譯碼器設計FPGA卷積Viterbi
- 大牛講解訊號與系統以及數字訊號處理
- 數字訊號處理c語言程式集C語言
- 無名訊號量實現相關程式同步
- 基於FPGA的BPSK數字平方環載波同步verilog實現,包含testbenchFPGA
- 記一個openwrt reboot非同步訊號處理死鎖問題boot非同步
- 語音訊號預處理——數字濾波器音訊
- MATLAB訊號處理——數字濾波器的設計Matlab
- 訊號處理基本引數
- 使用Octave音訊處理(三):數學技術處理音訊檔案音訊
- 數字訊號處理:運用FFT簡單濾波FFT
- 數字訊號處理基礎----插值、抽取濾波器
- C++數字訊號處理演算法庫SP++C++演算法
- 數字影像處理相關練習
- MATLAB數字訊號處理(2)LFM脈衝雷達回波處理模擬Matlab
- javascript實現的每三位數字使用逗號分割JavaScript
- FPGA經典:Verilog傳奇與基於FPGA的數字影像處理原理及應用FPGA
- 平均節省流量 30% ,這項視訊雲處理技術是如何實現的?
- 數字音訊技術與JUCE實現(目錄)音訊
- Python對數字的千分位處理方式Python
- 【iCore4 雙核心板_FPGA】例程十三:基於SPI的ARM與FPGA通訊實驗FPGA
- js實現的數字每隔3位就加逗號程式碼例項JS
- 處理python中的訊號Python
- 網頁js版音訊數字訊號處理:H5錄音+特定頻率訊號的特徵分析和識別提取網頁JS音訊H5特徵
- java大資料處理:如何使用Java技術實現高效的大資料處理Java大資料
- Linux訊號機制與訊號處理Linux
- opencv 視訊處理相關OpenCV