【FPGA學習】DDS信號發生器設計

目錄

一、設計原理與準備?

1.1 DDS 原理?

1.2 IP 核學習與準備?:FPGA開發中常用IP核——ROM/RAM/FIFO

2、ROM文件的設置

1.3 開發環境搭建?

二、DDS 信號發生器設計實現

2.1 系統架構設計?

2.2 代碼編寫與模塊實現?

三、測試結果與總結?

參考文獻:


引言:

在電子技術領域,信號發生器是不可或缺的工具。直接數字頻率合成(Direct Digital Frequency Synthesis,DDS)技術憑借其頻率轉換速度快、分辨率高、相位連續性好等優勢,成為信號生成的熱門選擇。本文將詳細介紹基于 DDS 技術的信號發生器設計過程,實現正弦波和方波的合成,并滿足特定頻率范圍與分辨率要求,同時利用嵌入式邏輯分析儀進行實時測試。

一、設計原理與準備?

1.1 DDS 原理?

DDS 的核心思想是通過數字計算和數模轉換來生成模擬信號。其基本結構包括相位累加器、波形存儲器(ROM)、數字模擬轉換器(DAC)等。相位累加器在時鐘信號的驅動下,不斷進行累加操作,其輸出作為波形存儲器的地址,從波形存儲器中讀取預先存儲的波形數據,再經過 DAC 轉換為模擬信號輸出。通過改變相位累加器的累加步長,就可以實現輸出信號頻率的調整。?

1.2 IP 核學習與準備?:FPGA開發中常用IP核——ROM/RAM/FIFO

常見的 FPGA 存儲器有 3 種:RAM (隨機訪問內存)、ROM (只讀存儲器)、FIFO (先入先出)。這三種存儲器的區別如下:

  • RAM:通常掉電后數據丟失,支持隨機讀寫操作。根據特性可分為:

    • SRAM(靜態隨機存儲器):速度快,無需刷新,但集成度低,常用于高速緩存
    • DRAM(動態隨機存儲器):需周期性刷新,集成度高,用于大容量存儲
    • BRAM(塊隨機存儲器):FPGA 內部專用存儲塊,低延遲、高帶寬
  • ROM:系統斷電后數據不丟失,數據寫入需特定編程方式。在 FPGA 中常見類型:

    • MROM(掩膜只讀存儲器):數據由制造商寫入,不可更改
    • PROM(可編程只讀存儲器):用戶可一次性編程
    • EPROM(可擦除可編程只讀存儲器):通過紫外線擦除重寫
    • EEPROM(電可擦可編程只讀存儲器):支持電信號擦除,常用于配置數據存儲
  • FIFO:數據遵循先入先出原則,地址由內部指針自動管理。關鍵參數:

    • 滿標志 (Full):指示 FIFO 已寫滿
    • 空標志 (Empty):指示 FIFO 已讀空
    • 可編程滿 / 空閾值:支持自定義觸發條件
    • 同步 / 異步時鐘域:分同步 FIFO(單時鐘域)和異步 FIFO(跨時鐘域)

應用場合對比

存儲器類型典型應用場景關鍵優勢FPGA 實現方式
RAM數據緩存、圖像處理幀緩沖、高速數據暫存隨機讀寫、高速訪問BRAM、分布式 RAM
ROM波形表存儲(如 DDS)、配置參數存儲、查找表 (LUT)非易失性、數據穩定初始化 BRAM、專用 ROM IP 核
FIFO跨時鐘域數據傳輸、數據流速率匹配、突發數據緩沖自動地址管理、同步隔離專用 FIFO IP 核

在 DDS 設計中:

  • ROM:用于存儲預計算的正弦 / 方波波形數據,需配置為同步讀模式
  • FIFO:可用于緩存 DAC 輸出數據,解決時鐘域不匹配問題
  • RAM:可擴展用于存儲多組波形參數,支持動態切換波形類型

在調用 IP 核時,需特別注意:

  1. 同步與異步模式:跨時鐘域設計必須使用異步 FIFO
  2. 深度與寬度權衡:增加深度可提高緩沖能力,但會占用更多 BRAM 資源
  3. 復位策略:合理設置同步復位或異步復位,確保系統可靠啟動
  4. 數據對齊:注意數據位寬匹配,避免數據截斷或擴展帶來的精度損失

