FPGA实战:从零构建双通道正弦波发生器(基于AX7A035开发板与AD9767模块)
第一次接触FPGA和高速DA转换时,看着示波器上跳动的正弦波曲线,那种成就感至今难忘。本文将带你完整复现这个魔法时刻——无需任何FPGA基础,只要跟着步骤操作,两小时内就能让AD9767模块输出漂亮的双通道正弦波。我们使用的黑金AX7A035开发板性价比极高,搭配AN9767模块即可实现专业级的信号输出。
1. 硬件准备与环境搭建
1.1 硬件清单检查
在开始前,请确认你已准备好以下硬件:
- 黑金AX7A035开发板(其他Xilinx Artix-7系列开发板也可参考)
- AN9767双通道DA模块(核心芯片为AD9767)
- 双BNC接口示波器探头
- Micro USB数据线(用于FPGA程序下载)
- 5V/2A电源适配器
特别注意:AN9767模块的40针排线连接开发板时,务必确认第一脚(板卡上有白色三角标记)对齐,接反可能烧毁芯片!
1.2 Vivado安装指南
推荐使用Vivado 2018.3版本(兼容性最佳),安装时注意:
# 在Linux下可通过以下命令快速安装 chmod +x Xilinx_Vivado_2018.3_1011_2256.tar.gz ./Xilinx_Vivado_2018.3_1011_2256.tar.gzWindows用户直接运行安装包,勾选以下组件:
- Vivado Design Suite
- Artix-7器件支持
- SDK工具
安装完成后,建议运行以下Tcl命令验证安装:
puts [version] open_hw_manager2. 工程创建与IP核配置
2.1 新建Vivado工程
启动Vivado后,按Ctrl+N创建新工程:
- 选择RTL Project类型
- 添加AX7A035的器件型号:xc7a35tftg256-1
- 创建完成后,右键Sources面板添加Verilog文件
2.2 关键IP核配置
我们需要配置两个核心IP:PLL时钟和ROM存储器。
2.2.1 PLL时钟配置
在IP Catalog中搜索"Clocking Wizard",设置参数:
- 输入时钟:200MHz(差分)
- 输出时钟:125MHz(用于DA转换)
- 复位类型:Active Low
- 锁定信号:Enabled
对应的Verilog实例化代码:
PLL PLL_inst ( .clk_in1_p(sys_clk_p), .clk_in1_n(sys_clk_n), .clk_out1(), .clk_out2(clk_125M), .reset(1'b0), .locked() );2.2.2 ROM存储器配置
使用Block Memory Generator IP:
- 类型:Single Port ROM
- 位宽:14bit(匹配AD9767分辨率)
- 深度:1024(存储一个完整正弦周期)
- 勾选"Load Init File",选择.coe文件
3. 正弦波数据生成与工程实现
3.1 制作.coe波形文件
使用Python生成正弦波数据(比GUI工具更灵活):
import numpy as np points = 1024 bits = 14 amplitude = 2**(bits-1)-1 sine_wave = amplitude * np.sin(np.linspace(0, 2*np.pi, points)) + amplitude np.savetxt('sine.coe', sine_wave.astype(int), fmt='%d', header='memory_initialization_radix=10;\nmemory_initialization_vector=', footer=';', comments='')3.2 主程序设计
完整Verilog代码架构:
module ad9767_test ( input sys_clk_p, sys_clk_n, output da1_clk, da1_wrt, [13:0] da1_data, output da2_clk, da2_wrt, [13:0] da2_data ); reg [9:0] rom_addr; wire [13:0] rom_data; wire clk_125M; always @(negedge clk_125M) begin rom_addr <= rom_addr + 1; // 修改增量可调频率 end assign da1_clk = clk_125M; assign da1_wrt = clk_125M; assign da1_data = rom_data; // 通道2配置相同... endmodule3.3 频率调节技巧
通过修改地址增量调整输出频率:
- +1:122kHz(125MHz/1024)
- +4:488kHz
- +128:15.6MHz
4. 硬件连接与调试
4.1 引脚约束文件
创建.xdc文件时需特别注意差分时钟定义:
create_clock -period 5.000 [get_ports sys_clk_p] set_property PACKAGE_PIN R4 [get_ports sys_clk_p] set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p] # DA1数据线示例 set_property PACKAGE_PIN G21 [get_ports {da1_data[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {da1_data[0]}]4.2 常见问题排查
遇到无输出时,按以下步骤检查:
- 测量AN9767模块供电(±5V)
- 用示波器探头检测CLK信号
- 确认.coe文件已正确加载到ROM
- 检查XDC文件中引脚编号是否与原理图一致
4.3 示波器观测技巧
为获得稳定波形显示:
- 触发模式选择"边沿触发"
- 时基调至50us/div(122kHz时)
- 打开FFT功能观察频谱纯度
当看到示波器上出现完美正弦波时,恭喜你完成了FPGA数字信号处理的第一个里程碑!这个基础框架可扩展为任意波形发生器,只需修改ROM中的预存数据即可输出三角波、方波等复杂波形。