下冰雹 · 2 天前

基于 FPGA 的任意波形发生器+低通滤波器系统设计

第一部分 设计概述 /Design Introduction

1.1 设计目的

本次设计包括基于 FPGA 的任意波形发生器设计实现和基于 FPGA 的低通滤波器设计实现。

波形发生器是一种常见的信号源,能够产生多种标准信号和用户定义信号,并保证较高精度和较高稳定性,广泛地应用于电子电路、自动控制系统和数字实验等,诸如电话、电视、收音机、高校通信系统实验等领域都需要用到波形发生器。本次设计基于 Verilog HDL 语言使用 Artix-7 系列芯片在 EGO1 开发板上实现一个简易的任意波形发生器。该波形发生器能够产生正弦波、方波、三角波与锯齿波四种波形,可输出频率有:1MHz、100KHz、10KHz、1KHz、100Hz、10Hz、1Hz。波形类型选择控制字与频率设置控制字通过串口输入。

低通滤波可以简单的认为:设定一个频率点,当信号频率高于这个频率时不能通过,在数字信号中,这个频率点也就是截止频率,当频域高于这个截止频率时,则全部赋值为 0。因为在这一处理过程中,让低频信号全部通过,所以称为低通滤波。低通过滤的概念存在于各种不同的领域,诸如电子电路,数据平滑,声学阻挡,图像模糊等领域经常会用到。在数字图像处理领域,从频域看,低通滤波可以对图像进行平滑去噪处理。

本次设计将用两种方式实现低通滤波器。

方法一:利用 Vivado 自身具备的 DDS 和 FIR 的 IP 核实现;

方法二:通过 Verilog 编程实现 FIR 的功能。

1.2 作品展示

image.png

图 1  UART 串口实现

图片

图 2 波形发生器仿真

图片

图 3 低通滤波器仿真

第二部分 系统组成及功能说明 /System Construction & Function Description

2.1 系统概述

任意波形发生器:计划产生正弦波、方波、三角波与锯齿波四种波形,可输出频率有:1MHz、100KHz、10KHz、1KHz、100Hz、10Hz、1Hz,利用 URAT 串口与串口调试助手相连进行控制字数据传输。已经完成全部功能,由于没有示波器,实物调试部分不完整。

低通滤波器:本次设计将用两种方式实现低通滤波器。

方法一:利用 Vivado 自身具备的 DDS 和 FIR 的 IP 核实现;

方法二:通过 Verilog 编程实现 FIR 的功能。

方法一使用 Vivado 的 DDS IP 核生成两个正弦信号,频率分别为 4MHz 和 5MHz。同时调用乘法器 IP 将两个信号进行混频处理,乘法器将混频信号交给 FIR IP 核进行过滤处理。使用 Matlab 进行滤波器的参数设计,这里使用窗函数法设计 FIR 滤波器。窗函数法设计滤波器的基本思想是:选择一种合适的理想频率选择性滤波器,然后将它的冲激响应截短以获得一个具有线性相位和因果的 FIR 滤波器,因此这种方法的关键是选区某种较好的窗函数,在滤波器性能给定的情况下,尽量选择主瓣窄,旁瓣峰值小的窗函数。设置好以后将 FIR 滤波器系数导出,将生成好 coe 文件导入 Vivado 中 FIR IP 核中。撰写 TestBench 文件进行波形仿真。

方法二利用 DDS 生成一个由三个正弦波叠加的待滤波信号,两个正弦波的频率分别是 200Hz、800Hz。用 MATLAB 产生频率为 500Hz 的低通滤波器抽头系数,然后将待滤波信号送入 Vivado,用 Verilog 编写的 FIR 滤波器进行仿真,观察滤波后的波形。

2.2 项目系统框图

任意波形发生器:

图片

图 4 任意波形发生器系统框图

图片

图 5 串口模块设计框图

图片

图 6 DDS 原理框图