1、ROM簡介
? ROM 是只讀存儲器(Read-Only Memory)的簡稱,是一種只能讀出事先所存數據的固態半導體存儲器。其特性是一旦儲存資料就無法再將之改變或刪除,且資料不會因為電源關閉而消失。而事 實上在 FPGA 中通過 IP 核生成的 ROM 或 RAM(RAM 將在下一節為大家講解)調用的都是FPGA 內部的 RAM 資源,掉電內容都會丟失(這也很容易解釋,FPGA 芯片內部本來就沒有掉電非易失存儲器單元)。用 IP 核生成的 ROM 模塊只是提前添加了數據文件(.coe 格式)(.mif/.hex格式),在 FPGA 運行時通過數據文件給 ROM 模塊初始化,才使得 ROM 模塊像個“真正”的掉電非易失存儲器;也正是這個原因,ROM 模塊的內容必須提前在數據文件中寫死,無法在電路中修改。

最簡單的使用有效時鐘CLKA、有效地址ADDRA和有效使能EA,就可以輸出DOUTA

單端口ROM:只提供一個獨立的地址端口核一個讀數據端口

2、ROM文件的設置

1.3 開發環境搭建?

本次設計基于 DE2-115 開發板,開發環境選用 Quartus Prime 等 FPGA 開發工具。在開始設計之前,確保開發環境已經正確安裝和配置,熟悉開發工具的基本操作流程,包括工程創建、IP 核調用、代碼編寫、編譯綜合、下載調試等環節,為后續的設計實現奠定基礎。

二、DDS 信號發生器設計實現

2.1 系統架構設計?

根據設計要求,DDS 信號發生器系統主要由相位累加器模塊、波形存儲器模塊、頻率控制字輸入模塊、波形轉換模塊(用于生成正弦波和方波)以及嵌入式邏輯分析儀模塊組成。相位累加器模塊根據輸入的頻率控制字,在時鐘信號的驅動下進行相位累加;波形存儲器模塊存儲正弦波和方波的數字化波形數據;頻率控制字輸入模塊接收用戶設置的頻率參數,生成相應的頻率控制字;波形轉換模塊根據相位累加器的輸出,從波形存儲器中讀取數據,并進行相應的處理,生成正弦波和方波信號;嵌入式邏輯分析儀模塊用于實時采集和分析輸出波形的離散數據。?

2.2 代碼編寫與模塊實現?

在 Quartus Prime 中創建工程,按照系統架構設計,分別編寫各個模塊的 Verilog HDL 代碼。?

  1. 相位累加器模塊:根據輸入的時鐘信號和頻率控制字,實現相位的累加功能。代碼如下:
module phase_accumulator(input wire clk,input wire rst_n,input wire [31:0] freq_control_word,output reg [31:0] phase_accumulator_output
);
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginphase_accumulator_output <= 32'd0;end else beginphase_accumulator_output <= phase_accumulator_output + freq_control_word;end
end
endmodule

2.DDS技術合成正弦波和方波
? 利用DDS技術合成正弦波和方波,很多EDA軟件都需要.mif文件,比如使用Quartus 調用ROM IP核產生一個正弦波就需要對ROM IP核加載.mif文件,然后從.mif文件中讀取數據產生正弦波

正弦波
1)利用matlab生成ROM初始化文件mif

% 參數設置
addr_width = 10;       % ROM地址位寬(1024點)
data_width = 8;        % 數據位寬(8位)
filename = 'sine_wave.mif'; % 輸出文件名% 生成正弦波數據
rom_depth = 2^addr_width;
t = linspace(0, 2*pi, rom_depth); % 0到2π的相位
sine_data = sin(t);               % 生成正弦波(范圍[-1, 1])% 量化到8位無符號整數(0~255)
sine_data = round((sine_data + 1) * (2^(data_width-1) - 1));% 寫入mif文件
fid = fopen(filename, 'w');
fprintf(fid, 'WIDTH=%d;\n', data_width);
fprintf(fid, 'DEPTH=%d;\n', rom_depth);
fprintf(fid, 'ADDRESS_RADIX=HEX;\n');
fprintf(fid, 'DATA_RADIX=HEX;\n\n');
fprintf(fid, 'CONTENT BEGIN\n');for addr = 0:rom_depth-1fprintf(fid, '  %04X : %02X;\n', addr, sine_data(addr+1));
endfprintf(fid, 'END;\n');
fclose(fid);
disp('mif文件生成成功!');

