FPGA Implementation of BPSK Modulator and Demodulator

FPGA Implementation of DBPSK Modulator and Demodulator

前言

本设计使用开发工具为Quartus prime 18.1和Matlab 2018B
工程连接:

一、方案设计

1、系统介绍

DBPSK介绍:
2DPSK又称为相对相移键控,它不是利用载波相位的绝对数值传送数字信息,而是用前后码元的相对载波相位值传送数字信息。所谓相对载波相位是指本码与前一码元初相之差。

2、系统流程图

在这里插入图片描述

3、模块分析

3.1 信源差分编码

差分编码原理:

B(n) = A(n) ^ B(n-1)

相对码 = 绝对码 异或 相对码前一马元

3.2 DBPSK调制

2DPSK 信号键控法调制原理框图如图所示。其中码变换是将绝对码变成相对码,开关电路的作用是当输入为 0 时,相位为 0;当输入为 1 时,相位为π。
在这里插入图片描述

3.3 DBPSK解调

2DPSK 信号解调的一种方法是差分相干解调法。用这种方法解调不需要专门的相干载波,只需由收到的 2DPSK 信号延迟一个码元周期 TB,再与 2DPSK信号自己相乘。相乘器起到了相位比较作用,相乘结果反映了前后码元的相位差, 经低通滤波后再抽样判决,即可直接恢复出原始的二进制数字信息
在这里插入图片描述

3.4 信宿差分解码

差分译码原理:

A(n) = B(n) ^ B(n-1)

绝对码 = 相对码 异或 相对码前一码元

3.5 开发板DE2-115

在这里插入图片描述

二、matlab实现

1、 信源差分编码

%% 产生二进制序列
s=randi([0 1],max,1); %产生介于0-1之间的长度为max的1列随机序列  输入序列码元
Sinput=[]; %输入序列波形
for n=1:length(s)
    if s(n)==0
        A=zeros(1,Code_Len);    %码元宽度为2000
    else
        s(n)=1;
        A=ones(1,Code_Len);
    end
    Sinput=[Sinput A];
end 
figure(1);subplot(2,1,1);plot(Sinput);
grid on;axis([0,Code_Len*length(s),-2,2]);title('输入信号波形');

%% 差分编码
Sbianma=encode(s,15,11,'hamming'); %汉明码编码后序列,一行15列的二进制数字
a1=[];%差分编码序列波形
b1=[];%解调载波
for n=1:length(Sbianma) %差分编码
    if Sbianma(n)==0
        B=zeros(1,Code_Len);  %每个值2000个点
    else
        Sbianma(n)=1;
        B=ones(1,Code_Len);
    end
    a1=[a1 B];  %s(t),码元宽度2000
    c=cos(2*pi*f*t);  %载波信号 0相位
    b1=[b1 c];  %与s(t)等长的载波信号,变为矩阵形式
end 
figure(2);subplot(6,2,1);plot(a1);%差分编码后序列波形
grid on; axis([0 Code_Len*length(Sbianma) -2 2]);title('编码后二进制信号序列');
figure(2);subplot(6,2,2); plot(abs(fft(a1)));%差分编码后序列频谱
grid on;axis([0 Code_Len*length(Sbianma) 0 400]);title('编码后二进制信号序列频谱');

请添加图片描述

2、 DBPSK调制

%% 调制
a2=[];%PSK调制信号波形
b2=[];%调制载波
for n=1:length(Sbianma)
    if Sbianma(n)==0
        C=ones(1,Code_Len);  %每个值2000点
        d=cos(2*pi*f*t);  %载波信号 0相位
    else
        Sbianma(n)=1;
        C=ones(1,Code_Len);
        d=cos(2*pi*f*t+pi);  %载波信号 Pi相位
    end
    a2=[a2 C];  %s(t),码元宽度2000
    b2=[b2 d];  %与s(t)等长的载波信号 
end
tiaoz=a2.*b2;  %DBPSK e(t)调制
figure(2);subplot(6,2,3);plot(tiaoz);%BPDK调制信号波形
grid on; axis([0 Code_Len*length(Sbianma) -2 2]);title('2psk已调制信号');
figure(2);subplot(6,2,4); plot(abs(fft(tiaoz))); %BPDK调制信号频谱
grid on;axis([0 Code_Len*length(Sbianma) 0 400]);title('2psk信号频谱');

请添加图片描述

3、加入高斯白噪声

 %% 加入高斯白噪声