低通滤波器:

图片

图 7 低通滤波器设计框图

图片

图 8 低通滤波器原理框图

2.3 技术说明

(1)任意波形发生器

本次设计使用到的是 UART 串口通信,主要用来接收串口数据发送的数据,字节传输形式:1-0-x-x-x-x-x-x-x-x-0-1,检测到下降沿即-1-0-(起始标志)后开始进行接收字节,将接收到的一一存入寄存器中,8 个 bit 后结束接收,就是简单的 1 个字节的接收。其协议发送原理:

图片

图 9 UART 数据帧格式

根据 URAT 串口的数据帧格式,起始位为 0,所以我们需要用一个下降沿检测模块,来判断起始位,然后开始准备接收串口数据。

然后使用一个计数器模块,在 1Bit 数据传输的时间找到最佳时间来输出读取串口数据。在串口通信中波特率表示每秒能传输的数据位,9600 就是每秒能传输 9600 位,1word=2byte、1byte=8bit,这里的 9600 位指的是 9600bit。每个开发板上都有它的系统时钟,本次设计用的是 EGO1 开发板,系统时钟是 100MHZ,我们假定波特率是 9600bit/s 传输,那么传输 1bit 就需要 100M/9600 个时钟周期。那么在本次设计中传输 1bit 所需的计数值为 10416,将采集数据的时刻放在波特率计数器每次循环技术的中间位置,即 5208。

利用一个控制器模块,在下降沿检验通过后的信号与计数器模块输出的读数据时间信号控制下,依次将 8 位数据放入寄存器之中,然后利用 case 语句,经过停止位数据后停止数据接收。

最后在串口的总模块中对上述三个模块进行例化,将对应输入输出相连。

下面根据下图所示的 DDS 技术原理框图,当一个参考时钟过来 传输一个频率控制字进入累加器在累加器中加入上一个参考时钟的数据,相加后进去寄存器,然后寄存器的输出便是正弦查表的地址,通过这个数据在波形存储区查表,再通过 D/A 转换器和低通滤波器输出。结合项目功能要求实际分模块实现任意波形发生器。

波形类型控制字与频率设置控制字是分别拿串口助手输入的有效数据位的[7:6]与[5:2]位,我们注意到,串口传输过程是从低字节开始传输的,也就是说我们在串口助手中发送的有效数据为 11010011,接收到的数据为 11001011,所以需要将接收到的数据倒序然后给到两个控制字的寄存器。

图片

图 10 DDS 直接数字频率合成技术原理

首先我们利用 MATLAB 新建脚本(.m 文件),键入相应的程序,产生了存放有位宽为 8,位深为 256 的四种波形数据的 COE 文件。然后在 Vivado 中利用 IP catalog 中的 Block Memory Generator 核。分别新建四个 Block Memory Generator 核,设置 Basic 栏中的 Memory Type 为 Single Port ROM,Port A Options 栏中的位宽为 8,位深为 256,最后在 Other Options 中,选择加载本地文件选中 MATLAB 已经生成的正弦波、方波、锯齿波、三角波的 COE 数据文件,分别将它们放入了不同的 Rom 中,我们就可以通过 Vivado 进行编程,在时钟的驱动下,根据地址去读取 Rom 中的数据然后输出,即可产生波形数据。

我们拿到 URAT 串口接收的频率控制字后,利用 case 语句,根据不同的输入,输出不同的频率控制字,关于频率控制字的计算,首先系统的时钟为 100MHz,相位累加器为 32 位,232 等于 4294967296,想要输出频率为 1kHz 的信号为例,通过以下的计算公式,得到 K 约等于 42950。

图片

然后在相位累加器中以频率控制字为步长进行周期的加法运算,再将相位累加器的每个值的高位作为地址去读 Rom 的数据。这里输出的为 8 位的 DAC 数据,所以用相位累加器的高八位作为 Rom 的地址输入。

