笔记八是ASK调制解调的仿真实现。

ASK调制解调的实现原理:首先使用MATLAB产生存储基带波形的coe文件,再让ROM读取coe文件输出基带波形,然后DDS产生正弦波信号作为载波信号,接下来使用乘法器将两者相乘产生ASK信号,ASK信号与载波信号相乘之后,再经过FIR低通滤波器解调出基带波形再抽样判决。

1. 打开VIVADO,点击IP Catalog

2. 搜索ROM,点击Block Memory Generator

3. ROM的配置

(1) 选择Single Port ROM

(2) 选择需要加载的coe文件的位宽和深度

(3) 加载coe文件

coe文件的生成

%% 二进制码序列的coe文件生成
clear all ;                 % 清除变量
clc ;                       % 清屏
N = 8 ;
L = 512;                    % 每个码元的采样点数
y = zeros(4096 , 1) ;       % 生成4096行1列的全为1的列向量
% 生成4096行1列取值为0,1的二进制码序列向量
% 最大值为1,因此数据位宽为1bit
% code = randi([0,1],1,N);   %N为码元个数
code = [1 1 0 1 1 0 0 1];
fz=ones(1,L);             %定义复制的次数L,L为每码元的采样点数
x1=code(fz,:);            %复制的第1行复制L次,将原来wave的第一行复制L次,称为L*M的矩阵
dnrz=reshape(x1,1,L*N);   %产生单极性不归零矩形脉冲波形,将刚得到的L*M矩阵,按列重新排列形成1*(L*M)的矩阵
y = 255*dnrz';
plot(y);                    % 绘制图像
hold on;                    % 保留之前的图,实现多图共存
fid = fopen('mayuan_4096_2.coe','wt');% 以写的形式创建文件,文件名为mayuan_4096_1.coe
% 文件格式保存为十进制,以换行隔开
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
% 将上面的矩形波值写入文件
for i = 1:1:4096fprintf(fid,'%d,\n',y(i,1));
end
fclose(fid);                % 关闭文件

4. 搜索DDS,点击DDS Complier

5. DDS参数配置 依照之前配置DDS IP核

 

6. 点击IP Catalog,搜索mult,选择Multiplier

7. 参数配置

同样配置另外一个Multiplier

8. 点击IP Catalog,搜索fir,选择FIR Complier

9. 配置参数

(1) 选择coe文件格式,将FIR 的coe文件加载进去,FIR低通滤波器的设计可以参照

(3条消息) FPGA学习笔记(六): FIR IP核的使用_菜yuan~的博客-CSDN博客

低通滤波器的带宽一般设置为第一零点带宽,即基带码元宽度的倒数,采样频率满足奈奎斯特采样定理就行。

(2) 采样频率 50kHz,时钟频率 50MHz

(3) 输入信号位宽为24bit,滤波器抽头系数16个

10. 顶层文件

module ASK_top(input clk,            // 输入clkinput rst_n,        // 输入复位output [7:0] dout,   // 输出8位波形,数据宽度,码元输入output clk2,          // 输出clk2output sig1,               // 输出余弦信号,即载波信号output sig2,              // 输出已调信号output sig3,               // 输出已调信号和载波相乘output code,              // 输出判决码元output fir_out,                // fir滤波后的截断信号output sig4               // 输出fir滤波信号);reg ena_reg;          // ROM使能信号reg [24:0]  counter;  //reg clk2;wire [7:0] sig1;wire [15:0] sig2;wire [23:0] sig3;wire [47:0] sig4;wire [15:0] fir_out;reg   [7:0] code;// 设计计数器,分频使用,10分频
always@(posedge clk or negedge rst_n)beginif(!rst_n)                   counter <= 1'b0;else if (counter == 4)counter <= 1'b0;elsecounter <= counter + 1'b1;end
// 产生10分频的clk2
always@(posedge clk or negedge rst_n)beginif(!rst_n)clk2 <= 1'b0;else if(counter == 4)clk2 <= !clk2;end// ROM使能信号
always@(posedge clk2 or negedge rst_n)beginif(~rst_n)ena_reg <= 0;elseena_reg <= 1;end
// ROM的地址
reg [11:0] addr_reg;    always@(posedge clk2 or negedge rst_n)beginif(~rst_n)addr_reg <= 12'd0;elseaddr_reg <= addr_reg + 1;end// ROM的例化,产生码元方波信号blk_mem_gen_0 U1 (.clka(clk2),    // input wire clka.ena(ena_reg),      // input wire ena.addra(addr_reg),  // input wire [11 : 0] addra.douta(dout)  // output wire [7 : 0] douta
);
// DDS的例化,产生载波信号
dds_compiler_0 U2 (.aclk(clk),                              // input wire aclk.m_axis_data_tvalid(m_axis_data_tvalid),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sig1)    // output wire [7 : 0] m_axis_data_tdata
);
// 乘法器的例化,产生已调信号
mult_gen_0 multi0 (.CLK(clk),  // input wire CLK.A(dout),      // input wire [7 : 0] A.B(sig1),      // input wire [7 : 0] B.P(sig2)      // output wire [15 : 0] P
);
// 乘法器的例化,产生已调信号和载波相乘
mult_gen_1 multi1 (.CLK(clk),  // input wire CLK.A(sig2),      // input wire [15 : 0] A.B(sig1),      // input wire [7 : 0] B.P(sig3)      // output wire [23 : 0] P
);
// fir低通滤波器的例化
fir_compiler_0 U3 (.aclk(clk),                              // input wire aclk.s_axis_data_tvalid(1'b1),  // input wire s_axis_data_tvalid.s_axis_data_tready(),  // output wire s_axis_data_tready.s_axis_data_tdata(sig3),    // input wire [23 : 0] s_axis_data_tdata.m_axis_data_tvalid(),  // output wire m_axis_data_tvalid.m_axis_data_tdata(sig4)    // output wire [39 : 0] m_axis_data_tdata
);
//fir的截断
assign fir_out = sig4[47:22];
// 判决
always@(posedge clk)beginif(!rst_n)                    code <= 1'b0;else if (sig4 == 0)code <= 8'd0;elsecode <= 8'd255;endendmodule

