基于FPGA实现数字QAM调制系统

基于FPGA实现数字QAM调制系统

  • 题目要求
  • 一、代码设计
    • 1.顶层
    • 2.分频
    • 3.m序列
    • 4.串转并
    • 5.映射
    • 6.正弦波余弦波生成ROM和
    • 7.ask
  • 二、仿真波形
  • 总结


题目要求

FPGA实现数字QAM调制系统要求根据正交振幅调制原理,利用正弦载波信号发生器,实现调制信号。调制原理会利用到m序列发生器,串并转换及电平映射等。
在这里插入图片描述
参考博客:FPGA的QAM实现

一、代码设计

整体代码框图:
在这里插入图片描述

1.顶层

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/04 09:27:05
// Design Name: 
// Module Name: qam
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////module qam(
input clk,
input rst_n,
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_n,div_clk);wire out;
mcode  U1(div_clk, rst_n, out);
assign m=out;wire [1:0] I,Q;
serial_2_parallel  U2(div_clk, rst_n, out, I, Q);wire [2:0] A,B;
mapping  U3(clk, rst_n, I, A);
mapping  U4(clk, rst_n, Q, B);
assign a=A;
assign b=B;wave U5(clk, rst_n, 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

2.分频

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/04 09:29:55
// Design Name: 
// Module Name: divclk
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////module divclk(clk,rst_n,div_clk);
input clk,rst_n;
output reg div_clk;reg [31:0] counter;always@(negedge rst_n or posedge clk)//计数时钟分频模块
beginif(!rst_n)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 

3.m序列

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/03 20:44:14
// Design Name: 
// Module Name: mcode
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////module mcode(clk, rst_n, out);input clk, rst_n;   //输入端口output out;        //输出端口reg[2:0] Q;        //中间节点wire C0;
assign C0 =  Q[2] ^ Q[0] ;  //反馈
assign out = Q[2];           //输出信号
always@(posedge clk or negedge rst_n)
beginif(!rst_n )Q[2:0] <= 3'b111;    //异步清零,全1elseQ[2:0] <= {Q[1:0],C0}; //移位
end
endmodule

4.串转并

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/03 20:59:35
// Design Name: 
// Module Name: serial_2_parallel
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////module serial_2_parallel(clk, rst_n, data_in, I, Q);
input   clk;
input   rst_n;
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 negedge rst_n)            //时序问题,第一次计数不需要进行分配。
beginif(!rst_n)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

5.映射

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/03 21:15:55
// Design Name: 
// Module Name: mapping
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////module mapping (clk ,rst_n ,data_I ,a);
input clk ,rst_n;
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

6.正弦波余弦波生成ROM和

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/03 22:20:17
// Design Name: 
// Module Name: wave
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////module wave(input clk,//50m Hzinput rst_n,output [7:0] sin_wave,output [7:0] cos_wave);
parameter fre_word = 32'd858993;     //频率控制字     fre_word = f_out * 2^N / fclk   N为累加器位宽
reg [31:0] addr_sin;
wire [7:0] data1;
wire [7:0] data2;
//相位累加器
always @(posedge clk or  negedge rst_n)  
beginif(!rst_n)addr_sin <= 32'b0;elseaddr_sin <= addr_sin + fre_word;
endwire [11:0] addra = addr_sin[31:20];
wire [11:0] addrb = addr_sin[31:20]+1024;
//ROM IP核的调用
sin_rom sin_rom1 (.clka(clk),    // input wire clk	时钟.addra(addra),  // input wire [11 : 0] addra	相位累加器输入给rom的地址.douta(data1)  // output wire [7 : 0] douta	从ROM返回的数据(3M正弦波的采样点)
);sin_rom cos_rom1 (.clka(clk),    // input wire clk	时钟.addra(addrb),  // input wire [11 : 0] addra	相位累加器输入给rom的地址.douta(data2)  // output wire [7 : 0] douta	从ROM返回的数据(3M正弦波的采样点)
);assign sin_wave = data1-128;
assign cos_wave = data2-128;
endmodule

7.ask

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2025/09/04 08:57:12
// Design Name: 
// Module Name: ask
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

二、仿真波形

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

结合文章代码进行复现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921390.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAY 22 复习日

浙大疏锦行复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 导入需要的库 import pandas as pd # 用于数据处理和分析&#xff0c;…

biocmanager安装 库 老是提示网络连接错误 才尝试各种办法

您好&#xff0c;遇到 BioManager &#xff08;通常是 BiocManager&#xff09;安装R包时提示网络连接错误确实非常令人头疼。这通常与R/RStudio的配置、网络环境&#xff08;尤其是国内用户&#xff09;或SSL证书问题有关。 请不要着急&#xff0c;我们可以按照从易到难的顺序…

【开题答辩全过程】以 智能商品数据分析系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

解构复杂财务逆向业务:如何优雅地生成与管理负数单?

文章目录一 核心复杂性二 关键设计模式&#xff1a;三 棘手场景与解决方案&#xff1a;1.分批合并处理&#xff1a;负数单需能智能拆分&#xff0c;精准冲销多批次的正向单据。2.优先级问题&#xff1a;3.超额处理&#xff1a;系统应坚决拦截而非处理&#xff0c;防止资金损失和…

Android集成OpenCV4实例

Android集成OpenCV4分以下几步骤&#xff1a; 使用Android Studio Giraffe | 2022.3.1创建一个Empty Views Activity空项目&#xff0c;包名为&#xff1a;com.example.andopencvdemo00 &#xff0c; 创建成功后&#xff0c;进行以下相关设置&#xff1a; 第一步&#xff1a;在…

npy可视化方法

npviewer 是一个应用程序&#xff0c;它允许您以热图的形式可视化 numpy 的 npy 文件中的数据。该应用程序根据不同的模式自动选择适当的维度进行显示。 根据不同的模式自动选择适当的维度进行显示支持不同格式的 numpy 数据的可视化&#xff0c;如 RGB 和灰度用户友好的界面使…

【Cesium】介绍及基础使用

文章目录一、Cesium 介绍二、 使用1、引入 cesium2、Viewer 配置选项1. 基础控件配置2. 场景与渲染配置3. 地形配置4. 天空与大气效果3、坐标系系统3.1 地理坐标系3.2 笛卡尔空间直角坐标系3.3 屏幕坐标系4、Entity 实体4.1 简介4.2 Entity 常见图形类型Point 点Polyline 线Pol…

基于SpringBoot的运动服装销售系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【嵌入式DIY实例-ESP32篇】-倾斜弹跳球游戏

倾斜弹跳球游戏 文章目录 倾斜弹跳球游戏 1、MPU6050介绍 2、硬件准备与接线 3、代码实现 在这个交互式 ESP32 Arduino 项目中,我们模拟了一个绿色球体在全彩 ST7789 170320 LCD 屏幕上弹跳,完全由 MPU6050 陀螺仪的运动控制。当你倾斜传感器时,球体会呈现出逼真的物理运动,…

从spring MVC角度理解HTTP协议及Request-Response模式

什么是HTTP协议&#xff1f;HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种通信规则&#xff0c;它定义了客户端&#xff08;如浏览器、手机APP&#xff09; 和服务器 之间如何交换信息&#xff0c;是用于在万维网&#xff08;…

江协科技STM32学习笔记补充之003 :STM32复位电路的详细分析

电路作用与每个器件R1&#xff08;10 kΩ&#xff0c;上拉到 3V3&#xff09;让 NRST 在无外力时保持高电平&#xff1d;不复位&#xff1b;同时与电容形成 RC&#xff0c;决定上电复位延时。阻值不能太小&#xff08;否则调试器或芯片复位驱动下拉电流太大&#xff09;&#x…

Spring Boot HTTP状态码详解

Spring Boot HTTP状态码完全指南&#xff1a;从入门到精通 前言 在RESTful API开发中&#xff0c;HTTP状态码是与客户端通信的重要桥梁。Spring Boot通过HttpStatus枚举提供了完整的HTTP状态码支持。本文将深入解析这些状态码的含义、使用场景以及在Spring Boot中的最佳实践。 …

怎样让外网计算机访问局域网计算机?通过公网地址访问不同内网服务的设置方法

局域网服务器提供公网访问&#xff0c;或指定某些端口应用资源给外地访问&#xff0c;都是常见跨网通信需求。在一些场景下&#xff0c;内部网络中的服务器需要通过公网地址进行访问&#xff0c;尤其是在没有固定公网IP或需要在外部访问时。为了解决这一问题&#xff0c;可以使…

Spring Boot启动失败从循环依赖到懒加载配置的深度排查指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

从零开始学大模型之大语言模型

大语言模型 4.1 什么是 LLM 在前三章&#xff0c;我们从 NLP 的定义与主要任务出发&#xff0c;介绍了引发 NLP 领域重大变革的核心思想——注意力机制与 Transformer 架构。随着 Transformer 架构的横空出世&#xff0c;NLP 领域逐步进入预训练-微调范式&#xff0c;以 Tran…

如何将视频从 iPhone 转移到 Mac

将视频从 iPhone 转移到 Mac 是许多用户常见的需求。无论你是想备份重要的视频&#xff0c;还是希望在更大的屏幕上观看&#xff0c;以下方法都能帮助你轻松完成。方法一&#xff1a;使用 iReaShare iPhone ManageriReaShare iPhone Manager 是一款功能强大的工具&#xff0c;可…

五、Docker 核心技术:容器数据持久化之数据卷

Docker 容器本身是无状态且生命周期短暂的。当一个容器被删除时&#xff0c;它在可写层产生的所有数据都会随之消失。这对于需要持久化存储数据的应用 (如数据库、日志系统、用户上传内容) 来说是不可接受的。为了解决这个问题&#xff0c;Docker 提供了多种数据持久化方案&…

前端视觉交互设计全解析:从悬停高亮到多维交互体系(含代码 + 图表)

在前端用户体验领域&#xff0c;视觉交互是连接用户与产品的 “隐形桥梁”—— 它通过可视化信号传递操作意图、反馈系统状态&#xff0c;直接决定用户对产品的感知。很多开发者对视觉交互的认知停留在 “鼠标悬停高亮”&#xff0c;但实际上&#xff0c;视觉交互是一个覆盖 “…

从零打造商业级LLMOps平台:开源项目LMForge详解,助力多模型AI Agent开发!

最近&#xff0c;我发现了一个超级实用的开源项目——LMForge-End-to-End-LLMOps-Platform-for-Multi-Model-Agents&#xff08;以下简称LMForge&#xff09;。这个项目是一个端到端的LLMOps&#xff08;Large Language Model Operations&#xff09;平台&#xff0c;专为多模型…

【C++练习】06.输出100以内的所有素数

目录输出100以内的所有素数方法1&#xff1a;基础判断法方法2&#xff1a;埃拉托斯特尼筛法&#xff08;效率更高&#xff09;方法3&#xff1a;优化版筛法&#xff08;只考虑奇数&#xff09;方法4&#xff1a;使用STL算法方法5&#xff1a;递归实现总结&#xff1a; 输出100以…