今日头条
AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。
A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。
AD转换的技术指标,一般有如下几个:
1. 1 分辨率(Resolution) 指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2^n的比值。分辨率又称精度,通常以数字信号的位数来表示。
2. 2 转换速率(Conversion Rate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率 (Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。常用单位是ksps和Msps,表示每秒采样千/百万次(kilo / Million Samples per Second)。
3. 3 量化误差 (Quantizing Error) 由于AD的有限分辨率而引起的误差,即有限分辨率AD的阶梯状转移特性曲线与无限分辨率AD(理想AD)的转移特 性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。
4. 4 偏移误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。
5. 5 满刻度误差(Full Scale Error) 满度输出时对应的输入信号与理想输入信号值之差。
6. 6 线性度(Linearity) 实际转换器的转移函数与理想直线的最大偏移,不包括以上三种误差。
其他指标还有:绝对精度(AbsoluteAccuracy) ,相对精度(Relative Accuracy),微分非线性,单调性和无错码,总谐波失真(Total Harmonic Distotortion缩写THD)和积分非线性。
明德扬教学板上板载板载32Mhz 转换速率、8bit高速AD芯片AD9280,满足各种信号的采集,满足用户实现各种常见滤波算法的实现。实际位置如下所示:
上面是AD9280的原理图。与FPGA相连的信号有:AD_D0~7、AD_OTR、AD_CLK。
由时钟图可以看出,每个时钟就可以做AD转换一次,但会延迟3个时钟才输出。例如时序图中第一个时钟采集到S1,并对S1进行模数转换,经过3个时钟后,输出DATA1,这个DATA1就是S1所应对的数字值。
由参数时序可以看出,时钟最大是32MHz。
由上面时序可以看出,控制AD9280非常简单,只要给出不超过32MHz的时钟,然后对其采集就行了。
本次案例将使用到AD9709和AD9280。其连接示意如下图所示
其中跳帽就设置成XXX,请下图所示。如下设置后,AD9709的通道A输出,就会环回给AD9280。
本案例是FPGA先产生正弦信号,这个正弦信号输出给DA通道A,经过环回后,给回AD9280的输入端,FPGA再采集AD9280的数据,最后使用signaltap采集数字信号。
正弦信号的产生方式,与“FIR滤波器的设计”案例一致。正弦信号的频率受开发板上的3个拨码开关控制,用3位信号key表示,一共可以产生8种频率。
正弦信号的频率 约等于: 100KHz * (key+1)。
例如,当key等于0时,产生约100KHz的正弦信号;
当key等于1时,产生约200KHz的正弦波;
当key等于7时,产生约800KHz的正弦波。
FPGA产生25MHz的时钟给AD9280,也就是采样率为25M。用这个时钟作为SIGNALTAP的采样时钟,观察AD9280过来的数据波形。
上板效果图如下图所示。(用signaltap抓取波形)
新建目录:D:\mdy_book\ad_prj。在该目录中,新建一个名为ad_prj.v的文件,并用GVIM打开,开始编写代码。
我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A产生正弦波所对应的电压,同时采集AD9280的数据并观察。为了控制AD9709的通道A,就需要控制AD9709的MODE、SLEEP、CLK1、WRT1、DB7~0P1管脚。为了采集AD9280,那么就需要控制AD9280的CLK、D0~D7管脚。根据设计目标的要求,整个工程需要以下信号:
1. 使用clk连接到晶振,表示50M时钟的输入。
2. 使用rst_n连接到按键,表示复位信号。
3. 使用3位信号key,表示三位拨码开关。
4. 使用dac_mode信号连接到AD9709的MODE管脚,用来控制其工作模式。
5. 使用dac_sleep信号连接到AD9709的SLEEP管脚,用来控制其睡眠模式。
6. 使用dac_clka信号连接到AD9709的CLK1管脚,用来控制通道A的时钟。
7. 使用dac_wra信号连接到AD9709的WRT1管脚,用来控制通道A的写使能。
8. 使用8位信号dac_da连接到AD9709的DB7~0P1管脚,用来控制通道A的写数据。
9. 使用ad_clk信号连接到AD9280的CLK管脚,用来作来采样时钟。
10. 使用8位ad_in信号连接到AD9280的D7~0管脚,用来采集数据。
综上所述,我们这个工程需要10个信号,时钟clk,复位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、ad_clk和ad_in,其中dac_da 、ad_in是8位信号,key是3位信号,其他都是1位信号。
将module的名称定义为ad_prj,代码如下:
其中clk、rst_n是1位的输入信号,dac_da是8位的输出信号,dac_mode,dac_clka,dac_wra,dac_sleep是1位输出信号,ad_clk是1位输出信号,ad_in是8位输入信号,key是3位输入信号。
由于正弦信号的产生要求,与“FIR滤波器设计”相同,所以不再详细描述原因。现在把相关代码整理如下。
还有最后一个信号要设计:ad_clk。由设计目标可知,要求是25MHz的时钟。为了产生时钟,我们就要用到PLL。
打开IP核管理工具
打开quartus软件,然后选择Tools ->IPcatalog,在右侧弹出如下界面
在搜索框中,填下ALTPLL,就会出现如下界面。
ALTPLL就是我们需要使用的PLL IP核。双击ALTPLL,在弹出的对话框中起个文件名,如vga_pll,记得选择verilog。然后点OK就可以开始设置参数了。
2.设置IP参数
上图中,主要是设置输入的时钟频率,明德扬开发板输入时钟是固定的50MHz,因此可填写50,注意旁边的单位是选择MHz。其他默认,按next。
上图的option inputs中,全部取消勾选,不需要产生复位信号。上图中的lock output,全部取消勾选,不需要产生locked指示信号。然后选Next。
不用做任何更改,直接Next。
不用做任何更改,直接Next。
增加输入时钟,由于我们只有一个输入时钟,所以只用inclk0即可,无需增加。直接Next。
不用做任何更改,直接Next。
设置c0的输出频率。我们选择Enter output clock frequest中,直接填入25,单位选择MHz,就是表示要产生25MHz的时钟。然后点击Finish,弹出如下窗口。
取消my_pll_bb.v的勾选,然后选择Finish。QUARTUS就会产生PLL IP的代码了。
稍等片刻,到工程目录 D:\mdy_book\ad_prj,可以看到生成一个my_pll.v文件,用GVIM打开后,可以看到PLL模块的模块输入输出接口。其中inclk0是50MHz输入时钟,c0是25MHz的输出时钟。顶层模块直接例化就可以使用了。
至此,主体程序已经完成。接下来是将module补充完整。
接下来定义信号类型。
在“FIR滤波器案例”中已经说明了部分信号的说明,现补充如下。
ad_clk是由例化模块输出信号,非always产生,可以定义为wire型,只有1位
1.)前面已经介绍了新建工程。现在打开quartus,在Project菜单中选择Add/Remove File to Project,弹出文件窗口。
点击右上角的,在弹出来的窗口中,双击选择D:\mdy_book\fir_prj目录下的fir_prj.v文件。然后记得要点Add,才算正式加到工程。
点OK关闭本窗口。
1.点击右上角蓝色三角键进行编译
之后等待编译成功
出现上面的界面,就说明编译综合成功。
在菜单栏中,选中Assignments,然后选择Pin Planner,就会弹出配置管脚的窗口。
在配置窗口中的location一列,可以填写每个管脚所对应的FPGA管脚号。
按上面配置好每个信号的管脚,其最终效果如下图。
关闭Pin Planner,软件自动会保存管脚配置信息。
在菜单栏中,选中Processing,然后选择Start Compilation,开始对整个工程进行编译和综合。
出现上面的界面,就说明编译综合成功。
连接示意如上图所示。将电源接上开发板;USBBLASTER一端连接到JTAG插口,另一端连到PC的USB接口;将开发板上的P7接口和P11与示波器的两个通道相连。最后再将电源打开。
全部0条评论
快来发表一下你的评论吧 !