目錄
一、設計原理與準備?
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 核時,需特別注意:
- 同步與異步模式:跨時鐘域設計必須使用異步 FIFO
- 深度與寬度權衡:增加深度可提高緩沖能力,但會占用更多 BRAM 資源
- 復位策略:合理設置同步復位或異步復位,確保系統可靠啟動
- 數據對齊:注意數據位寬匹配,避免數據截斷或擴展帶來的精度損失
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 代碼。?
- 相位累加器模塊:根據輸入的時鐘信號和頻率控制字,實現相位的累加功能。代碼如下:
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博客