11. 测试文件

module ASK_tb();reg clk;         // 输入clkreg rst_n;          // 输入复位wire clk2;wire [7:0] dout;   // 输出8bit波形数据wire [7:0] sig1;   // 输出信号1    wire [15:0] sig2;    // 输出信号2wire [23:0] sig3;    // 输出信号3//wire [39:0] sig4;    // 输出信号4wire [15:0] fir_out;wire [7:0] code;
// 顶层文件的例化
ASK_top u0 (.clk(clk),.clk2(clk2),.rst_n(rst_n),.dout(dout),.sig1(sig1),.sig2(sig2),.sig3(sig3),//.sig4(sig4),.fir_out(fir_out),.code(code)
);//reg memdata[0:7] ;initial                   // 初始化
beginclk = 1;          // 初始clk为高电平rst_n = 0;         // 复位为低电平#1                 // 延时50nsrst_n = 1;            // 复位为高电平
//$readmemb("F:/shiyan/lab/ASK/data.txt",memdata);
end
always #10 clk = ~clk; // clk周期为20ns
endmodule

12. 结果显示

(1) dout和code的Waveform Style要选择Analog Settings中的hold,这样才能产生方波信号,并且Radix要选择Unsigned Decimal

除fir_outd其余信号的Waveform Style同样操作,Radix选择Signed Dicemal

Fir_out 的Waveform Style选择Analog就可以,Radix选择Unsigned Dicemal

FPGA学习笔记(八):ASK调制解调的仿真相关推荐

  1. FPGA学习笔记(七): DSB调制解调的仿真

    笔记七是DSB调制解调的仿真实现. DSB调制解调的实现原理:首先使用DDS产生低频正弦波信号作为调制信号,再用DDS产生高频信号作为载波信号,然后使用乘法器将两者相乘产生DSB信号,DSB信号与载波 ...

  2. FPGA学习笔记(六)Modelsim单独仿真和Quartus联合仿真及signaltap使用

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  3. 达芬奇pro的FPGA学习笔记3--添加testbench文件、仿真

    这是第一个实验,内容:小灯闪烁实验(主要参考正点原子的例程) 因为考虑到需要计数的数值较大,所以将计数减少,这样可以更好的进行仿真,下面的代码是修改后的Verilog的设计文件 module led_ ...

  4. FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  5. FPGA学习笔记(十二)IP核之FIFO的学习总结

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  6. FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  7. LoRa学习:LoRa通信调制解调的实现原理与性能

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: LoRa学习:LoRa调制解调原理与性能 目录 LoRa学习:LoRa调制解 ...

  8. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

  9. FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程

    FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程 很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序 ...

最新文章

  1. 将矩阵转为一行_LeetCode1253:矩阵重构
  2. linux sed命令的常用方法
  3. python数据分析常用包之Scipy
  4. day02-java关键字
  5. SVN 服务器端的搭建-及多仓库管理-OK
  6. Jmock-使用ClassImposteriser扩展mock class对象
  7. python 可视化 画直线_用Python画江苏省地图,实现各地级市数据可视化
  8. java 访问网络驱动器_尝试通过GitLab Runner脚本访问网络驱动器但收到错误
  9. 阿里巴巴副总裁司罗:达摩院如何搭建 NLP 技术体系?
  10. HDU1573 X问题【扩展欧几里得算法】
  11. 关于代码审查的几点建议
  12. 飞信2008内测版下载
  13. CAM350 - 导出 DXF 文件
  14. Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少(蓝桥基础实战)
  15. 如何写出如散文般的代码――《代码整洁之道》读书笔记(Ch1-Ch3)
  16. 图书馆管理系统需求规格说明书
  17. 亲身经历!4个月写完硕士毕业论文一稿过,我是如何做到的?
  18. 欧姆龙485通讯示例程序_欧姆龙PLC型号大全
  19. stm32 mbed 入门教程(一)---前期准备
  20. Excel常用公式大全

热门文章

  1. XERO 系列之 GST报税
  2. 小点列表.Net/SQL
  3. java内存模型 final_聊聊Java内存模型
  4. RFSoC应用笔记 - RF数据转换器 -07- RFSoC关键配置之RF-DAC内部解析(一)
  5. [RK3399][Android7.1] Uboot display 加载过程小结
  6. python变量使用前必须声明_python变量不需要声明吗
  7. GridView简单使用
  8. 英特尔推出上网本应用商店
  9. 对于一个非负整数的正序输出
  10. android备份通讯录时关于accountType和accountName的爱恨纠葛