(2)低通滤波器

低通滤波器实现:

方法一:利用 Vivado 自身具备的 DDS 和 FIR 的 IP 核实现

在 Vivado 中新建工程,创建 Block Design,用 DDS IP 核生成两个正弦波信号,如图 11 所示。

图片

图 11 DDS IP 核

将 DDS 的参数设置为图 12 所示。

图片

图 12 DDS 参数设置

(2)调用乘法器,将两个正弦波信号进行混频处理,乘法器设置如下图 13

图片

图 13 乘法器 IP 核参数设置

(3)调用 FIR IP 核,对其参数进行设置。利用 Matlab 对滤波器的参数进行设置。在 matlab 窗口输入 fdatool,在弹出的窗口中,在 Response Type(滤波器响应类型)一栏中选择 Lowpass(低通),Desgned Method(实现方法)选择 Window(窗函数实现),即基于窗函数法设计 FIR 滤波器,我们在 Options 中选择 Hamming 窗,Filter Order 中选择 Special Order,滤波器阶数选择 128(阶数越高,滤波效果越好,占用的芯片资源会更多些)Frequency  Specializations 中单位 Units 选择 MHz,采样频率 Fs 选择 100MHz(根据奈奎斯特低通信号采样定理,采样频率至少高于信号的 2 倍,实际工程上一般得高于低通信号频率的 5-10 倍,如果信号频率过高的话,实际的 AD 采样频率核精度无法达到,所以工程上一般把低通信号经调制后搬到频率很高的载波上,再下变频到中频上用带通采样定理进行 AD 采样),之前提到采样频率高于信号频率的 5-10 倍就可以,因为我们这里 FIR 滤波器时钟是和板卡时钟连接在一起的,没有编写时钟分频模块,所以这里采样频率直接设置为 100MHz(一个周期点数为 100MHz/2MHz=50,板卡资源会浪费一些,但是不影响),截止频率 Fc 设为 2MHz(1MHz 的正弦波通过,9MHz 的被滤除),点击 View 和 Design Filter 按钮,设计的滤波器时域和频域波形(Time Domain and Frequency domain)以及幅相响应(Magnitude and Phase Response),最后生成 coe 文件,加载到 FIR IP 核中。具体设置如下图。

图片

图 14 滤波器参数设置

(4)将各 IP 核之间进行连线,生成顶层模块。如图 15。

图片

图 15 各 IP 核连线图

方法二:通过 Verilog 编程实现 FIR 的功能。具体设计流程如图 16。

图片

图 16 设计流程图

(1)利用 DDS 生成一个由三个正弦波叠加的待滤波信号,两个正弦波的频率分别是 200Hz、800Hz。

(2)用 MATLAB 产生频率为 500Hz 的低通滤波器抽头系数,

(3)Vivado 进行 FIR 的 verilog 设计。FIR 的代码实现流程如下图 7 所示。

图片

图 17 FIR verilog 设计框图

第一级流水线的功能是将输入信号进行延时,每到来一个时钟信号,便将输入信号保存到 delay_pipelin1 中,然后将剩下的依次移动一位。

第二级流水线的功能是将输入经过延时的信号和滤波器系数相乘,每到来一个时钟便将一个新的乘积结果更新到 multi_data 中。

累加积乘的主要功能是将乘积累加,累加的结果就是滤波后的信号。

(4)仿真测试,创建 TestBench 文件进行仿真测试。

第三部分 完成情况及性能参数 /Final Design & Performance Parameters

任意波形发生器

已实现功能:产生正弦波、方波、三角波与锯齿波四种波形,可输出频率有:1MHz、100KHz、10KHz、1KHz、100Hz、10Hz、1Hz;利用 URAT 串口与串口调试助手相连进行控制字数据传输。由于没有示波器,实物调试部分不完整。

a.串口模块仿真分析:在 Testbench 中依次给串口数据(data_rx)为 10 11010011 011。

