【FPGA教程案例31】通信案例1——基于FPGA的ASK调制信号产生
FPGA教程目錄
MATLAB教程目錄
---------------------------------------------------------------------------------------
目錄
1.軟件版本
2.ASK調(diào)制原理
3.ASK調(diào)制過程的FPGA實現(xiàn)
4.操作步驟與仿真結(jié)論
5.參考文獻(xiàn)
1.軟件版本
vivado2019.2
2.ASK調(diào)制原理
? ? ? ? 振幅鍵控,記做ASK,或稱其為開關(guān)鍵控(通斷鍵控),記做OOK 。二進(jìn)制數(shù)字振幅鍵控通常記做2ASK。對于振幅鍵控這樣的線性調(diào)制來說,在二進(jìn)制里,2ASK是利用代表數(shù)字信息“0”或“1”的基帶矩形脈沖去鍵控一個連續(xù)的載波,使載波時斷時續(xù)的輸出,有載波輸出時表示發(fā)送“1”,無載波輸出時表示發(fā)送“0”。根據(jù)線性調(diào)制的原理,一個二進(jìn)制的振幅調(diào)制信號可以表示完成一個單極性矩形脈沖序列與一個正弦型載波的乘積。
? ? ? ?2ASK信號可表示為:
因此,從ASK調(diào)制的原理可知,其本質(zhì)上是一個乘法器,將輸入信號和調(diào)制載波相乘的過程。下面我們介紹如何通過FPGA來實現(xiàn)ASK調(diào)制過程。
3.ASK調(diào)制過程的FPGA實現(xiàn)
? ? ? ?通過上述分析,我們可以知道在FPGA中,實現(xiàn)ASK主要涉及到cos信號的產(chǎn)生,二進(jìn)制數(shù)字和cos信號相乘所使用的乘法器兩個部分。
? ? ? ?關(guān)于cos載波信號以及乘法,可以首先復(fù)習(xí)如下兩個課程:??
【FPGA教程案例2】基于vivado核的NCO正弦余弦發(fā)生器設(shè)計與實現(xiàn)
【FPGA教程案例3】基于vivado核的乘法器設(shè)計與實現(xiàn)
? ? ? 在FPGA中,ASK調(diào)制方式的實現(xiàn)結(jié)構(gòu)如下圖所示:
其中,NCO的IP核配置如下:
設(shè)置系統(tǒng)時鐘為50Mhz,通道為1,即輸出一路載波。
配置相位增量為可配置模式,方便我們通過verilog來控制載波頻率。
?
?乘法器的IP核配置如下:
NCO產(chǎn)生的載波為16位,輸入符號位1位,所以乘法器的A和B位寬分別為16和1。
?
?其對應(yīng)的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) beginif(i_rst)beginaddr<=32'd0;end else beginaddr<=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中,調(diào)用了dds和乘法器兩個IP核,其中DDS輸出cos余弦載波和輸入二進(jìn)制數(shù)據(jù)i_bits相乘得到ASK調(diào)制信號。?
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 begini_clk = 1'b1;i_rst = 1'b1;#1000i_rst = 1'b0; endinitial begini_bits= 1'b0;#1050i_bits= 1'b1;#1000i_bits= 1'b0;#1000i_bits= 1'b1;#1500i_bits= 1'b0;#1200i_bits= 1'b1;#2000i_bits= 1'b0;#3000i_bits= 1'b1;#1000i_bits= 1'b0;#1500i_bits= 1'b1;#1000i_bits= 1'b0;#2000i_bits= 1'b1;#3500i_bits= 1'b0;#2200i_bits= 1'b1;#3000i_bits= 1'b0;#4000i_bits= 1'b1;#2000i_bits= 1'b0;#2500i_bits= 1'b1;#1000i_bits= 1'b0;endalways #5 i_clk=~i_clk;endmodule4.操作步驟與仿真結(jié)論
安裝上一課的操作方式
【FPGA教程案例1】基于FPGA的串行FIR濾波器設(shè)計與實現(xiàn)_fpga&matlab的博客-CSDN博客
得到如下的仿真結(jié)果:
從上面的仿真結(jié)果可知,可以正常得到ASK調(diào)制信號。
上述案例,也可以直接和博主聯(lián)系,獲得完整工程文件。
?
5.參考文獻(xiàn)
[1]賈達(dá), 馬芙蓉, 汪霞. 基于FPGA的ASK,PSK,FSK信號的設(shè)計與實現(xiàn)[J]. 蘭州石化職業(yè)技術(shù)學(xué)院學(xué)報, 2007, 7(002):20-22.
總結(jié)
以上是生活随笔為你收集整理的【FPGA教程案例31】通信案例1——基于FPGA的ASK调制信号产生的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring事务传播属性和隔离级别
- 下一篇: 泛型数组