基于FPGA的16QAM调制器verilog实现,包括testbench,并通过MATLAB显示FPGA输出信号的星座图

1.算法仿真效果

matlab2022a/vivado2019.2仿真结果如下:



将FPGA仿真的数据导出,然后在matlab中将数据通过噪声之后,可以得到如下的星座图效果。



fpga工程版本信息:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Product Version: Vivado v2019.2.1 (64-bit)              -->

<!--                                                         -->

<!-- Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.   -->


<Project Version="7" Minor="44" Path="E:/A_FPGA_proj/project_13/project_13/project_13.xpr">

<DefaultLaunch Dir="$PRUNDIR"/>

<Configuration>

<Option Name="Id" Val="618ebbc110dd42b9abe407c3328144d0"/>

<Option Name="Part" Val="xc7vx485tffg1157-1"/>

<Option Name="CompiledLibDir" Val="$PCACHEDIR/compile_simlib"/>

<Option Name="CompiledLibDirXSim" Val=""/>

<Option Name="CompiledLibDirModelSim" Val="$PCACHEDIR/compile_simlib/modelsim"/>

<Option Name="CompiledLibDirQuesta" Val="$PCACHEDIR/compile_simlib/questa"/>

<Option Name="CompiledLibDirIES" Val="$PCACHEDIR/compile_simlib/ies"/>

<Option Name="CompiledLibDirXcelium" Val="$PCACHEDIR/compile_simlib/xcelium"/>

<Option Name="CompiledLibDirVCS" Val="$PCACHEDIR/compile_simlib/vcs"/>

<Option Name="CompiledLibDirRiviera" Val="$PCACHEDIR/compile_simlib/riviera"/>

<Option Name="CompiledLibDirActivehdl" Val="$PCACHEDIR/compile_simlib/activehdl"/>

<Option Name="BoardPart" Val=""/>

<Option Name="ActiveSimSet" Val="sim_1"/>

<Option Name="DefaultLib" Val="xil_defaultlib"/>

<Option Name="ProjectType" Val="Default"/>

<Option Name="IPOutputRepo" Val="$PCACHEDIR/ip"/>

<Option Name="IPCachePermission" Val="read"/>

<Option Name="IPCachePermission" Val="write"/>

<Option Name="EnableCoreContainer" Val="FALSE"/>

<Option Name="CreateRefXciForCoreContainers" Val="FALSE"/>

<Option Name="IPUserFilesDir" Val="$PIPUSERFILESDIR"/>

<Option Name="IPStaticSourceDir" Val="$PIPUSERFILESDIR/ipstatic"/>

<Option Name="EnableBDX" Val="FALSE"/>

<Option Name="WTXSimLaunchSim" Val="87"/>

<Option Name="WTModelSimLaunchSim" Val="0"/>

<Option Name="WTQuestaLaunchSim" Val="0"/>

<Option Name="WTIesLaunchSim" Val="0"/>

<Option Name="WTVcsLaunchSim" Val="0"/>

<Option Name="WTRivieraLaunchSim" Val="0"/>

<Option Name="WTActivehdlLaunchSim" Val="0"/>

<Option Name="WTXSimExportSim" Val="2"/>

<Option Name="WTModelSimExportSim" Val="2"/>

<Option Name="WTQuestaExportSim" Val="2"/>

<Option Name="WTIesExportSim" Val="2"/>

<Option Name="WTVcsExportSim" Val="2"/>

<Option Name="WTRivieraExportSim" Val="2"/>

<Option Name="WTActivehdlExportSim" Val="2"/>

<Option Name="GenerateIPUpgradeLog" Val="TRUE"/>

<Option Name="XSimRadix" Val="hex"/>

<Option Name="XSimTimeUnit" Val="ns"/>

<Option Name="XSimArrayDisplayLimit" Val="1024"/>

<Option Name="XSimTraceLimit" Val="65536"/>

<Option Name="SimTypes" Val="rtl"/>

<Option Name="SimTypes" Val="bfm"/>

<Option Name="SimTypes" Val="tlm"/>

<Option Name="SimTypes" Val="tlm_dpi"/>

<Option Name="MEMEnableMemoryMapGeneration" Val="TRUE"/>

<Option Name="DcpsUptoDate" Val="TRUE"/>

2.算法涉及理论知识概要

16QAM全称正交幅度调制是英文Quadrature Amplitude Modulation的缩略语简称,意思是正交幅度调制,是一种数字调制方式。产生的方法有正交调幅法和复合相移法。


16QAM是指包含16种符号的QAM调制方式。

16QAM 调制解调原理方框图如右图1:

16QAM 是用两路独立的正交 4ASK 信号叠加而成,4ASK 是用多电平信号去键控载波而得到的信号。它是 2ASK 调制的推广,和 2ASK 相比,这种调制的优点在于信息传输速率高。

正交幅度调制是利用多进制振幅键控(MASK)和正交载波调制相结合产生的。

16 进制的正交振幅调制是一种振幅相位联合键控信号。16QAM 的产生有 2 种方法:

(1)正交调幅法,它是有 2 路正交的四电平振幅键控信号叠加而成;

(2)复合相移法:它是用 2 路独立的四相位移相键控信号叠加而成。

这里采用正交调幅法。

串/并变换器将速率为Rb的二进制码元序列分为两路,速率为Rb/2.2-4电平变换为Rb/2 的二进制码元序列变成速率为RS=Rb/log216 的 4 个电平信号,4 电平信号与正交载波相乘,完成正交调制,两路信号叠加后产生 16QAM信号.在两路速率为Rb/2 的二进制码元序列中,经 2-4 电平变换器输出为 4 电平信号,即M=16.经 4 电平正交幅度调制和叠加后,输出 16 个信号状态,即 16QAM.

RS=Rb/log216=RB/4.

2. 16QAM 解调原理

16QAM 信号采取正交相干解调的方法解调,解调器首先对收到的 16QAM 信号进行正交相干解调,一路与 cos ω c t 相乘,一路与 sin ω c t 相乘。然后经过低通滤波器,低通滤波器 LPF 滤除乘法器产生的高频分量,获得有用信号,低通滤波器LPF 输出经抽样判决可恢复出电平信号。




3.verilog核心程序

`timescale 1ns / 1ns

module TEST;


reg clk;

reg rst;

reg start;

wire [15:0]sin;

wire [15:0]cos;

wire signed[19:0]  I_com;

wire signed[19:0]  Q_com;


// DUT

tops_16QAM_mod  top(

.clk(clk),

.rst(rst),

.start(start),

.sin(sin),

.cos(cos),

.I_com(I_com),

.Q_com(Q_com)

);


initial begin

clk = 0;

rst = 0;

start = 1;

#10;

rst = 1;

end

always #5

clk <= ~clk;

integer fout1;

integer fout2;

initial begin

fout1 = $fopen("II.txt","w");

fout2 = $fopen("QQ.txt","w");

end


always @ (posedge clk)

begin

if(rst==1)

begin

    $fwrite(fout1,"%d\n",I_com);

$fwrite(fout2,"%d\n",Q_com);

end

end


Endmodule

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容