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,为了达到位同步脉冲的“扣除”和“附加”⼀个时钟周期的⽬的。
// 双相时钟信号⽣成模块
//-----------------------------------------------------
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之间的鉴相。
// 鉴相器模块
//-----------------------------------------------------
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
begin和start区别assign pd_before = pdbef;
assign pd_after = pdaft;
endmodule
●moniflop:单稳态触发器,检测到⾼电平输⼊后持续输出4个时钟周期的⾼电平脉冲(保证只通过clk_d1或clk_2),从⽽选择扣除还是附加时钟周期。
// 单稳态触发器模块
//-----------------------------------------------------
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,并完成扣除或附加脉冲的⼯作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论