一、项目需求
本案例完成2005年电赛A题基础部分,设计制作一个正弦信号发生器,要求:
(1)正弦波输出频率范围:1kHz~10MHz;
(2)具有频率设置功能,频率步进:100Hz;
(3)输出信号频率稳定度:优于10-4;
(4)输出电压幅度:在50Ω负载电阻上的电压峰-峰值V opp≥1V;
(5)失真度:用示波器观察时无明显失真。
二、方案论证与比较
方案一:锁相环电路(如图1-1所示)。锁相环主要由鉴相器(PD)、环路滤波器(LPF)、压控振荡器 (VCO)三部分组成,由于锁相环电路中只要输入的基准频率足够的稳定,锁定之后,输出频率就会有较高的稳定度。只要在此基础上再加个数控分频器就可以实现题目中要求的频率设置和频率步进的功能。其原理如下图所示。
图1-1 方案一原理框图
方案二:基于单片机的方式(如图1-2所示)。以单片机为控制中心,通过对专用DDS芯片如AD9852编程,产生所需的正弦信号。该方案简单,易于实现。
图1-2 方案二框图
方案三:单片机与FPGA结合方式(如图1-3所示)。用单片机完成人机交互、系统控制部分,用FPGA完成波形发生及各种调制功能。本方案利用了单片机在软件控制设计方面的通用性和FPGA在逻辑设计上的优势,可以较好的完成系统设计。
图1-3 方案三框图
本设计使用硬禾学堂设计的STM32G032 + ICE40UP5K FPGA核心板+电赛综合训练板套装,采用方案三来完成任务。
三、方案描述
- 数字直接频率合成技术(DDS)
DDS的基本原理是利用采样定理,通过查表法产生波形。DDS的结构有很多种,其基本的电路原理可用图2-1来表示。
图2-1 DDS电路原理框图
采用FPGA实现DDS,可以将要输出的波形数据(如正弦函数表)预先存放在存储单元(如BlockRAM)中,然后在系统标准时钟频率f。下,按照一定的顺序从存储单元中读出波形数据,再进行D/A转换及低通滤波,就可以得到一定频率的输出波形。上述过程可使用HDL硬件描述语言对FPGA编程实现,实现后的原理图如图2-2所示。
图2-2 FPGA实现DDS框图
四、理论分析与计算
- 正弦波频率计算与控制方法
五、程序/逻辑设计
- FPGA部分
FPGA外接高精度12MHz晶振作为时钟输入,通过调用PLL锁相环IP核利用芯片内部锁相环资源对时钟进行5倍频得到60MHz时钟。
通过调用ROM只读存储器IP核,利用芯片内部EBR嵌入存储块存储正弦波形数据构成查找表,存储深度1024即1024个波形点,数据位宽10位,如下图所示。
波形数据文件格式为16进制,可通过MATLAB代码实现生成,代码如下。
使用Verilog HDL语言完成DDS核心模块和SPI_slave模块,综合后的RTL视图如下。其中freq_set为频率控制字步进值,由MCU通过SPI总线与FPGA通信设置,rd_addr_o为频率控制字高10位,送到前面ROM的地址端口读地址。
综合后的顶层RTL视图如下
- MCU部分
使用STM32CubeMX对STM32G031U8X芯片进行配置,采用的是HAL库。将SPI1对应芯片管教进行配置,SPI1的数据长度为8Bits,MSB在前,因为只控制频率控制字步进不需要很高的波特率,波特率配置为250KBit/s,配置图如下:
芯片时钟配置如下:
对于连接其他外围器件的引脚,选择采用编写代码的方式配置,而不用CubeMX配置,例如训练板上的两个与MCU连接的按键配置函数如下:
除了按键以外,还配置了编码器、OLED12864、核心板红色LED等与MCU相连的管脚,此处不再一一展示。
六、完成的逻辑功能及达到的性能
正弦波输出频率范围0Hz~10MHz,具有频率设置功能,频率步进100Hz,示波器观察电压峰-峰值V opp≥1V,波形5MHz以下时无明显失真,5MHz以上时由于FPGA运行在60MHz,一个正弦波周期对应的样点较少,波形会有一定程度失真,可以在板子输出后加上低通滤波器使得波形改善。
七、测试方案及测试结果
- 正弦信号测试
采用普源MSO2302A型号带宽300MHz示波器测试,观察示波器,记录频率值和输出电压峰-峰值如表:
设定频率 |
测量频率 |
相对误差/% |
峰-峰值/V |
100Hz |
100.0Hz |
0 |
2.74 |
500Hz |
500.0Hz |
0 |
2.74 |
1kHz |
1.000kHz |
0 |
2.74 |
5kHz |
5.000kHz |
0 |
2.74 |
10kHz |
10.00kHz |
0 |
2.72 |
50kHz |
50.00kHz |
0 |
2.72 |
100kHz |
100.0kHz |
0 |
2.72 |
500kHz |
500.0kHz |
0 |
2.72 |
1MHz |
1.000MHz |
0 |
2.72 |
5MHz |
5.000MHz |
0 |
2.76 |
10MHz |
10.00MHz |
0 |
3.04 |
八、遇到的主要难题
由于第一次接触莱迪思FPGA,花了一些时间去学习Verilog HDL语言,去学习FPGA开发软件的使用,学习FPGA的主要开发流程。深深体会到了FPGA的强大以及和MCU的完全不同,特别是逻辑上的错误可能导致完全意想不到的结果。
九、未来的计划建议
因为第一次学习使用硬禾学堂FPGA训练板,在此过程中也遇到了许多难题,所幸也一一克服了,也获得了一点小小的成就感。但这次所实现的项目相对比较简单,此后希望尝试完成题目发挥部分,再尝试更复杂的题目,将板子上每一个器件都充分学会并使用。
十、项目图片
十一、项目源代码及可运行代码
源码链接:https://pan.baidu.com/s/14pwS8FgwhHc64A9-c5qP3A 提取码:7wae