目录

前言

一、项目设计要求

二、各模块及仿真

1.m序列发生器

2.串并转换电路

3.电平映射电路

4.载波发生器

5.乘法器

6.加法器

三、例化仿真验证功能

总结


前言

QAM是Quadrature Amplitude Modulation的缩写,中文译名为“正交振幅调制”,其幅度和相位同时变化,属于非恒包络二维调制。本次设计使用环境为Quartus II与Modelsim Altera,项目设计原理图如下:

一、项目设计要求

设计任务各模块要求具体如下:

(1)模块时钟生成电路

设计必要的模块时钟生成电路,输出满足电路各模块工作需求的时钟信号。对生成的时钟信号预留仿真输出端口。

(2)m序列发生器

m序列的特征方程为 ,采用线性移位寄存器来产生,输出数字序列信号m的码速率为4kbps。电路在适当的时钟信号控制下工作,上升沿触发。reset信号高有效时电路异步复位,其复位状态为:全1信号。移位寄存器状态信号A_reg需预留仿真输出端口。

(3)串并转换电路

串并转换模块将串行输入的m序列,逐位依次交替送入I路和Q路,I、Q两路信号分别以2位为一组,生成输出信号I、Q,先输入的串行数据位于并行输出数据的高位。这样,每4位串行输入的二进制序列中,第1bit和第3bit组合成并行2位宽I信号输出;第2bit和第4bit组合成并行2位宽Q信号输出。电路在适当的时钟信号控制下工作,上升沿触发。reset信号高有效时电路异步清零。

(4)电平映射电路

分别将I、Q两信号进行电平映射,得到两路3位宽数据流a、b,映射规则如表1所示,其中a/b使用映射电平补码输出。电路在适当的时钟信号控制下工作,上升沿触发。reset信号高有效时电路异步清零。

表1 I/Q输入信号与映射电平a/b关系表

I/Q信号

映射电平

a/b

00

+3

011

01

+1

001

11

-1

111

10

-3

101

(5)载波信号发生电路

载波信号发生器输出同频正交载波信号c_cos和c_sin,分别表示为c_cos=cos2πf0t和c_sin=sin2πf0t,其中f0=10kHz。一个周期内采样200个样值。采样数据存储可以选择使用IP核实现。电路在适当的时钟信号控制下工作,上升沿触发。reset信号高有效时电路异步清零。

(6)ASK幅度调制电路

分别对a、b两路信号进行ASK幅度调制,得到互为正交的调幅信号I_mod和Q_mod,分别表示为:I_mod=acos2πf0t和Q_mod= bsin2πf0t。电路在适当的时钟信号控制下工作,上升沿触发。reset信号高有效时电路异步清零。

(7)加法电路

设计加法器电路实现输出调制信号qam=acos2πf0t-bsin2πf0t。电路在适当的时钟信号控制下工作,上升沿触发。reset信号高有效时电路异步清零。

二、各模块及仿真

1.m序列发生器

由于m序列的特征方程为可知,C3C2C1C0=1011,则使用3级移位寄存器实现,Q[0]与Q[2]异或作为反馈。

代码如下:

module mcode(clk, rst, out);input clk, rst;   //输入端口output out;        //输出端口reg[2:0] Q;        //中间节点wire C0;
assign C0 =  Q[2] ^ Q[0] ;  //反馈
assign out = Q[2];           //输出信号
always@(posedge clk or posedge rst)
beginif(rst )Q[2:0] <= 3'b111;    //异步清零,全1elseQ[2:0] <= {Q[1:0],C0}; //移位
end
endmodule

仿真结果:

由要求可知,M序列的码元速率为4kbps,则所需时钟为4KHz,周期为25000ns,由图可知仿真结果正确,且M序列为1101001的7位码。

2.串并转换电路

串并转换电路原理比较简单,只需要在每个时钟脉冲到来的时候给I和Q的高低位进行赋值,采用计数的方式完成,此处需注意输出I和Q应当在分完一组后再进行输出,不然每个时钟脉冲到来的时候I和Q的数据会变。

代码如下:

module serial_2_parallel(clk, rst, data_in, I, Q);
input   clk;
input   rst;
input   data_in;     //序列输入
output reg[1:0] I;
output reg[1:0] Q;reg [2:0]cnt;//计数
reg[1:0] data_I;
reg[1:0] data_Q;always @(posedge clk or posedge rst)            //时序问题,第一次计数不需要进行分配。
beginif(rst)beginI <= 2'b00;   Q <= 2'b00;cnt <= 3'b000;endelse if(cnt==3'b100)     //4次才可以分完一组I和Q,因此分完才刷新I和Q的数据。beginI <= data_I;Q <= data_Q;cnt <= 3'b001;endelse cnt <= cnt + 1'b1;
endalways @(*)          //串并转换
begincase(cnt)3'b001:   data_I [1]<=data_in;3'b010:   data_Q [1]<=data_in;3'b011:   data_I [0]<=data_in;3'b100:   data_Q [0]<=data_in;default:  begin             data_I=2'b00;data_Q=2'b00;endendcase
endendmodule

此处不单独仿真验证,后面将前三个模块联合仿真。

3.电平映射电路

代码如下:

module mapping (clk ,rst ,data_I ,a);
input clk ,rst;
input [1:0] data_I;
output reg [2:0] a;always@(*)
begincase(data_I)2'b00:    a<=3'b011;2'b01:    a<=3'b001;2'b11:    a<=3'b111;2'b10:    a<=3'b101;default:    a<=3'b000;endcase
endendmodule

仿真结果:

选择前4组M序列作为参考,即

1101001 1101001 1101001 1101001

I:10 01 11 01 00 11 10

Q:10 01 00 11 10 10 01

由上图可知,10为-3、11为-1、01为1、00为3,且串并转换结果正确。

4.载波发生器

载波发生器采用IP核实现,利用matlab对正弦信号进行采样,并生成后缀为mif的文件,将采样数据存入IP中,再利用查表法对IP核中数据进行周期性遍历即可得到正弦载波,余弦波只需改变初始相位即可。后续会出一篇关于DDS信号发生器的文章。

matlab代码:

 clc; %清除命令行命令clear all; %清除工作区变量,释放内存空间F1=1; %信号频率Fs=199; %采样频率P1=0; %信号初始相位N=200; %采样点数t=[0:1/Fs:(N-1)/Fs]; %采样时刻ADC=0; %直流分量A=2^7; %信号幅度%生成正弦信号s=A*sin(2*pi*F1*t + pi*P1/180) + ADC;plot(s); %绘制图形%创建 mif 文件fild = fopen('sin_wave_255x8.mif','wt');%写入 mif 文件,格式不可更改%fprintf(fild, '%s\n','WIDTH=8;'); %位宽fprintf(fild, '%s\n\n','DEPTH=512;'); %深度fprintf(fild, '%s\n','ADDRESS_RADIX=UNS;'); %地址格式fprintf(fild, '%s\n\n','DATA_RADIX=UNS;'); %数据格式fprintf(fild, '%s\t','CONTENT'); %地址fprintf(fild, '%s\n','BEGIN'); %开始for i = 1:Ns0(i) = fix(s(i)); %对小数四舍五入以取整if s0(i) <0 %负数转化为补码s0(i) =  s0(i)+2^8;endfprintf(fild, '\t%g\t',i-1); %地址编码fprintf(fild, '%s\t',':'); %冒号fprintf(fild, '%d',s0(i)); %数据写入fprintf(fild, '%s\n',';'); %分号,换行endfprintf(fild, '%s\n','END;'); %结束fclose(fild);

Verilog代码如下:

module wave(
input wire clk,
input wire rst,
output wire [7:0] sin_wave,
output wire [7:0] cos_wave
);wire [7:0] addr_1;
wire [7:0] addr_2;
reg [31:0]  F_cnt1;
reg [31:0]  F_cnt2;parameter   F_WODR=667733;//频率控制字=clk*10000/(2^24*200)
parameter   P_WODR=50;//相位控制字always@(posedge clk or posedge rst)   //生成正弦波
beginif(rst)F_cnt1 <= 32'd0;else if(F_cnt1[31:24]==8'd199)F_cnt1 <= 32'd0;elseF_cnt1  <= F_cnt1  + F_WODR;    //频率控制字
endalways @(posedge clk or posedge rst)  //生成余弦波
beginif(rst)F_cnt2 <= {P_WODR, 24'd0};else if(F_cnt2[31:24]==8'd199)F_cnt2 <= 32'd0;elseF_cnt2  <= F_cnt2  + F_WODR;   //频率控制
endassign addr_1 = F_cnt1[31:24];
assign addr_2 = F_cnt2[31:24];wave_rom wave_rom_inst(             //调用IP核的数据.address (addr_1),.clock (clk),.q (sin_wave));wave_rom wave_rom_inst2(.address (addr_2),.clock (clk),.q (cos_wave));endmodule

仿真结果:

由图测得正余弦波的周期T=100127ns,则f=1/T≈9987Hz,有点误差,这是由于频率控制字和系统频率不是成整数倍的关系。

5.乘法器

乘法器没什么好说的,注意是带符号的两个数相乘。

代码如下:

module ask(input [7:0] wave,input [2:0] data_in,output [10:0] data_out
);wire sign,sign1;//两个操作数的符号位wire [2:0] abs_a;wire [7:0] abs_I;//a和I的绝对值assign sign=data_in[2];assign sign1=wave[7];wire [10:0] out1;assign abs_a=sign?(~data_in+1):data_in;assign abs_I=sign1?(~wave+1):wave;assign out1=abs_a*abs_I;assign data_out=(sign+sign1)?(~out1+1):out1;endmodule

6.加法器

带符号数的加法器

代码如下:

module add(
input [10:0] Im,
input [10:0] Qm,
output [12:0] Qam
);
wire [11:0] Im_e;//Im扩展后的补码
wire [11:0] Qm_e;//负Qm扩展后的补码
wire [10:0] Qm_p;//负Qm补码assign Qm_p = ~(Qm - 1);
assign Qm_e = {Qm_p[10] , Qm_p};
assign Im_e = {Im[10] , Im};assign Qam = Im_e + Qm_e;endmodule

三、例化仿真验证功能

顶层代码:

module qam(
input clk,
input rst,
output m,
output [2:0] a,
output [2:0] b,
output [7:0] sin_wave,
output [7:0] cos_wave,
output [10:0] Im,
output [10:0] Qm,
output [11:0] Qam
);wire div_clk;
divclk U0(clk,rst,div_clk);wire out;
mcode  U1(div_clk, rst, out);
assign m=out;wire [1:0] I,Q;
serial_2_parallel  U2(div_clk, rst, out, I, Q);wire [2:0] A,B;
mapping  U3(clk, rst, I, A);
mapping  U4(clk, rst, Q, B);
assign a=A;
assign b=B;wave U5(clk, rst, sin_wave, cos_wave);wire [10:0]IM,QM;
ask  U6(sin_wave, A, IM);
ask  U7(cos_wave, B, QM);
assign Im=IM;
assign Qm=QM;add  U8(IM, QM, Qam);endmodule

分频代码:

module divclk(clk,rst,div_clk);
input clk,rst;
output reg div_clk;reg [31:0] counter;always@(posedge rst or posedge clk)//计数时钟分频模块
beginif(rst)begincounter<=32'h00000000;div_clk<=0;endelseif(counter==32'h00001869)// 4KHz计数到6249翻转counter=(clk/div_clk)/2-1begincounter<=32'h00000000;div_clk <= ~div_clk;endelsecounter<=counter + 1;
end
endmodule 

测试代码:

`timescale 1 ns/ 1 ns
module qam_vlg_tst();
reg clk, rst;
wire m;
wire [2:0] a;
wire [2:0] b;
wire [7:0] sin_wave;
wire [7:0] cos_wave;
wire [10:0] Im;
wire [10:0] Qm;
wire [11:0] Qam;qam U(clk, rst, m, a, b, sin_wave, cos_wave, Im, Qm, Qam);initial
beginclk=0;rst=1;#100rst=0;
endalways #10 clk=~clk;
endmodule

仿真结果:


由结果可知,乘法器与加法器也没有问题。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了如何使用FPGA实现数字QAM调制,可见FPGA与通信领域的联系比较紧密。需要工程文件的小伙伴评论区留言~

FPGA实现数字QAM调制系统相关推荐

  1. 【数字信号调制】基于matlab GUI PCM编码和QAM调制系统【含Matlab源码 2080期】

    ⛄一.PCM编码+QAM调制简介 1 PCM 数字信号是对连续变化的模拟信号进行抽样.量化和编码产生的,称为PCM(Pulse Code Modulation),即脉冲编码调制. 脉冲编码调制就是把一 ...

  2. 【计算机网络】物理层 : 调制 ( 数字数据 调制 模拟信号 | 调幅 | 调频 | 调相 | 调幅 + 调相 QAM | 计算示例 | 模拟信号 调制为 模拟信号 )

    文章目录 一. 数字数据调制技术 二. 调幅 三. 调频 四. 调相 五. QAM 调制 和 计算示例 六.模拟信号 调制为 模拟信号 一. 数字数据调制技术 数字数据调制 技术 : ① 调制 : 发 ...

  3. 基于GRNN神经网络的数字预失真系统的FPGA实现

    新型数字预失真系统的顶层主要包括AD模块,数字上变频NCO模块,滤波器模块,DPD模块,数字下变频NCO模块,DA模块,RF功率放大器模块等,系统的整体结构与图3.6相同.其中AD模块,数字上变频NC ...

  4. DVB-C系统中QAM调制与解调仿真

    DVB-C系统中QAM调制与解调仿真_雷霄骅(leixiaohua1020)的专栏-CSDN博客 星座图与IQ调制总结+BPSK.QPSK.8PSK.16QAM等的区别与总结_(๑→ܫ←)-CSDN博 ...

  5. 基于matlab的数字调制,基于MATLAB的多功能数字调制系统信号源仿真

    内容简介: 毕业设计 基于MATLAB的多功能数字调制系统信号源仿真,共60页,27225字 摘要 数字通信与模拟通信系统相比有着灵活性.高效性和保密性等突出特点.数字通信系统仿真对于系统分析起着越来 ...

  6. FPGA多进制数字相位调制( MPSK)

    目  录 摘要 1 Abstract 2 第1章 绪论 3 1.1 设计意义 3 1.2 设计要求 3 第2章 多进制数字相位调制

  7. 无载波幅度和相位调制(CAP)与QAM调制的详细解析(可见光通信应用场景),以及CAP matlab程序下载链接

    文章目录 前言 一.QAM调制? 二.无载波幅度和相位调制(CAP) 三.CAP调制与QAM调制之间的联系(异同点) 四.CAP调制相比于QAM调制的优缺点 4.1.优点 4.2.缺点 五.无载波幅度 ...

  8. 【水声通信】使用Bellohop模型产生水声信道,采用相干检测的方法进行PSK、QAM调制解调【matlab代码】

    源码 https://blog.csdn.net/qq_44394952/article/details/124490764?spm=1001.2014.3001.5502 1.实验目的 (1)学习并 ...

  9. 基于matlab的正交幅度调制系统,基于matlab多进制正交幅度调制系统的仿真终稿.doc...

    基于matlab多进制正交幅度调制系统的仿真终稿 通信系统综合设计与实践 题目基于Matlab的多进制正交幅度调制系统的仿真 院(系)名称信院通信系 专业名称通信工程 学生姓名 学生学号 指导教师 2 ...

  10. 转:数字集群移动通信系统技术体制综述及优选准则

    李 进 良 [摘要]:本文首先按ITU-R报告介绍了数字集群的总目标.业务类型.信道设计和接入技术,并列表比较了7种系统技术体制.为优选适合我国国情且技术先进的体制,提出了性能价格比.标准公开性.技术 ...

最新文章

  1. Dialog 带白色的边的处理方法
  2. 【行业看点】量子通信 量子计算机 量子列车…… 量子的世界究竟多精彩?
  3. 必须熟悉的vim快捷键操作
  4. c++ 多key_详解Zabbix自定义Key监控Rabbitmq(监控特定队列)
  5. 面试官:String的最大长度是多少?
  6. 【个人感悟】效率,天道酬勤
  7. sql server 数据库还原
  8. VS Code的golang开发配置 之 代码提示
  9. CF666B. World Tour
  10. Oracle安全漏洞2016.10报告
  11. 2003系统中证书服务
  12. vscode远程无法更新
  13. 2019武汉大学计算机学院拟录取,武汉大学2019年招收攻读硕士研究生复试成绩拟录取名单...
  14. inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)
  15. linux定时任务的配置详解
  16. uniapp 小程序授权登录时 获取不到用户头像等信息 只能得到灰色缺省头像以及nickname 为“微信用户”等
  17. Python学习之Python入门知识(一)
  18. STM32——新建 Keil MDK 5 工程(寄存器版本)
  19. java面试题Web篇
  20. C#使用Google翻译实现在线翻译

热门文章

  1. ajax获取modelandview,如何使用js获取ModelAndView值
  2. maven配置私服后Cannot download sources, 无法下载源码
  3. 中标麒麟的下载和安装
  4. python代码手机壁纸_python批量下载壁纸的实现代码
  5. BlockUI对话框
  6. [资源帖]ICML2016 下载地址
  7. ActiveMQ系列(四)ActiveMQ核心功能持久化、事务、签收
  8. 计算机专业英语影印版试题,计算机专业英语(2008影印版)复习资料
  9. properties(属性文件)
  10. SitePoint播客#108:Kevin的最后一场演出