中国企业在线网,温州企业网站seo,包装设计网站欣赏,网站已收录的404页面的查询目录
一、设计原理与准备
1.1 DDS 原理
1.2 IP 核学习与准备#xff1a;FPGA开发中常用IP核——ROM/RAM/FIFO
2、ROM文件的设置
1.3 开发环境搭建
二、DDS 信号发生器设计实现
2.1 系统架构设计
2.2 代码编写与模块实现
三、测试结果与总结
参考文献FPGA开发中常用IP核——ROM/RAM/FIFO
2、ROM文件的设置
1.3 开发环境搭建
二、DDS 信号发生器设计实现
2.1 系统架构设计
2.2 代码编写与模块实现
三、测试结果与总结
参考文献 引言
在电子技术领域信号发生器是不可或缺的工具。直接数字频率合成Direct Digital Frequency SynthesisDDS技术凭借其频率转换速度快、分辨率高、相位连续性好等优势成为信号生成的热门选择。本文将详细介绍基于 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、分布式 RAMROM波形表存储如 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 或 RAMRAM 将在下一节为大家讲解调用的都是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 32d0;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_RADIXHEX;\n);
fprintf(fid, DATA_RADIXHEX;\n\n);
fprintf(fid, CONTENT BEGIN\n);for addr 0:rom_depth-1fprintf(fid, %04X : %02X;\n, addr, sine_data(addr1));
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 Wordoutput [7:0] wave_out // 正弦波输出
);// 相位累加器32位
reg [31:0] phase_accumulator;// 相位累加器更新
always (posedge clk or posedge reset) beginif (reset)phase_accumulator 32d0;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)
);endmoduleTestbench仿真
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 32h0000_0000; // 初始频率控制字#100;reset 0;// 设置fcw生成1kHz正弦波示例值// Fout (50e6 * fcw) / 2^32 → fcw Fout * 2^32 / 50e6fcw 32h00A3D70A; // 对应约1kHz// 仿真运行至少覆盖多个周期#2000000; // 仿真2ms观察2个完整周期$stop;
endendmodule添加仿真文件 然后一直ok到底
仿真效果 三、测试结果与总结
经过仿真和开发板实践测试DDS 信号发生器能够成功生成正弦波和方波信号输出信号的频率范围满足 10Hz5MHz 的要求最小频率分辨率小于 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博客