【教程4>第3章>第2节】4ASK调制系统的FPGA开发与matlab验证

本课程学习成果预览

 欢迎订阅FPGA/MATLAB/Simulink系列教程

《★教程1:matlab入门100例》

《★教程2:fpga入门100例》

《★教程3:simulink入门60例》

《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》

目录​​​​​​​

1.软件版本

2.4ASK调制理论简介

3.4ASK调制过程的MATLAB实现

4.4ASK调制过程的FPGA实现

4.1 verilog程序

4.2测试程序

4.3整体工程与仿真

5.参考文献


1.软件版本

vivado2019.2,matlab2022a

2.4ASK调制理论简介

        在《FPGA入门100例》中的31.通信案例1——基于FPGA的ASK调制信号产生​​​​​​​中,我们初步学习了ASK调制的基本原理和FPGA实现。在教程4中,2.2小节2.3小节,我们学习了2ASK调制解调的完整实现过程。在本章节中,我们将进一步学习基于fpga的4ASK调制解调系统的实现。

        ASK调制的基本原理是利用载波信号的幅度变化来传递数字信息。在二进制ASK中,数据以0和1的形式表示,其中0对应于无幅度的载波信号,而1对应于一定幅度的载波信号。因此,二进制数据位被映射到不同的幅度级别上。

       而在4ASK中,每个符号代表两位二进制信息。因此,有四种可能的振幅水平,通常与二进制序列00、01、10、11一一对应。这些振幅水平对应着载波信号幅度的不同值,例如,通过改变幅度的高低来编码不同的二进制组合。

      假设原始的基带信号是一个二进制数字流b(t),并且我们有周期性载波信号c(t)=Ac​cos(2πfc​t),其中Ac​ 是载波的振幅,fc​ 是载波的频率。4ASK调制信号s(t)可以通过将基带信号映射到不同的振幅来生成,其数学表达式为:

       其中,k是根据当前二进制数字对映射到的振幅索引。具体来说,对于连续的二进制数字流,可以按时间段分割,每段对应一个完整的二进制数字对,进而决定k的值。

3.4ASK调制过程的MATLAB实现

根据4ASK的原理,我们编写如下的matlab程序:

clc; % 清除命令窗口
clear; % 清除工作空间变量
close all; % 关闭所有图形窗口
warning off; % 关闭警告信息

Num  = 20; % 定义比特数
bits = round(3*rand(1,Num)); % 生成随机比特序列
f1   = 1; % 定义载波频率
t    = 0:1/100:4-1/100; % 定义时间序列

%4ASK
sa0 = 0*sin(2*pi*f1*t); % 生成零信号(对应比特0)
sa1 = 0.25*sin(2*pi*f1*t); % 生成载波信号(对应比特1)
sa2 = 0.5*sin(2*pi*f1*t); % 生成载波信号(对应比特2)
sa3 = 0.75*sin(2*pi*f1*t); % 生成载波信号(对应比特3)
% 调制
ask=[]; % 初始化ASK信号
for i=1:Num
    if bits(i)==0
        ask=[ask sa0]; % 如果比特为1,添加sa1到ASK信号
    end
    if bits(i)==1
        ask=[ask sa1]; % 如果比特为1,添加sa1到ASK信号
    end
    if bits(i)==2
        ask=[ask sa2]; % 如果比特为1,添加sa1到ASK信号
    end
    if bits(i)==3
        ask=[ask sa3]; % 如果比特为1,添加sa1到ASK信号
    end
end

figure % 创建图形窗口
subplot(311) % 创建3行1列的子图,并定位到第一个
stairs(bits,'linewidth',1) % 绘制比特序列的阶梯图
title('Message Bits'); % 设置标题
grid on % 打开网格
subplot(312) % 定位到第二个子图
plot(sa1,'r','linewidth',1) % 绘制载波信号
title('carrier'); % 设置标题
grid on % 打开网格

subplot(313) % 定位到第三个子图
plot(ask,'r','linewidth',1) % 绘制ASK调制信号
title('4ASK Modulation'); % 设置标题
grid on % 打开网格

运行之后,我们可以获得如下的仿真结果:

可以看到,对于数据0,1,2,3部分,会得到不同幅度的载波数据,每一个符号,对应4个载波。

4.4ASK调制过程的FPGA实现

4.1 verilog程序

4ASK调制程序如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/10/18 19:56:50
// Design Name: 
// Module Name: FSK_mod
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module ASK4_mod(
input i_clk,
input i_rst,
input [1:0]i_x,
output signed[15:0]o_carrier,
output reg signed[15:0]o_demod
);
    
wire[31:0]m_axis_data_tdata1;
dds_compiler_0 dds_compiler_u1(
  .aclk    (i_clk),                              
  .aresetn (~i_rst),                        
  .m_axis_data_tvalid(),      
  .m_axis_data_tdata(m_axis_data_tdata1),      
  .m_axis_phase_tvalid(),  
  .m_axis_phase_tdata()    
);


assign o_carrier=m_axis_data_tdata1[31:16];  

always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
     begin
     o_demod <= 16'd0;
     end
else begin
         if(i_x == 2'b00)       
         o_demod <= 16'd0;
         
         if(i_x == 2'b01)       
         o_demod <= {o_carrier[15],o_carrier[15],o_carrier[15:2]};
         
         if(i_x == 2'b10)       
         o_demod <= {o_carrier[15],o_carrier[15:1]};
         
         if(i_x == 2'b11)       
         o_demod <= {o_carrier[15],o_carrier[15:1]}+{o_carrier[15],o_carrier[15],o_carrier[15:2]};
     end
end 

 
    
endmodule

上述程序中,4ASK调制包含一个DDS核以及根据输入数据选择不同幅度载波的判决语句。

其中NCO核的设置如下:

上面NCO的时钟设置为40M,输出频率为2.5M。

根据输入数据选择不同幅度载波的判决语句:

4.2测试程序

testbench代码如下:

`timescale 1ns / 1ps

module test_ASK2;
 
reg i_clk;
reg i_rst;
reg [1:0]i_x;
wire signed[15:0]o_carrier;
wire signed[15:0]o_demod;


ASK4_mod uut(
.i_clk(i_clk),
.i_rst(i_rst),
.i_x(i_x),
.o_carrier(o_carrier),
.o_demod(o_demod)
);

initial
begin
    i_clk = 1'b1;
    i_rst = 1'b1;
    #1600
    i_rst = 1'b0;
end
initial
begin
    i_x= 1'b0;
    
    #1640
    i_x= 2'b01;
    #320
    i_x= 2'b10;
    #320
    i_x= 2'b00;
    #640
    i_x= 2'b11;
    #1280
    i_x= 2'b01;
    #640
    i_x= 2'b11;
    #640
    i_x= 2'b10;
    #1280
    i_x= 2'b00;
    #320
    i_x= 2'b10;
    #320
    i_x= 2'b01;
    #640
    i_x= 2'b11;
    #1280
    i_x= 2'b11;
    #640
    i_x= 2'b11;
    #640
    i_x= 2'b10;
    #1280
    i_x= 2'b00;
    
end



always #5 i_clk=~i_clk;

endmodule

4.3整体工程与仿真

完成上面的程序之后,我们可以得到如下的文件内容:

最后,仿真测试结果如下:

从仿真结果可以看到,FPGA的4ASK调制输出和MATLAB完全一致。

5.参考文献

[1] Fagotto E A M , Abbade M L F .All-optical demultiplexing of 4-ASK optical signals with four-wave mixing optical gates[J].Optics Communications, 2010, 283(6):1102-1109.DOI:10.1016/j.optcom.2009.10.094.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值