基于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
英文地址,請注明出處:http://en.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以…