1.算法仿真效果
vivado2019.2仿真結(jié)果如下:
對(duì)比沒(méi)載波同步和有載波同步的仿真效果活玲,我們可以看到,當(dāng)不存在載波同步時(shí)帜矾,數(shù)據(jù)的包絡(luò)會(huì)有一個(gè)緩慢的類正弦變換,這是由于存在頻偏導(dǎo)致的屡萤。而當(dāng)加入載波同步之后珍剑,數(shù)據(jù)的包絡(luò)會(huì)存在少量起伏,但數(shù)據(jù)反轉(zhuǎn)的情況已經(jīng)沒(méi)有了死陆,說(shuō)明頻偏得到了補(bǔ)償招拙。
2.算法涉及理論知識(shí)概要
BPSK(Binary Phase Shift Keying)調(diào)制是一種基本的數(shù)字調(diào)制方式,它將數(shù)字信號(hào)轉(zhuǎn)換為一系列的相位變化措译,其中0和1分別對(duì)應(yīng)于相位為0和π的兩個(gè)狀態(tài)别凤。BPSK調(diào)制的解調(diào)過(guò)程可以通過(guò)相干解調(diào)實(shí)現(xiàn),其主要包括載波恢復(fù)和相位解調(diào)兩個(gè)部分领虹。
載波恢復(fù)的主要作用是通過(guò)接收信號(hào)中的載波信息來(lái)恢復(fù)出發(fā)送信號(hào)中的載波頻率和相位规哪,從而實(shí)現(xiàn)信號(hào)的相干解調(diào)。常見(jiàn)的載波恢復(fù)方法包括PLL(Phase-Locked Loop)和Costas環(huán)等塌衰。相位解調(diào)的主要作用是將接收信號(hào)的相位信息轉(zhuǎn)化為數(shù)字信號(hào)诉稍,從而實(shí)現(xiàn)數(shù)字信號(hào)的解調(diào)。常見(jiàn)的相位解調(diào)方法包括差分相位解調(diào)和非差分相位解調(diào)等最疆。
Costas環(huán)載波同步
Costas環(huán)是一種常用的載波同步方法杯巨,其基本思想是通過(guò)將接收信號(hào)與本地載波偏移量進(jìn)行比較來(lái)實(shí)現(xiàn)載波同步。Costas環(huán)主要包括兩個(gè)環(huán)節(jié):相位估計(jì)和相位調(diào)整努酸。
相位估計(jì)
相位估計(jì)的主要作用是通過(guò)接收信號(hào)和本地載波之間的比較來(lái)估計(jì)出接收信號(hào)中的載波相位偏移量服爷。常見(jiàn)的相位估計(jì)方法包括乘積檢測(cè)法和延遲環(huán)路法等。
相位調(diào)整
相位調(diào)整的主要作用是通過(guò)改變本地載波的相位來(lái)消除接收信號(hào)中的載波相位偏移量获诈,從而實(shí)現(xiàn)載波同步仍源。常見(jiàn)的相位調(diào)整方法包括PI控制和二階控制等。
FPGA(Field-Programmable Gate Array)是一種可編程邏輯器件舔涎,其主要特點(diǎn)是具有高度的可編程性和靈活性镜会。在數(shù)字信號(hào)處理領(lǐng)域,F(xiàn)PGA常用于實(shí)現(xiàn)數(shù)字信號(hào)處理算法和信號(hào)處理系統(tǒng)终抽。
BPSK調(diào)制解調(diào)系統(tǒng)以及Costas環(huán)載波同步的FPGA實(shí)現(xiàn)主要包括以下幾個(gè)模塊:
1.信號(hào)源模塊
信號(hào)源模塊主要負(fù)責(zé)產(chǎn)生BPSK調(diào)制的數(shù)字信號(hào)戳表,實(shí)現(xiàn)方式可以是使用FPGA內(nèi)部的數(shù)字信號(hào)發(fā)生器或者外部的數(shù)字信號(hào)源輸入桶至。
2.BPSK調(diào)制模塊
BPSK調(diào)制模塊主要負(fù)責(zé)將數(shù)字信號(hào)轉(zhuǎn)換為相位變化,并將其與載波相乘生成BPSK調(diào)制信號(hào)匾旭。實(shí)現(xiàn)方式可以是使用FPGA內(nèi)部的數(shù)字乘法器和相位偏移器等基本邏輯單元镣屹。
3.載波同步模塊
載波同步模塊主要負(fù)責(zé)實(shí)現(xiàn)Costas環(huán)的載波同步功能,包括相位估計(jì)和相位調(diào)整兩個(gè)環(huán)節(jié)价涝。實(shí)現(xiàn)方式可以是使用FPGA內(nèi)部的乘積檢測(cè)器女蜈、延遲環(huán)路、PI控制器等基本邏輯單元色瘩。
4.BPSK解調(diào)模塊
BPSK解調(diào)模塊主要負(fù)責(zé)將接收信號(hào)進(jìn)行相干解調(diào)伪窖,并將其轉(zhuǎn)換為數(shù)字信號(hào)。實(shí)現(xiàn)方式可以是使用FPGA內(nèi)部的相干解調(diào)器和數(shù)字濾波器等基本邏輯單元居兆。
以上是BPSK調(diào)制解調(diào)系統(tǒng)以及Costas環(huán)載波同步的FPGA實(shí)現(xiàn)的基本模塊覆山,實(shí)際實(shí)現(xiàn)中還需要考慮實(shí)際應(yīng)用場(chǎng)景的特點(diǎn)和要求,進(jìn)行相應(yīng)的優(yōu)化和調(diào)整泥栖。
3.verilog核心程序
//調(diào)制端 ???
wire[1:0] o_nz=(i_bits == 1'b1)?2'b01:2'b11;
wire[31:0]m_fir;
fiter_rrc uut(
.i_clk ?(i_clk),
.i_rst ?(i_rst),
.i_dat ?({o_nz[1],o_nz[1],o_nz[1],o_nz[1],o_nz[1],o_nz[1],o_nz,8'd0}),
.o_demod(m_fir)
);
assign o_fir=m_fir[27:12];
wire[15:0]m_carrier;
dds_compiler_0 uut2(
.aclk ???(i_clk), ???????????????????????????
.aresetn (~i_rst), ????????????????
.s_axis_config_tvalid(1'b1), ??
.s_axis_config_tdata(32'd100000000 + 32'd20000),//加入頻偏<=20000 ???
.m_axis_data_tvalid(), ?????
.m_axis_data_tdata(m_carrier), ???????
.m_axis_phase_tvalid(), ??
.m_axis_phase_tdata() ?????
);
assign o_carrier={m_carrier[7:0],8'd0}; ???
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
o_mod <= 32'd0;
end
else begin
o_mod <= $signed(o_carrier)*$signed(o_fir);
end
end ???
/
//解調(diào)端 ,考慮載波同步
//NCO
wire signed[31:0]o_K;
wire[15:0]m_carrier_local;
dds_compiler_0 uut3(
.aclk ???(i_clk), ???????????????????????????
.aresetn (~i_rst), ?????????????????????????
.s_axis_config_tvalid(1'b1), ??
.s_axis_config_tdata(32'd100000000 + i_sel*o_K), ???
.m_axis_data_tvalid(), ?????
.m_axis_data_tdata(m_carrier_local), ???????
.m_axis_phase_tvalid(), ??
.m_axis_phase_tdata() ?????
);
wire signed[15:0] o_sin_local={m_carrier_local[15:8],8'd0}; ??
wire signed[15:0] o_cos_local={m_carrier_local[7:0],8'd0};
//下變頻
..............................................................
//匹配濾波
wire signed[31:0] o_demod_sin;
fiter_rrc uut4(
.i_clk ?(i_clk),
.i_rst ?(i_rst),
.i_dat ?(o_sin_dw[31:16]),
.o_demod(o_demod_sin)
);
fiter_rrc uut5(
.i_clk ?(i_clk),
.i_rst ?(i_rst),
.i_dat ?(o_cos_dw[31:16]),
.o_demod(o_demod_cos)
);
//鑒相器
.............................................. ?
//環(huán)路濾波
lpf lpfu(
.i_clk ?(i_clk),
.i_rst ?(i_rst),
.i_din ?(o_mods),
.o_K ???(o_K),
.o_Ks ??()
);
endmodule