ROM 波形 DA 输出控制 FPGA 设计 Verilog Quartus

📅 2026/6/30 1:51:43
ROM 波形 DA 输出控制 FPGA 设计 Verilog Quartus
名称ROM 波形 DA 输出控制 FPGA 设计 Verilog Quartus软件Quartus语言Verilog开发板/平台Cyclone IV FPGA开发板功能介绍本设计实现了基于 FPGA ROM 的波形读取与 DA 输出控制功能使用 Verilog 编写在 Quartus 工程中完成综合、编译与管脚分配。系统通过触摸按键触发输出流程从片内 ROM 中读取预存波形数据并将 8 位数据送至 DA 接口同时输出 DA 驱动时钟与控制方波信号。 工程适合用于学习 FPGA 波形发生、ROM IP 调用、并行 DA 芯片驱动、按键触发控制以及顶层模块集成。顶层模块 ROM_wave_da 将触摸控制、ROM 读数据和 DA 波形发送三个部分连接起来结构直观便于二次修改波形表、调整输出节奏或扩展更多控制方式。 该设计面向 Cyclone IV FPGA 开发板验证场景外部 DA 接口代码注释中标注为 AD9708 驱动时钟与 8 位数据输出适合作为 FPGA 控制 DA 输出激励信号、测试信号或基础波形发生实验的参考工程。运行环境开发语言Verilog。 开发软件Quartus。 目标验证平台Cyclone IV FPGA 开发板。 顶层模块ROM_wave_da。 主要工程文件包含 Quartus 工程配置、管脚分配、时序约束、Verilog RTL 源码以及 ROM IP 相关文件。设计思路系统以 ROM_wave_da 为顶层模块围绕“触摸触发、ROM 存储波形、DA 并行输出”的流程组织逻辑。50MHz 系统时钟作为主时钟输入复位信号用于初始化各功能模块触摸按键经过控制模块处理后产生开始信号 start_en使后级波形发送模块进入数据输出过程。 波形数据预先存放在 ROM 中顶层通过 rd_addr 访问 ROM 地址通过 rd_data 获得对应的 8 位波形采样值。这样可以把波形数据与发送时序分离后续需要更换波形时主要调整 ROM 初始化数据或 ROM IP 配置即可整体控制结构保持清晰。 激励信号模块 da_wave_send 根据开始信号读取 ROM 数据并输出 DA 驱动时钟 da_clk 与 8 位 stimulate 数据面向 AD9708 类并行 DA 接口。touch_ctrl 模块同时输出 ctrl 控制信号代码注释中标明该控制信号为 250kHz 方波、2us 高电平可作为外部电路同步或控制用途。模块结构顶层模块ROM_wave_da负责连接系统时钟、复位、触摸按键、ROM 读端口、DA 输出端口和控制信号输出。 控制模块touch_ctrl用于处理触摸按键输入产生 start_en 开始信号并输出 ctrl 控制方波。 波形发送模块da_wave_send根据 start_en 读取 ROM 数据产生 ROM 地址 rd_addr并输出 da_clk 与 8 位 DA 数据 stimulate。 采集相关模块ad_wave_rec用于工程中的 AD 波形接收相关逻辑参考。 存储模块rom_32、rom_256x8b用于存放波形采样数据工程当前顶层例化 rom_32保留了 rom_256x8b 的替换接口示例。开发板验证工程已结合 Cyclone IV FPGA 开发板进行验证配套管脚分配用于完成系统时钟、复位、触摸按键、DA 时钟、8 位 DA 数据输出以及控制信号等端口映射。开发板运行时可通过触摸按键触发波形输出流程控制信号端输出固定节奏方波DA 数据端按照 ROM 读出的波形数据进行输出适合用于 FPGA 驱动外部 DA 芯片产生激励波形的实验验证。演示视频演示视频展示了工程在开发板上的运行效果可用于查看触摸按键触发、控制信号输出以及 DA 波形数据输出的整体工作过程。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计文档内容覆盖工程文件、程序文件、程序编译、RTL 图、管脚分配、Testbench、整体仿真图、控制信号模块、ROM 模块和激励信号模块等部分。仿真说明可用于理解顶层连接关系、各子模块职责以及 ROM 读数到 DA 输出的时序流程。部分代码以下展示顶层模块ROM_wave_da的部分代码完整代码可关注下方公众号卡片获取。module ROM_wave_da( input sys_clk , //系统时钟50MHz input sys_rst_n , //系统复位低电平有效 input touch_key , //触摸按键 //DA芯片接口 output da_clk , //DA(AD9708)驱动时钟,最大支持125Mhz时钟 output [7:0] stimulate , //输出给DA的数据 output ctrl //控制信号输出--250kHz的方波(2us高电平) ); wire start_en; //wire define wire [4:0] rd_addr; //ROM读地址 wire [7:0] rd_data; //ROM读出的数据 //***************************************************** //** main code //***************************************************** //控制信号模块 touch_ctrl i_touch_ctrl( . sys_clk (sys_clk ), //时钟信号50Mhz . sys_rst_n(sys_rst_n), //复位信号 . touch_key(touch_key), //触摸按键 . ctrl (ctrl) , //输出控制信号方波 . start_en (start_en) //开始信号 ); //ROM存储波形 rom_32 rom_32_inst ( .address ( rd_addr ), .clock ( sys_clk ), .q ( rd_data ) ); //rom_256x8b u_rom( // .address (rd_addr), // .clock (sys_clk), // .q (rd_data) // ); //激励信号模块 da_wave_send u_da_wave_send( .clk (sys_clk), .rst_n (sys_rst_n), .start_en (start_en), .rd_data (rd_data), .rd_address (rd_addr), .da_clk (da_clk), .da_data (stimulate) ); endmodule代码获取下方公众号“FPGA代码设计学习资料”