1.硬件片內(nèi)測試效果
本文是之前寫的文章
《基于FPGA的BPSK+幀同步系統(tǒng)verilog開發(fā),包含testbench,高斯信道,誤碼統(tǒng)計(jì),可設(shè)置SNR》
的硬件測試版本。
在系統(tǒng)在仿真版本基礎(chǔ)上增加了ila在線數(shù)據(jù)采集模塊,vio在線SNR設(shè)置模塊,數(shù)據(jù)源模塊。
硬件ila測試結(jié)果如下:(完整代碼運(yùn)行后無水?。?/p>
vio設(shè)置SNR=15db

vio設(shè)置SNR=5db

硬件測試操作步驟可參考程序配套的操作視頻。
2.算法涉及理論知識(shí)概要
2.1 bpsk
BPSK信號與2ASK信號的時(shí)域表達(dá)式在形式上是完全相同的,所不同的只是兩者基帶信號s(t)的構(gòu)成,一個(gè)由雙極性NRZ碼組成,另一個(gè)由單極性NRZ碼組成。因此,求BPSK信號的功率譜密度時(shí),也可采用與求2ASK信號功率譜密度相同的方法。
(1)當(dāng)雙極性基帶信號以相等的概率(p=1/2)出現(xiàn)時(shí),BPSK信號的功率譜僅由連續(xù)譜組成。BPSK信號的功率譜由連續(xù)譜和離散譜兩部分組成。其中,連續(xù)譜取決于數(shù)字基帶信號s(t)經(jīng)線性調(diào)制后的雙邊帶譜,而離散譜則由載波分量確定。
(2)BPSK的連續(xù)譜部分與2ASK信號的連續(xù)譜基本相同(僅差一個(gè)常數(shù)因子)。因此,BPSK信號的帶寬、頻帶利用率也與2ASK信號的相同。
在數(shù)字調(diào)制中,BPSK(后面將會(huì)看到2DPSK也同樣)的頻譜特性與2ASK十分相似。相位調(diào)制和頻率調(diào)制一樣,本質(zhì)上是一種非線性調(diào)制,但在數(shù)字調(diào)相中,由于表征信息的相位變化只有有限的離散取值,因此,可以把相位變化歸結(jié)為幅度變化。這樣一來,數(shù)字調(diào)相同線性調(diào)制的數(shù)字調(diào)幅就聯(lián)系起來了,為此可以把數(shù)字調(diào)相信號當(dāng)作線性調(diào)制信號來處理了。但是不能把上述概念推廣到所有調(diào)相信號中去。
BPSK (Binary Phase Shift Keying)-------二進(jìn)制相移鍵控。是把模擬信號轉(zhuǎn)換成數(shù)據(jù)值的轉(zhuǎn)換方式之一,利用偏離相位的復(fù)數(shù)波浪組合來表現(xiàn)信息鍵控移相方式。BPSK使用了基準(zhǔn)的正弦波和相位反轉(zhuǎn)的波浪,使一方為0,另一方為1,從而可以同時(shí)傳送接受2值(1比特)的信息。
由于最單純的鍵控移相方式雖抗噪音較強(qiáng)但傳送效率差,所以常常使用利用4個(gè)相位的QPSK和利用8個(gè)相位的BPSK。
????????二進(jìn)制相移鍵控(BPSK)信號進(jìn)行相干解調(diào)的系統(tǒng),其包括:用于從所述BPSK信號中恢復(fù)出頻率為2F的載波信號(C)的裝置;用于將頻率為2F的所述信號注入到注入鎖定振蕩器(ILO)中的裝置,該注入鎖定振蕩器的固有諧振頻率為f[r],該f[r]大致等于f,該注入鎖定振蕩器提供用于恢復(fù)具有(θ[e]-k)/2相移的原始載波的差分輸出(o[p]、o[n])信號,其中θ=arcsin[(f[r]-r)/αA[i]f],其中α和k是取決于所述注入鎖定振蕩器(ILO)中的主要非線性的類型的參數(shù),而A[i]是所恢復(fù)的頻率為2f的載波信號的幅值,以及用于將所述差分輸出(o[p]、o[n])信號與所述輸入BPSK信號的副本進(jìn)行組合,以產(chǎn)生解調(diào)信號(DEMOD)的裝置。
2.2 幀同步
在數(shù)字通信中,信息通常是以幀為單位進(jìn)行組織和傳輸?shù)摹降哪康氖谴_定每一幀的起始位置,以便接收端能夠正確地解調(diào)出每幀中的數(shù)據(jù)。
設(shè)發(fā)送的幀結(jié)構(gòu)為:幀同步碼+ 信息碼元序列 。幀同步碼是具有特定規(guī)律的碼序列,用于接收端識(shí)別幀的起始。
幀同步的過程就是在接收序列中尋找與幀同步碼匹配的位置,一旦找到匹配位置,就確定了幀的起始位置,后續(xù)的碼元就可以按照幀結(jié)構(gòu)進(jìn)行正確的劃分和處理。

3.Verilog核心程序
wire [1:0]o_msg;
//產(chǎn)生模擬測試數(shù)據(jù)
signal signal_u(
.i_clk (i_clk),
.i_rst (~i_rst),
.o_bits(o_msg)
);
//設(shè)置SNR
wire signed[7:0]o_SNR;
vio_0 your_instance_name (
.clk(i_clk), ???????????????// input wire clk
.probe_out0(o_SNR) ?// output wire [7 : 0] probe_out0
);
wire signed[15:0]o_fir;
wire signed[15:0]o_carrier;
wire signed[31:0]o_mod;
wire signed[15:0]o_modn;
wire signed[15:0]o_carrier_local;
wire signed[31:0]o_dw;
wire signed[31:0]o_demod ;
wire signed[31:0]o_error_num;
wire signed[31:0]o_total_num;
wire ?o_bits;
wire [1:0]o_bits_data;
wire [1:0]o_bits_head;
wire [7:0]o_peak;
wire ?o_en_data;
wire ?o_en_pn;
wire ?o_frame_start;
BPSK uut(
.i_clk(i_clk),
.i_rst(~i_rst),
.i_bits(o_msg),
.i_SNR(o_SNR),
.o_fir(o_fir),
.o_carrier(o_carrier),
.o_mod(o_mod),
.o_modn(o_modn),
.o_carrier_local(o_carrier_local),
.o_dw(o_dw),
.o_demod(o_demod),
.o_bits ?????????(o_bits),
.o_bits_data ????(o_bits_data),
.o_bits_head ????(o_bits_head),
.o_peak ?????????(o_peak),
.o_en_data ??????(o_en_data),
.o_en_pn ????????(o_en_pn),
.o_frame_start ??(o_frame_start),
.o_error_num ????(o_error_num),
.o_total_num ????(o_total_num)
);
wire signed[15:0]o_mod2=o_mod[21:6];
wire signed[15:0]o_demod2=o_demod[23:8];
//ila篇內(nèi)測試分析模塊
ila_0 ila_u (
?.clk(i_clk), // input wire clk
?.probe0({
?o_msg,o_SNR,//10
o_fir,o_mod2,o_modn,o_demod2,//80
?o_bits_data,o_bits_head,o_peak,o_en_data,o_en_pn,//14
?o_error_num[19:0],o_total_num[23:0]//44
?})
?);??
endmodule
