【硬件測試】基于FPGA的BPSK+幀同步系統開發與硬件片內測試,包含高斯信道,誤碼統計,可設置SNR
1.硬件片內測試效果
本文是之前寫的文章
《基于FPGA的BPSK+幀同步系統verilog開發,包含testbench,高斯信道,誤碼統計,可設置SNR》
的硬件測試版本。
在系統在仿真版本基礎上增加了ila在線數據采集模塊,vio在線SNR設置模塊,數據源模塊。
硬件ila測試結果如下:(完整代碼運行后無水印):
vio設置SNR=15db

vio設置SNR=5db

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

3.Verilog核心程序
wire [1:0]o_msg;
//產生模擬測試數據
signal signal_u(
.i_clk (i_clk),
.i_rst (~i_rst),
.o_bits(o_msg)
);
//設置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篇內測試分析模塊
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

