马上注册,看完整文章,学更多FPGA知识。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本文为明德扬原创及录用文章,转载请注明出处!
1.1 总体设计
1.1.1 概述
学习了明德扬至简设计法和明德扬设计规范,本人设计了一个基于FPGA的可调频调相而且可以输出不同波形的DDS信号发生器。该信号发生器实现了通过按键控制输出不同类型的波形,并可以通过按键改变波形频率和初始相位。将此设计与明德扬的波形采集设计相结合,可以实现示波器功能,并且还可拓展实现波形频率计算、峰峰值计算、频谱分析等功能,有很大的设计空间。同时本设计以及其扩展功能在现实生活中也具有比较广泛的应用。在本案例的设计过程中,包含了按键定义和消抖、计数器、ROMIP的应用等技术。经过逐步改进、调试等一系列操作之后,完成了此设计,下面将完整的设计记录与大家分享。
1.1.2 设计目标
此设计可以通过按键进行波形类型的切换,并且波形的频率还可以进行改变,具体需求如下:
1)按键1按下时可以改变波形的类型,实现波形的切换,顺序为正弦波、锯齿波、三角波; 2)按键2按下时可以改变波形的频率,每按下一次,频率增大2倍,达到一定值后跳回初始频率值,以此循环; 3)按键3按下时可以改变波形的初始相位,每按下一次,初始相位加30,达到一定值后跳回初始相位值,以此循环。
1.1.3 系统结构框图
系统结构框图如下所示:
1.1.4 模块功能 - 按键模块实现功能
- 将外来异步信号打两拍处理,将异步信号同步化;
实现20ms按键消抖功能,并输出有效按键信号。
- DDS模块实现功能
- 通过有效按键信号实现切换波形类型、改变波形频率、调整波形初始相位;
从ROM中读取波形数据并输出按键控制下的波形数据。
1.1.5 信号定义
信号 | 定义 | clk | | rst_n | | key_in | | key_done | |
信号 | 定义 | clk | 系统时钟 | rst_n | 低电平复位信号 | key_done | 有效按键 | dadata | 波形数据 | i | 频率控制字 | phase | 相位控制字 |
1.1.6 工作原理
在系统整体结构中,通过按键控制输出波形类型,并通过按键改变波形频率控制字和初始相位控制字,得到ROM的读地址。ROM为只读存储器,只要给它一个地址,就能读出该地址中相应的数据,从已经初始化好的ROM读取相应的波形数据。
DDS的原理如下图,累加器每次累加一个频率控制字,调节频率控制字的数值,可以改变累加器的累加速度,进而可以调节从ROM查找表中读取波形数据的速度。即频率控制字越大,频率越高。相位控制字可以用来调节初始相位,即ROM地址自加的初始值。
1.2 按键电路
1.2.1 按键电路 独立式按键工作原理如上图所示,4条输入线接到FPGA的IO口上,当按键K1按下时,VCC通过电阻R1再通过按键K1最终进入GND形成一条通路,这条线路的全部电压都加在R1上,则引脚P14是低电平。当松开按键后,线路断开,就不会有电流通过,P14和VCC就应该是等电位,为高电平。我们可以通过P14这个IO口的高低电平状态来判断是否有按键按下。其它按键原理与K1一致。
从图中可以看出,如果我们按下按键,那么按键就会接通并连接到低电平GND,如果我们没有按下,那么按键就会断开并接到VCC,因此按键为低电平有效。通常的按键所用开关为机械弹性开关,当机械触点断开或者闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而机械式按键在闭合及断开的瞬间均伴随有一连串的抖动,如果不进行处理,会使系统识别到抖动信号而进行不必要的反应,导致模块功能不正常,为了避免这种现象的产生,需要进行按键消抖的操作。
1.2.2 按键消抖
按键消抖主要分为硬件消抖和软件消抖。两个“与非”门构成一个RS触发器为常用的硬件消抖。软件方法消抖,即检测出键闭合后执行一个延时程序,抖动时间的长短由按键的机械特性决定,一般为5ms~20ms,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认按下按键操作有效。当检测到按键释放后,也要给5ms~20ms的延时,待后沿抖动消失后才能转入该键的处理程序。经过按键消抖的行人优先按键,判断按键有效后,按键信号传递给控制系统,控制系统再进入相应的处理程序。如还不明白之处,见实验的PDF。
图5.1.2按键消抖示意图
1.2.3 按键消抖代码实现
使用明德扬的计数器模板,可以很快速很熟练地写出按键消抖模块。
每20ms扫描一次按键输入key_in,可以达到消抖的目的,再用寄存器缓存一下,按键为低电平有效;所以检测当检测到按键有下降沿变化时,代表该按键被按下,按键有效,输出1。
代码如下:
1.3 DDS模块设计
消抖过后的按键输入到本模块,同样使用明德扬至简设计法和计数器模板,可以秒速写出控制波形类型的代码。按键1每按下一次,即key_done[0]有效时,wave_cnt加1,加到3时归0,否则保持不变。wave_cnt为0时输出正弦波,1时输出三角波,2时输出锯齿波,默认时输出正弦波;至简设计法和计数器模板有多好用,越用越绝精妙。
完整代码如下:
1.3.2 改变波形频率
话不多说,反手又是一个明德扬计数模板。按键2每按下一次,即key_done[1]有效时,i乘以2,加到64时归0,否则保持不变。这里通过i可以改变频率的原理是ROM中512个数据为一个周期,i等于1的话,采集一个周期需要512次,clk/512即为频率,i为2时,只需要采集256次即完成一个周期,频率为clk/256。
当然也可以直接通过分频改变clk,从而达到改变频率的效果。
完整代码如下:
1.3.3 改变波形相位
依旧是百用不厌的计数器模板,按键3每按下一次,即key_done[2]有效时,初始相位加30,加到360时归0,否则保持不变。达到改变相位的目的。
因此,通过至简设计法、计数器模板,可以轻松达到设计目标。
完整代码如下:
1.3.4 mif文件的生成
程序中我们会用到一个ROM用于存储512个8位的波形数据,首先我们需要准备ROM的初始化文件(mif文件)。以下为生成正弦波数据mif文件的方法:首先打开Guagle_wave工具,选择菜单"查看"->”全局参数设置”,设置参数如下:
调用ROMIP核,并将mif导入ROM,其他波形同理。
1.4 在线逻辑分析仪查看波形数据
观看上面的现象,可以发现,各项功能正常,可以通过按键改变波形类型、频率、相位,成功完成设计目标。
在这个设计案例中,至简设计法和明德扬计数器模板发挥了至关重要的作用,使我能够快速准确完成设计。本设计拓展加上ADDA采集和VGA显示,可以实现基于FPGA的示波器设计,之前明德扬论坛已经发布了波形采集并VGA显示的案例,希望有兴趣的同学可以运用至简设计法和明德扬模板尝试一下拓展设计哦。
【工程源代码】 |