%-----------------带有高斯白噪声的信道---------------------
tz=awgn(tiaoz,10);  %信号tiaoz加入白噪声,信噪比为10
figure(2);subplot(6,2,5);plot(tz);
grid on;axis([0 Code_Len*length(Sbianma) -2 2]);title('通过高斯白噪声后的信号');
figure(2);subplot(6,2,6); plot(abs(fft(tz)));
grid on;axis([0 Code_Len*length(Sbianma) 0 800]);title('加入白噪声的2psk信号频谱');

请添加图片描述

4、 相干解调

%% 相干解调
jiet=2*b1.*tiaoz;  %同步解调
figure(2);subplot(6,2,7);plot(jiet);
grid on ;axis([0 Code_Len*length(Sbianma) -2 2]);title('相干解调后的信号波形');
figure(2);subplot(6,2,8);plot(abs(fft(jiet)));
grid on;axis([0 Code_Len*length(Sbianma) 0 800]);title('相干解调后的信号频谱');

请添加图片描述

5、 低通滤波

%% FIR滤波
LPF = LPF10M_100_30K;%FIR低通滤波,采样频率10M,15阶,截止频率3M
jt = filter(LPF,jiet);%fir滤波
figure(2);subplot(6,2,9);plot(jt);
grid on ;axis([0 Code_Len*length(Sbianma) -2 2]);title('经低通滤波器后的解调信号波形');
figure(2);subplot(6,2,10);plot(abs(fft(jt)));
grid on;axis([0 Code_Len*length(Sbianma) 0 800]);title('经低通滤波器后的解调信号频率');

请添加图片描述

FIR滤波器设计
请添加图片描述

6、 抽样判决

%% 抽样判决
for m=1:Code_Len*length(Sbianma)
    if jt(m)<0
        jt(m)=1;
    else jt(m)>0
        jt(m)=0;
    end
end
figure(2);subplot(6,2,11);plot(jt);
grid on ;axis([0 Code_Len*length(Sbianma) -2 2]);title('经抽样判决后信号jt(t)波形');
figure(2);subplot(6,2,12);plot(abs(fft(jt)));
grid on;axis([0 Code_Len*length(Sbianma) 0 800]);title('经抽样判决后的信号频谱');

请添加图片描述

7、 信宿差分解码

%% 差分解码
n=1:Code_Len:Code_Len*length(Sbianma);
a5=[];
a5=[a5 jt(n)];
s1=decode(a5,15,11,'hamming'); %汉明译码
a6=[];
for n=1:length(s1)
    if s1(n)==0
        G=zeros(1,Code_Len);
    else
        s1(n)=1;
        G=ones(1,Code_Len);
    end
    a6=[a6 G];
end
figure(1);subplot(2,1,2);plot(a6);
grid on;axis([0 Code_Len*length(s) -2 2]);title('DBPSK调制后波形');

输入信号和输出信号对比
请添加图片描述

三、FPGA实现

1、随机序列生成

/*
m:x^8+x^4+x^3+x^2+1
*/

module msequence8#(
   parameter seed= 8'b1111_1111
)(
   input clk,
   input rst_n,
   input en,
   output reg [31:0]num,
   output mse8, //m sequence
   output reg [7:0]rand8
);

assign mse8 = rand8[0];

always @ (posedge clk or negedge rst_n)begin
   if(!rst_n) begin
      rand8 <= seed;
      num <= 32'd1;
   end
   else if(en) begin
      rand8[0] <= rand8[1];
      rand8[1] <= rand8[2];
      rand8[2] <= rand8[3];
      rand8[3] <= rand8[4];
      rand8[4] <= rand8[5];
      rand8[5] <= rand8[6];
      rand8[6] <= rand8[7];
      rand8[7] <= rand8[0] ^ rand8[4] ^ rand8[5] ^ rand8[6];
      num <= num + 1'b1;
   end
   else
      rand8 <= rand8;
end

endmodule

RTL视图:在这里插入图片描述

2、 信源差分编码

module encode(
	input Clk,
	input Rst_n,
	input an,//绝对码
	
	output reg bn//相对码
);

reg bn_latter;//相对码前一码元

always@(posedge Clk or negedge Rst_n)begin
	if(!Rst_n)
		bn_latter <= 0;
	else
		bn_latter <= bn;
end

always@(posedge Clk or negedge Rst_n)begin
	if(!Rst_n)
		bn <= 0;
	else
		bn <=  an ^ bn_latter;
end

endmodule

在这里插入图片描述
RTL:
请添加图片描述

3、 DBPSK调制

module modulation_v2(
    input Clk_10M,
    input Rst_n,
//	input [31:0]data_in,//串行差分编码信号输入
	input encode_data,
    
	output reg Signal_CLK,//码元同步时钟
	output reg [7:0]num,
	output [8:0]address_m,
    output signed [7:0]modulation_data//调制信号输出
);

reg [10:0]cnt;
reg Clear;

always @(posedge Clk_10M, negedge Rst_n)begin
	if (!Rst_n) begin
		cnt <= 11'd0;
		num <= 8'd0;
		Clear <= 1;
		Signal_CLK <= 1'b0;
	end
	else if (cnt == 11'd2047)begin
		cnt <= 11'd0;
		num <= num + 1'b1;
		Clear <= 0;
		Signal_CLK <= 1'b0;
	end
	else if (cnt == 11'd1023)begin
		cnt <= cnt + 1'b1;
		num <= num;
		Clear <= 1;		
		Signal_CLK <= 1'b1;
	end
	else begin
		cnt <= cnt + 1'b1;
		num <= num;
		Clear <= 1;
		Signal_CLK <= 1'b0;
	end
end

//调制载波
sin_table sin_table_modulation(
	.Clk_1M(Clk_10M),//10M
	.Rst_n(Rst_n),
	.Clear(Clear),
	.Key(encode_data),
	.address(address_m),
	.data_out(modulation_data)//80K
);

endmodule

在这里插入图片描述
RTL视图:
在这里插入图片描述

4、 相干解调

module demodulation(
    input Clk_10M,
    input Rst_n,
    input signed [7:0]modulation_data,
    
	output signed [7:0]carrier_wave,
    output [8:0]address_dm,
    output reg signed [15:0]demodulation_data
);

//解调载波
sin_table sin_table_demodulation(
	.Clk_1M(Clk_10M),//1M
	.Rst_n(Rst_n),
	.Clear(1'b1),
	.Key(1'b1),
	.address(address_dm),
	.data_out(carrier_wave)//8K
);


//载波相乘
always @(posedge Clk_10M, negedge Rst_n)begin
	if (!Rst_n)
		demodulation_data <= 16'd0;
	else
		demodulation_data <= modulation_data * carrier_wave;
end

endmodule

在这里插入图片描述
RTL视图:
请添加图片描述

5、 低通滤波

FIR IP核调用
在这里插入图片描述

//低通滤波
//wire [37:0]fir_out;
wire ast_source_valid;
wire [1:0]ast_source_error;

reg [6:0]cnt1;
//reg extract_signal;//0.1ms定时提取信号

assign demd_bitstream = fir_out[38];

FIR FIR(
	.clk(Clk_50M),              //   clk
	.reset_n(Rst_n),          //                     rst.reset_n
	.ast_sink_data(demodulation_data),    //   avalon_streaming_sink.data
	.ast_sink_valid(Fs_10M),   // fs
	.ast_sink_error(2'd0),   //                        .error
	.ast_source_data(fir_out),  // avalon_streaming_source.data
	.ast_source_valid(ast_source_valid), //                        .valid
	.ast_source_error(ast_source_error)  //                        .error
);

在这里插入图片描述

6、 抽样判决

always @(posedge Fs_1M, negedge Rst_n)begin//0.1ms定时提取信号
	if (!Rst_n)begin
		cnt1 <= 7'd0;
		extract_signal <= 1'b0;
	end
	else if (cnt1 == 7'd100)begin
		cnt1 <= 7'd0;
		extract_signal <= fir_out[38];
	end 
	else begin
		cnt1 <= cnt1 + 1'b1;
		extract_signal <= extract_signal;
	end
end

在这里插入图片描述

7、 信宿差分解码

module decode(
	input Clk,
	input Rst_n,
	input bn,//相对码
	
	output reg [7:0]num,
	output reg an//绝对码
);

reg bn_latter;//相对码前一码元

always@(posedge Clk or negedge Rst_n)begin
	if(!Rst_n)
		bn_latter <= 0;
	else
		bn_latter <= bn;
end

always@(posedge Clk or negedge Rst_n)begin
	if(!Rst_n)begin
		an <= 0;
		num <= 8'd0;
	end
	else begin
		an <= bn ^ bn_latter;
		num <= num + 1'b1;
	end
end

endmodule

在这里插入图片描述
RTL视图:
在这里插入图片描述

四、结果分析

浮点定点对比

matlab浮点:
在这里插入图片描述

FPGA定点:
在这里插入图片描述

对比结果:
浮点效果比定点好

五、产考资料

  • https://blog.csdn.net/john_cxc/article/details/104928736
  • https://www.docin.com/p-320216290.html
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值