在運行完上面一段代碼后也就在同一文件夾下生成了一個sine_wave.mif文件如下圖所示

設置模塊LPM_ROM參數的具體步驟如下:

1)在QuartusPrime主界面選擇Tool一IPCatalog命令,在查找框內輸入ROM,IP核目錄(IPCatalog)欄
中會列出相關的IP核,選擇ROM:1-PORT并雙擊,彈出保存IP設置界面,輸入文件名,并選中Verilog,單擊OK按鈕。

3).輸入mif文件中寬度和深度,要匹配上(8、1024)

4).全不選擇即可,next

DDS模塊設計

module dds_sine_wave (input clk,         // 系統時鐘input reset,       // 復位input [31:0] fcw,  // 頻率控制字(Frequency Control Word)output [7:0] wave_out // 正弦波輸出
);// 相位累加器(32位)
reg [31:0] phase_accumulator;// 相位累加器更新
always @(posedge clk or posedge reset) beginif (reset)phase_accumulator <= 32'd0;elsephase_accumulator <= phase_accumulator + fcw;
end// 取高10位作為ROM地址(相位截斷)
wire [9:0] rom_address = phase_accumulator[31:22];// 實例化ROM
rom_sine_wave rom_inst (.address(rom_address),.clock(clk),.q(wave_out)
);endmodule

?Testbench仿真

