FPGA教程目录
MATLAB教程目录
---------------------------------------------------------------------------------------
目录
1.软件版本
2.ASK调制原理
3.ASK调制过程的FPGA实现
4.操作步骤与仿真结论
5.参考文献
1.软件版本
vivado2019.2
2.ASK调制原理
振幅键控,记做ASK,或称其为开关键控(通断键控),记做OOK 。二进制数字振幅键控通常记做2ASK。对于振幅键控这样的线性调制来说,在二进制里,2ASK是利用代表数字信息“0”或“1”的基带矩形脉冲去键控一个连续的载波,使载波时断时续的输出,有载波输出时表示发送“1”,无载波输出时表示发送“0”。根据线性调制的原理,一个二进制的振幅调制信号可以表示完成一个单极性矩形脉冲序列与一个正弦型载波的乘积。
2ASK信号可表示为:
因此,从ASK调制的原理可知,其本质上是一个乘法器,将输入信号和调制载波相乘的过程。下面我们介绍如何通过FPGA来实现ASK调制过程。
3.ASK调制过程的FPGA实现
通过上述分析,我们可以知道在FPGA中,实现ASK主要涉及到cos信号的产生,二进制数字和cos信号相乘所使用的乘法器两个部分。
关于cos载波信号以及乘法,可以首先复习如下两个课程:
【FPGA教程案例2】基于vivado核的NCO正弦余弦发生器设计与实现
【FPGA教程案例3】基于vivado核的乘法器设计与实现
在FPGA中,ASK调制方式的实现结构如下图所示:
其中,NCO的IP核配置如下:
设置系统时钟为50Mhz,通道为1,即输出一路载波。
配置相位增量为可配置模式,方便我们通过verilog来控制载波频率。
乘法器的IP核配置如下:
NCO产生的载波为16位,输入符号位1位,所以乘法器的A和B位宽分别为16和1。
其对应的verilog程序如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/07/19 22:12:21
// Design Name:
// Module Name: ASK
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module ASK(
input i_clk,
input i_rst,
input i_bits,
output signed[15:0]o_cos,
output signed[15:0]o_ask
);
reg [31:0]addr;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
addr<=32'd0;
end
else begin
addr<=32'd25000000;
end
end
wire[31:0]m_axis_data_tdata;
dds_compiler_0 dds_compiler_u(
.aclk (i_clk), // input wire aclk
.aresetn (~i_rst), // input wire aresetn
.s_axis_config_tvalid(1'b1), // input wire s_axis_config_tvalid
.s_axis_config_tdata(addr), // input wire [31 : 0] s_axis_config_tdata
.m_axis_data_tvalid(), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata), // output wire [31 : 0] m_axis_data_tdata
.m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata() // output wire [31 : 0] m_axis_phase_tdata
);
assign o_cos=m_axis_data_tdata[15:0];
wire[16:0]PP;
mult_gen_0 mult_gen_0u (
.CLK(i_clk), // input wire CLK
.A(o_cos), // input wire [15 : 0] A
.B(i_bits), // input wire [0 : 0] B
.SCLR(i_rst), // input wire SCLR
.P(PP) // output wire [16 : 0] P
);
assign o_ask= PP[16:1];
endmodule
在verilog中,调用了dds和乘法器两个IP核,其中DDS输出cos余弦载波和输入二进制数据i_bits相乘得到ASK调制信号。
testbench代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/07/19 22:17:05
// Design Name:
// Module Name: test_ASK
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module test_ASK;
reg i_clk;
reg i_rst;
reg i_bits;
wire signed[15:0]o_cos;
wire signed[15:0]o_ask;
ASK uut(
.i_clk(i_clk),
.i_rst(i_rst),
.i_bits(i_bits),
.o_cos(o_cos),
.o_ask(o_ask)
);
initial
begin
i_clk = 1'b1;
i_rst = 1'b1;
#1000
i_rst = 1'b0;
end
initial
begin
i_bits= 1'b0;
#1050
i_bits= 1'b1;
#1000
i_bits= 1'b0;
#1000
i_bits= 1'b1;
#1500
i_bits= 1'b0;
#1200
i_bits= 1'b1;
#2000
i_bits= 1'b0;
#3000
i_bits= 1'b1;
#1000
i_bits= 1'b0;
#1500
i_bits= 1'b1;
#1000
i_bits= 1'b0;
#2000
i_bits= 1'b1;
#3500
i_bits= 1'b0;
#2200
i_bits= 1'b1;
#3000
i_bits= 1'b0;
#4000
i_bits= 1'b1;
#2000
i_bits= 1'b0;
#2500
i_bits= 1'b1;
#1000
i_bits= 1'b0;
end
always #5 i_clk=~i_clk;
endmodule
4.操作步骤与仿真结论
安装上一课的操作方式
【FPGA教程案例1】基于FPGA的串行FIR滤波器设计与实现_fpga&matlab的博客-、
得到如下的仿真结果:
从上面的仿真结果可知,可以正常得到ASK调制信号。
上述案例,也可以直接和博主联系,获得完整工程文件。
5.参考文献
[1]贾达, 马芙蓉, 汪霞. 基于FPGA的ASK,PSK,FSK信号的设计与实现[J]. 兰州石化职业技术学院学报, 2007, 7(002):20-22.