图片

图 18  URAT 串口仿真波形

如上图所示,FPGA 接收到的数据为 11001011,根据仿真结果,URAT 串口测试成功。

b.任意波形发生模块仿真分析:

图片

图 19 波形发生模块仿真 1

图片

图 20 波形发生模块仿真 2

如上图所示,在仿真中分别给波形类型控制字为 0、1、2、3,对应频率设置控制字为 5、6、3、2。分别产生了频率为 10kHz 的正弦波、100kHz 的三角波、100Hz 的三角波、10Hz 的锯齿波。其中 100kHz 的三角波为方波,询问老师后确定是系统显示问题,其波形数据图     所示。根据分析知波形发生器仿真测试成功。

c.系统仿真测试与分析

最后通过顶层模块,例化 DDS 模块与 UART 模块,将相应输入输出连接起来,编写仿真激励文件,给串口助手发送值,验证波形输出。

图片

图 21 系统仿真测试 1

图片

图 22 系统仿真测试 2

图片

图 23 系统仿真测试 3

图片

图 24   系统仿真测试 4

如上所示,根据仿真波形可知,当仿真输入 1011010011011,FPGA 收到 11001011,类型控制字 11(3),频率设置控制字 0100 (4),输出周期为 1ms(即频率为 1KHz)的 锯齿波;

当仿真输入 1000011111011,FPGA 收到 11111000,类型控制字 00(0), 频率设置控制字 0111(7),输出周期为 1000ns 频率 (即频率为 1MHz )的正弦波;

当仿真输入 1001010111011,FPGA 收到 11101010,类型控制字 01(1),频率设置控制字 0101(5),输出周期为 100us( 即频率为 10KHz)的方波  ;

当仿真输入 1010011011011,FPGA 收到 11011001,类型控制字 10(2),频率设置控制字 0110(6),输出周期为 10us(即频率为 100KHz)的三角波。

根据分析可知,系统仿真成功,接下来 Run Synthesis→Run Implementation,然后在 Windows 的下拉选项中点击 I/O Port,根据 EGO1 硬件手册上的引脚说明绑定引脚,选择逻辑电平为 LVCMOS33,然后保存即可生成引脚约束文件。最后 Generate Bitstream→Open Hardware Manager→Open Target→Auto Connect→ 选中生成的 bit 文件 →Program 即可进行实物测试。

图片

图 25 系统实物调试

图片

图 26 系统实物调试

将 BIT 文件下入 EGO1 开发板后,打开串口助手,发送“de”,即二进制的“11011110”,可以观察到代表 FPGA 串口接收数据的 LED1 中的八个灯的数据(亮为“1”,灭为“0”)为 11011110;发送“95”,即二进制的“10010101”时,LED1 灯群展示数据为 10010101。由于没有示波器,不能看到波形,仅能通过 LED2 中的 LED7—LED2 显示可以看出 DDS 波形发生器的波形类型控制字与频率设置控制字数据都是对的。至此,正确实现任意波形发生器功能。

低通滤波器

低通滤波器通过 IP 核设计得以实现,仿真波形如下图 8 所示。

图片

图 27 FIR—IP 核实现仿真波形

通过上面仿真波形可以看出 4MHz 和 5MHz 的正弦混频信号经过 FIR 低通滤波器后将 9MHz 的高频正弦信号滤除掉了,输出为我们需要的 1MHz 低频信号。

图片

图 27 FIR-Verilog 代码实现仿真波形

如上图所示,DDS 产生频率为 200Hz 与 800Hz 输入,DDS_out 为叠加信号,低通滤波器输出波形不符合功能要求,未能定位到具体原因,仿真错误、系统功能未正确实现。

END

作者:The last one
原文:FPGA技术江湖

相关文章推荐

更多 FPGA 干货请关注FPGA 的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10669
内容数
627
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息