`timescale 1ns/1nsmodule tb_dds_sine_wave;// 輸入信號
reg clk;
reg reset;
reg [31:0] fcw;// 輸出信號
wire [7:0] wave_out;// 例化DDS模塊
dds_sine_wave uut (.clk(clk),.reset(reset),.fcw(fcw),.wave_out(wave_out)
);// 時鐘生成(50MHz)
initial beginclk = 0;forever #10 clk = ~clk; // 20ns周期 → 50MHz
end// 仿真流程
initial begin// 初始化reset = 1;fcw = 32'h0000_0000; // 初始頻率控制字#100;reset = 0;// 設置fcw生成1kHz正弦波(示例值)// Fout = (50e6 * fcw) / 2^32 → fcw = Fout * 2^32 / 50e6fcw = 32'h00A3D70A; // 對應約1kHz// 仿真運行(至少覆蓋多個周期)#2000000; // 仿真2ms(觀察2個完整周期)$stop;
endendmodule

添加仿真文件:

?

然后一直ok到底

仿真效果

三、測試結果與總結?

經過仿真和開發板實踐測試,DDS 信號發生器能夠成功生成正弦波和方波信號,輸出信號的頻率范圍滿足 10Hz~5MHz 的要求,最小頻率分辨率小于 1kHz。通過嵌入式邏輯分析儀采集到的離散數據,也與設計預期相符,證明了設計的有效性和準確性。?

在設計過程中,深入學習了 DDS 技術的原理和 IP 核的使用方法,掌握了 FPGA 開發的全流程。同時,也遇到了一些問題,如 IP 核參數設置不合理導致波形失真、代碼邏輯錯誤等,通過查閱資料和調試解決了這些問題。本次設計為進一步深入研究 DDS 技術和 FPGA 應用奠定了堅實的基礎,后續可以在此基礎上進行功能擴展,如增加更多類型的波形生成、提高頻率分辨率等。?

以上分享了 DDS 信號發生器的設計過程。如有不妥之處還望各位海涵。祝好!

參考文獻:

用FPGA實現dds的方案詳解(保姆級入門教學)(VIVADO18.3、quartus13.1)_fpga開發_Jefferymeng-2048 AI社區

FPGA中級項目1——IP核(ROM 與 RAM)

【FIFO IP系列】FIFO IP參數配置與使用示例

【FPGA基礎學習】DDS信號發生器設計-CSDN博客

DDS信號發生器原理與經典DDS信號發生器設計方案-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pyqt 簡單條碼系統

生產數據管理系統說明 系統概述 這是一個基于PyQt5和pyodbc開發的生產數據管理系統&#xff0c;主要用于管理生產過程中的物料綁定和查詢操作。系統提供了上料綁定和下料查詢功能&#xff0c;支持與SQL Server數據庫交互&#xff0c;實現數據的插入、查詢、更新和刪除操作。界…

【unitrix】 4.1 類型級加一操作(Add1.rs)

一、原碼 這段代碼實現了一個類型級的加一操作(Add1 trait)&#xff0c;用于在Rust的類型系統中進行數值加一運算。 //! 加一操作特質實現 / Increment operation trait implementation //! //! 說明&#xff1a; //! 1. Z0、P1,、N1 1&#xff0c;常規計算 //! 2. …

git工作中常用

1.管理本地文件 git init//初始化生成一個本地倉庫 git add * //添加到暫存區 git commit–m “message” //提交到本地倉庫 2.刪除本地分支 git branch -d local_branch_name3.隱藏及解除隱藏 git stashgit stash pop4.遠程新建分支&#xff0c;在本地簽出時候怎么看到 …

Golang 中接口嵌套的詳細說明和使用示例

在 Go 語言中&#xff0c;接口嵌套&#xff08;也稱為接口組合&#xff09;是一種強大的特性&#xff0c;它允許你通過組合現有接口來創建新的接口。這種方式遵循了 Go 的組合優于繼承的設計哲學。 接口嵌套的基本概念 接口嵌套是指在一個接口中嵌入其他接口&#xff0c;從而…

數智管理學(二十四)

第二章 數智化重塑管理的核心 第三節 動態資源配置與實時優化 在當今數智化浪潮的席卷下&#xff0c;企業管理面臨著前所未有的變革與挑戰。資源配置作為企業管理的核心環節之一&#xff0c;其方式和效率直接影響著企業的運營成本、生產效率和市場競爭力。傳統的靜態資源配置…

Redis 各版本差異及性能測試指標對比

Redis 各版本差異及性能測試指標對比 Redis 主要版本差異 Redis 2.x 系列 主要特性&#xff1a; 支持主從復制支持簡單的持久化(RDB和AOF)發布/訂閱功能事務支持 局限性&#xff1a; 單線程模型集群功能有限 Redis 3.x 系列 重大改進&#xff1a; 引入Redis Cluster(官方…

Python圖形化秒表:使用Turtle打造精確計時工具

?? 編程基礎第一期《6-30》–簡易計時器/秒表&#xff0c;這是一個使用Python的turtle和time模塊實現的簡易計時器/秒表程序&#xff0c;提供簡潔的數字時間顯示。 目錄 &#x1f31f; 功能特點&#x1f680; 使用方法&#x1f9e9; 程序架構設計&#x1f4bb; 代碼詳解窗口和…

【軌物方案】軌物科技|LoRaWAN 賦能智能光伏清掃,解鎖電站高效運維新時代

在大型集中式光伏電站的廣袤土地上&#xff0c;清掃機器人的高效運行是保障發電效率的關鍵。然而&#xff0c;傳統的無線通信方式在這些偏遠、無4G/5G信號覆蓋的區域&#xff0c;往往步履維艱。作為專注于工業物聯網解決方案的軌物科技&#xff0c;我們深知這些痛點&#xff0c…

Python函數實戰:從基礎到高級應用

Python-函數 Python 中可以使用def關鍵字來定義函數。 函數定義規則&#xff1a; 函數代碼塊以 def 關鍵詞開頭&#xff0c;后接函數標識符名稱和圓括號 ()。任何傳入參數和自變量必須放在圓括號中間&#xff0c;圓括號之間可以用于定義參數。函數的第一行語句可以選擇性地使…

Mac在局域網中突然很慢(包括SMB、NFS、SCP、SSH、Ping等場景均很慢)

今天 SMB 又突然好慢&#xff0c;大概只有 8-9 MB/s&#xff0c;而蘋果 SMB 很容易突然很慢是出了名的。我就想裝 NFS&#xff0c;但是 NFS 弄好之后還是很慢&#xff0c;我服了&#xff0c;我就檢查了scp等場景&#xff0c;都很慢&#xff0c;但是互聯網下載速度還是很快的。 …

UMAP:用于降維的均勻流形近似和投影實驗

關鍵詞&#xff1a; Uniform Manifold Approximation and Projection (UMAP)&#xff1a;均勻流形近似與投影 一、說明 對于降維&#xff0c;首先看數據集是否線性&#xff0c;如果是線性的用pca降維&#xff1b;如果是非線性數據&#xff0c;t-SNE或者UMAP&#xff0c;本文針…

【Datawhale組隊學習202506】YOLO-Master task03 IOU總結

系列文章目錄 task01 導學課程 task02 YOLO系列發展線 文章目錄 系列文章目錄前言1 功能分塊1.1 骨干網絡 Backbone1.2 頸部網絡 Neck1.3 頭部網絡 Head1.3.1 邊界框回歸頭1.3.2 分類頭 2 關鍵概念3 典型算法3.1 NMS3.2 IoU 總結 前言 Datawhale是一個專注于AI與數據科學的開…

Spring IOC容器核心揭秘:BeanFactory創建、配置加載解析并注冊為BeanDefinition

文章目錄 一、為何這個階段如此重要&#xff1f;二、整體流程全景圖三、源碼級深度解析1. BeanFactory的誕生源碼入口&#xff1a;refresh()方法核心方法&#xff1a;obtainFreshBeanFactory()核心實現&#xff1a;refreshBeanFactory()BeanFactory實例化 2. ★ 核心&#xff1…

解鎖n8n:開啟工作流自動化的無限可能(5/6)

文章摘要&#xff1a;n8n 是一款開源低代碼工作流自動化平臺&#xff0c;通過可視化拖放節點創建復雜工作流&#xff0c;無需大量代碼。具有強大集成能力、數據轉換、錯誤處理等功能&#xff0c;適用于數據同步、客戶關系管理、IT 自動化等場景。相比 Zapier、IFTTT 等工具&…

數據賦能(308)——合作共享——數據交流

概述 重要性如下&#xff1a; 信息準確性&#xff1a;數據交流原則確保在數據傳遞過程中信息的準確性&#xff0c;這是決策和業務活動的基礎。決策支持&#xff1a;準確的數據交流為決策提供有力支持&#xff0c;幫助組織做出更明智的決策。業務效率&#xff1a;有效的數據交…

TCP流量控制與擁塞控制:核心機制與區別

一、TCP流量控制&#xff08;Flow Control&#xff09; 定義&#xff1a;通過調節發送方的發送速率&#xff0c;確保接收方能夠及時處理數據&#xff0c;避免緩沖區溢出。 本質&#xff1a;解決發送方與接收方之間的"端到端"速率匹配問題。 1. 實現機制&#xff1a…

iOS多端兼容性調試:一次iOS性能優化分工具協作排查過程

在多技術棧混合開發日益普及的今天&#xff0c;iOS應用中越來越多地集成了WebView、Flutter、React Native甚至小程序模塊。而這些模塊帶來的復雜性&#xff0c;不僅體現在UI適配&#xff0c;還包括數據同步、系統權限管理、線程調度等方面的問題。 本文記錄的是我們在處理一個…

秋招Day14 - MySQL - 索引

索引為什么能夠提高MySQL的查詢效率&#xff1f; 索引可以理解為目錄&#xff0c;通過索引可以快速定位數據&#xff0c;避免全表掃描 一般是B樹結構&#xff0c;查找效率是O(log n)。 索引還能加速排序、分組、連接等操作。 create index idx_name on students(name); 能簡…

第5天:LSTM預測火災溫度

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 目標 復用LSTM模型實現火災溫度預測 具體實現 &#xff08;一&#xff09;環境 語言環境&#xff1a;Python 3.10 編 譯 器: PyCharm 框 架: Pytorch &am…

目標檢測之YOLOV11自定義數據使用OBB訓練與驗證

一、前置條件與環境準備 在開始訓練前&#xff0c;確保已完成以下準備《目標檢測之YOLOV11自定義數據預處理——從原始標注到YOLO-OBB格式轉換與驗證》&#xff1a; 數據目錄結構&#xff1a; yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …