1项目需求
1.1示波器模块
采集信号,将其显示在VGA屏幕上,有参考线和幅值以及显示周期显示。
1.2信号发生器模块
可以产生4种波形(正弦波,方波,锯齿波,三角波),频率初相位幅值均可调。在产生5MHz的波形时仍然有每个波形10个幅值数据。
1.3频率计
采用等进度测量法,对任意频率的波形都能达到小于等于1/100MHz的误差。
2完成的功能和达到的性能
2.1示波器模块
按下触摸按键切换显示周期,将选择的显示周期显示在频幕右边,总共4种周期可选(100us 1ms 10ms 100ms)。
测量范围-5V-+5V。
每0.1s刷新一次波形数据。每一帧图像都有1000个幅值数据,每一个幅值数据的精度为0.01V,范围是-5.12V~+5.11V。需要一块支持1280*1024@60Hz显示模式的频幕。
2.2信号发生器模块
可以产生4种波形(正弦波,方波,锯齿波,三角波),频率初相位幅值均可调。
每一种波形用MATLAB抽样4096次,每次抽样的数据为8位宽。
由于是相位累加的放式,所以理论上只要模数转换器的速度足够快,就可以产生任意频率的波形。本次实验拟采用50MHz的模数转化器。
2.3频率计模块
采用等精度测量法,定义软件闸门为1S,每1S刷新一次数据,标准时钟为100MHz,因此对任意频率的信号都能做到小于等于1/100MHz的误差。
例如对100MHz的信号,测量结果为9,999,999Hz~10,000,001Hz,对于1Hz的信号,测量结果为0.9999999Hz~1.0000001Hz。
3实现思路
3.1示波器模块
显示区域为显示器中央的 1000*1024 区域。
由于 VGA 显示的特点,所以定义一个 16 位宽,2000 长度的 RAM 用来存放两帧数据,当模数转换处理模块在写 0-999(帧 A)数据时,VGA 驱动模块读取 1000-1999(帧 B)的数据,
10ms 后在 1000-1999(帧 B)写入数据,在 0-999(帧 A)读取数据。
模数转换器以 10MHz 的速度传来信号,信号处理模块采用间隔取数据的方式,将数据送入RAM,比如要显示器从左到右显示 10ms,则数据处理模块每隔着 99 个数据取一个数据,
这样显示器从左到右的显示周期为 0.1us*100*1000=10ms。
3.2信号发生器模块
一个正弦波,虽然幅值不是线性的,但是相位是线性的,通过 MATLAB 对 4 种波形采样生成 mif 或 hex 文件存入 ROM(每种波形采样 4096 次,每一次数据位宽为 8)。
然后用相位累加的方式读出,即可实现频率和初相位的调节,再将数据压缩,即可实现幅值的调节。
3.3频率计模块
采用等精度测量法,用PLL产生100MHz的标准时钟,定义软件闸门为1S。
4实现过程
详细的说明已经录入视频
5遇到的主要难题
5.1可能是Quartus20的BUG,使用ROM IP核的时候,需要把路径前面的.../IP_CORE/ROM删掉,否侧ROM无法正确读取。
5.2由于FPGA的逻辑资源是多于RAM资源的,所以用PCtoLCD产生字符信号存入逻辑资源以节省RAM资源(虽然编译变慢了)。
6.未来的规划
由于我对FFT的原理了解不深,该项目并未实现FFT功能,在深入学习信号与系统以后,对FFT有全面认识以后会加入这个功能。
焊接一块板子,用47595芯片和8段数码管来显示频率
资源报告
示波器模块如上
DDS模块如上