基于FPGA的点阵板波形显示器
学号 61009212
姓名邵小强
1、申请题目:基于FPGA的点阵板波形显示器
n 基于FPGA的点阵板波形显示器,即通过对系统输入端电平信号的采样、分析、存储、计算处理等过程之后,将分析所得输出到点阵板上以直观显示出输入电平信号的波形。
2、课题背景:
n 存在问题
示波器成本高,且有时输入波形并非正弦波等标准波形,观察者也不需要示波器自动设定显示分度值,这样的情况下可以用简易波形显示器来代替。
n 应用背景
首先可以低成本、较方便地显示各种有规律、无规律波形,在以上功能实现的基础上,可根据需要加上运算模块如FFT等扩充DSP功能(如频谱分析)。
3、项目规划:
n 项目功能
对输入的电平信号按照一定频率采样,再将一定时间段(16倍采样周期长度,取决于点阵的列数)内的波形形状显示到点阵上。
n 项目指标
采样频率;采样精度;显示时域范围;显示精度;最高刷新显示速率。
n 规模
取决于实验仪器。本次我做的是采集1khz左右速率的信号,每按一次reset键存储16个数据,再用这16个数据控制点阵每列显示高度,如果仅采用这样的规模,大约500个以内的Logic Elements就足够。
n 面板(显示)、操作、规则
面板显示即为点阵板显示波形(扩展后显示波形频谱等);
人机交互:仅一个脉冲信号按键或接上一个自动脉冲,显示为点阵。
操作使用及规则:手动或接自动脉冲按下reset键后,点阵屏自动切换一次,显示按下时刻前一瞬间的波形。若接上适当频率的自动脉冲,可像数字示波器显示波形一样“静止”显示周期信号。
n 输入、输出接口
输入信号:要显示的电平信号;手动或自动脉冲信号;
输出信号:波形图。
4、实现方案:
n 核心问题
对于一个复杂音频信号、或者一个单一的电平信号,要用点阵板显示出来,主要分以下几个核心问题:合理采样+AD转换+数据计算处理+控制点阵。
最核心的部分是采样与AD转换的控制,如何将一个实实在在的ADC0809芯片与我们的数字系统相连接是一个核心问题——我们如何控制它的转换速度、如何将它转换后的数据存入FPGA。以下对此进行阐述,其它部分在系统解决方案中解释。
先看ADC0809的内部逻辑结构
其各引脚的含义为:ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。
因此结合其功能,我们可以如下设置接口电路:
简单概括而言,即通过统一的时钟500kHz,直接加到ADC0809上作为其工作频率,分频后接入FPGA内部控制模块作为采样频率,这两个频率不一样,不能混淆。再通过ADC输出的EOC信号控制FPGA的控制模块,ADC输出的数据接入FPGA的处理控制模块,最终,这个模块的输出数据即作为最后的输出数据,输出的ALE、EN、START等信号还要返回ADC0809作为控制信号。这样的循环最后可以得到一串串的数据,即为AD转换后的数据。
n 解决方案
以上AD模块及功能完成后,原本我最初是想接入一个FFT计算模块,对这串数据进行处理,从而即可实现频谱分析。但是实际考量后发现,这个模块需要30多个独立的VHDL文件构成的模块来实现,比较复杂繁琐,需要大量参考文献。所以可能将这个模块暂时放一边,做后面的模块——数据处理与点阵控制。
数据处理模块要实现的功能为输入一串8位2进制数,在按下reset键后自动存入前16个数据,转化成4位2进制数后再循环输出,这是与点阵控制模块相一致的,因为点阵模块初步设计要求是要循环输入16个数据串的。
(而考虑到0000 0000-1111 1111要与0000-1111相互对应,一个最简单的办法就可以是取8位码的前4位。)
点阵原理应当是选定行、列后交集处对应的点会亮。所以点阵控制模块要实现的功能为循环输入16个2进制数据,再根据这16个循环的数循环点亮点阵的每一列,刷新速度较快的时候看上去就可以像同时点亮每一列的对应点一样。
5、系统结构:
n 系统框图
n 模块功能描述
1. 分频器:实现将500KHz的信号32分频的功能。
2. ADC控制模块:结合分频器共同控制ADC模块工作,从而从dout[7..0]口不断输出频率大约为8kHz左右的数据流。
3. 数据存储及循环输出模块:自动存储按下RESET后16个时钟周期内的数据,第17个及17个之后的数据自动忽略;存满后开始循环输出,输出NUM为下标,从0000到1111,数据分别循环输出16个数,每个数均为8位二进制码。FULL为辅助用端口,存满16个数后电平变为1,此系统中由于速率较高,未利用此端口,设置在此是调试过程中用的。
4. 数值转换模块:将8位2进制码DIN[7..0]转化为成正比关系的4位2进制码DOUT[3..0],例如0000 0000至0000 1111间的所有数均对应4位的0000。
5. 点阵控制模块,通过循环输入16个数fudu[3..0]以及下标rownum[3..0],实现对点阵每列显示一个与赋值对应的点的功能。
n 模块接口标注(参数、协议)
为方便描述,接口已在模块功能中注释
输入500kHz的频率,输出约为8kHz的信号。
1. 分频器:输入clk为500kHz,从系统外部引入,输出q为8kHz左右信号。
2. ADC控制模块:clk为分频之后的信号,eoc为ADC0809芯片上的输出端,din[7..0]为 ADC0809的数据输出;start, oe, ale均接在ADC0809芯片上的输入端,dout[7..0]为输出数据流。
3. 数据存储及循环输出模块:
CLK可用前一级的ale作为时钟,RESET接外部脉冲信号,DIN[7..0]为模数转换后的数据输入;DOUT[7..0]为循环输出16个数据,NUM[3..0]为0-16的2进制下标。
4. 数值转换模块:DIN[7..0]为8位2进制码,DOUT[3..0]为4位2进制码。
5. 点阵控制模块: clk10kHz为点阵控制模块的工作频率,输入8kHz也同样可以,rownum[3..0]与fudu3..0]即分别为列选信号(即前级提到的下标)与4位的幅度信号(即前级的16个数循环输出)。
例如EP1C3T144C8实验箱的输入输出的实际连线与管脚表
输入输出名称
|
芯片引脚号
|
实验箱标注
|
钉子线连接
|
CLK500Khz
|
PIN_73
|
P1
|
函数发生器500KHZ信号
|
ROW[9]
|
PIN_31
|
P35
|
点阵板ROW9
|
ROW[8]
|
PIN_32
|
P34
|
点阵板ROW8
|
ROW[7]
|
PIN_33
|
P33
|
点阵板ROW7
|
ROW[6]
|
PIN_34
|
P32
|
点阵板ROW6
|
ROW[5]
|
PIN_35
|
P31
|
点阵板ROW5
|
ROW[4]
|
PIN_36
|
P30
|
点阵板ROW4
|
ROW[3]
|
PIN_37
|
P29
|
点阵板ROW3
|
ROW[2]
|
PIN_38
|
P28
|
点阵板ROW2
|
ROW[15]
|
PIN_144
|
P40
|
点阵板ROW15
|
ROW[14]
|
PIN_143
|
P41
|
点阵板ROW14
|
ROW[13]
|
PIN_2
|
P39
|
点阵板ROW13
|
ROW[12]
|
PIN_3
|
P38
|
点阵板ROW12
|
ROW[11]
|
PIN_4
|
P37
|
点阵板ROW11
|
ROW[10]
|
PIN_5
|
P36
|
点阵板ROW10
|
ROW[1]
|
PIN_39
|
P27
|
点阵板ROW1
|
ROW[0]
|
PIN_40
|
P26
|
点阵板ROW0
|
COL[9]
|
PIN_51
|
P19
|
点阵板COL9
|
COL[8]
|
PIN_52
|
P18
|
点阵板COL8
|
COL[7]
|
PIN_53
|
P17
|
点阵板COL7
|
COL[6]
|
PIN_54
|
P16
|
点阵板COL6
|
COL[5]
|
PIN_55
|
P15
|
点阵板COL5
|
COL[4]
|
PIN_56
|
P14
|
点阵板COL4
|
COL[3]
|
PIN_57
|
P13
|
点阵板COL3
|
COL[2]
|
PIN_58
|
P12
|
点阵板COL2
|
COL[15]
|
PIN_41
|
P25
|
点阵板COL15
|
COL[14]
|
PIN_42
|
P24
|
点阵板COL14
|
COL[13]
|
PIN_47
|
P23
|
点阵板COL13
|
COL[12]
|
PIN_48
|
P22
|
点阵板COL12
|
COL[11]
|
PIN_49
|
P21
|
点阵板COL11
|
COL[10]
|
PIN_50
|
P20
|
点阵板COL10
|
COL[1]
|
PIN_59
|
P11
|
点阵板COL1
|
COL[0]
|
PIN_60
|
P10
|
点阵板COL0
|
CLK
|
PIN_133
|
P47
|
测试分频效果使用,不需要连接
|
START
|
PIN_134
|
P46
|
ADC0813的START输入端
|
RST
|
PIN_139
|
P45
|
ADC0812的RESET输入端
|
ALE
|
PIN_140
|
P44
|
ADC0811的ALE输入端
|
OE
|
PIN_141
|
P43
|
ADC0810的OE输入端
|
DATAIN[7]
|
PIN_72
|
P2
|
ADC0809输出信号data7
|
DATAIN[6]
|
PIN_71
|
P3
|
ADC0809输出信号data6
|
DATAIN[5]
|
PIN_70
|
P4
|
ADC0809输出信号data5
|
DATAIN[4]
|
PIN_69
|
P5
|
ADC0809输出信号data4
|
DATAIN[3]
|
PIN_68
|
P6
|
ADC0809输出信号data3
|
DATAIN[2]
|
PIN_67
|
P7
|
ADC0809输出信号data2
|
DATAIN[1]
|
PIN_62
|
P8
|
ADC0809输出信号data1
|
DATAIN[0]
|
PIN_61
|
P9
|
ADC0809输出信号data0
|
EOC
|
PIN_142
|
P42
|
ADC0809的EOC输出端
|
6、状态流程图:
n 系统工作状态流程
功能图:
流程图:此数字系统的状态流程非常简单,并非本数字系统的重点。重点在于各部分模块的功能实现。
7、各主要模块仿真结果波形
n 各模块的仿真波形
由于ADC部分与点阵显示部分对外设要求比较高,数据量非常大且要求速度很高,手动输入仿真的速度远远不及实际搭电路测试,因为我只对一些功能模块进行了仿真。这两个主要模块我直接在实验室内部测试成功的。
1. 数据存储模块,按顺序存满后循环输出,实际发现略有几个时钟周期的延迟效应,但不影响我们查看波形。因为每个时钟周期的时间不到100us,可以忽略。
2. 数据转换模块仿真结果让我有点大跌眼镜,因为即使是功能仿真也出现了这么大的延迟,但是从数据结果来看它的换算结果是正确的,并且这一非常小的程序我相信它的功能不会有错,所以我也是认为它正确后到实验室再实际检测的。实际情况表明它工作正常。
3. 分频器测试:一切正常。输出的波形大约为8kHz左右。
8、课程设计总结
n 预期的目标与当前实现功能的差异详细注释
首先非常遗憾的一点是我承认没能做成频谱分析。这之中其实是有原因的,因为离散傅立叶变换在大二近结束时、信息学院大三时期才会学到,牵涉到很多知识点。我虽然已经尽力在学习DTFT及FFT的理论知识了,但是难免比不上系统性地学习。考虑到再花太多时间在上面就偏移了工作重心,我觉得还是应当做出一个数字系统起来更贴合这次课程设计的目标,因此在跟老师协商后,老师建议我可以直接将第一、第三个大模块直接拼接,第二个FFT功能模块可以暂时先放放,同样能达到做一个完整系统以锻炼我们系统设计、使用VHDL语言的能力。关于这个缺憾,在大三时期我在电子系还会接触一次电子系统设计,我会努力在那个时期完成。
对于系统本身的功能与预期差异,其实并没有什么明显的不达标。预期的指标已基本达到,显示的波形也还算逼真(因为点阵确实不如VGA显示那么精确,可以通过增加点阵分辨率或者接到VGA的方法来提高分辨率)。
另一个问题是最后将输入信号的频率改成非1kHz时,波形显示有叠加的情况,看不出是2kHz或0.5kHz,在验收现场由于事先没有想过换频率,所以没有反应过来原因是什么。加上老师验收比较忙,我在验收现场没能很好地解释这个问题。验收之后我对此问题进行了深入思考与分析:
问题在于,我重新看电路才记得,在调试电路时我实际上后来对我画的电路做了修改(实际电路如下图,不同之处是在datasave2即数据存储模块前又加了一个分频器),这是由于我在第一次调试时发现点阵几乎总显示近乎直线,而单纯改输入信号的频率虽然有好转,但是仍旧失真比较严重。因此我没有选择改输入信号的频率,而是保证连续采样的基础上,改变数据存储频率,这样在连续采样的基础上,每隔8个点取一个。经过试验发现这样做与直接调分频器有两个好处:第一是避免了门延迟导致的多个时钟端其实不同步的情况,避免了因为每个时钟端的上升沿其实有略微时间差而带来的误差;二是分频器设立的目的就是为了正好符合ADC0809的采样速率,尽量不要轻易随便改它,否则很容易让ADC0809工作不正常。实际表明,改了分频器后可能真的影响到了ADC的工作,出来的波形不正确。
在以上过程明了的基础上,就可以明白,实质上最后系统并没有像一个正弦波采8个点再将这8个点显示出来描出图像,而是采了大约64个点再从中选了8个点显示出来。这两个过程的不同之处在于:由于门延迟作用,从每8个点中选出一个点的过程可能出问题,如错位——原本按照理论值来应当显示0-2里同一相位处的点,很可能会显示其它处的点。这样点多了后就容易出现部分错位,而使波形显示异常。原1kHz的信号应当是正好符合这样的相位差,因此每8个点中取的一个点相位都是相同的,没有出现失真。
当然,这样的问题多少显示出了系统的不合理性,我分析得是否正确可能也确实跟仪器本身工作情况有关。这是我这次系统设计不太完善之处,我在验收前没有意识到这样的问题而查出准确原因。
n 可以进一步发挥提高的部分
1. 在头尾模块中间加上FFT模块,即可做成频谱分析仪。如果加上其它DSP模块,则可实现其它DSP功能,具有非常大的扩展性。
2. 显示可以换到VGA显示器上,一来是提高分辨率,二来可以在显示器上多增加其它很多显示内容,如刻度值、分度值、当前频率值等等,用户交互界面将更加直观、合理。
3. 波形显示方式如果可以自动通过计算周期来自动调整显示范围、采样频率,则可以达到类似于数字示波器的功能。本次单纯用手动或可调频率脉冲,是为了能够显示大体变化周期在1ms左右的任意波形。如果输入的都是正弦波、三角波、方波等规律信号,则可以设置判断相邻两零点电位间隔,从而实现计算信号周期、自动调整采样频率与显示范围的功能。
n 课程设计体会
1. 全面掌握从设计到编程实现、到纠错、到下载调试的全过程。我后来实际做出的系统虽然不如我刚开始想做的频谱分析仪的效果,但是其实本质上也就只是少做了一个FFT模块,只要攻破FFT算法,就可以很轻易地在数字处理模块加进去,从而实现。所以我还是通过这样一次设计体会到了工程上做出一个系统的全过程的。这让我提前体会到了一些工程意识,培养了一些工程素质。
2. 养成按模块划分系统,逐步完成、逐步整合的良好习惯。不仅仅做数字系统如此,做任何一个大型任务都是要分模块、分步骤地依次进行,才能显得井井有条。在刚做数字系统时,一点经验都没有,总着急没有进展。可到后来就觉得把自己心中所设想的东西在眼前通过画电路、搭电路调试出来,是非常有成就感的事情。这是数字系统设计这门课程最后给我非常好的印象。
3. 学会一门语言。其实在学会C++后,我发现学任何编程语言都有触类旁通之效,比如Java, Matlab语言, VHDL等,其实我真正学它们都只是先看个总体描述,然后就可以直接拿一本参考手册开始编程了。通过一次次的编译、纠错,自然掌握了不少语法,更是掌握了不靠死记就能很快上手一门编程语言的能力。通过实现对几个完整程序构架从头到尾理解一遍、通过对参考书的参考、对程序报错信息的搜索、理解等手段,基本可以最快速最有效地学习一门新语言。这在我今后的生活甚至工作中我相信都是非常有用的。
4. 排错的能力。其实我这次编写的程序不是很难,仿真也基本能通过。每个独立模块,我都已经单独试验过,没有问题。但是后来在整合每个模块、实际搭上所有电路后,点阵偶尔会出现一些莫名其妙地移位或全排点亮的错误,这就要求我们要合理排查错误。我所做的办法是按模块检查,由于是数字信号,我把一些关键部分(如ADC转出的数据端)接上了LED灯,通过灯的显示来判断哪几个模块工作正常、哪几个工作不正常。通过分析、重试,很快排查了问题。
9、参考文献
[1] ADC0809 http://baike.baidu.com/view/1595179.htm
[2] ADC0809接口电路程序设计 http://wenku.baidu.com/view/4fd889c7aa00b52acfc7ca12.html
[3] 李云.VHDL电路设计实用教程[M].北京:机械工业出版社.2009
注:程序清单不要放在报告中,将最后能下载的正确的程序打包上传(程序中请写明注释)。