用matlab做系统级adc仿真

用matlab 做系统级的adc 的仿真。

整理人:袁小星

2006-1-8

目标:仿真10 位,每级1.5 位pipeline-adc 的各项指标与最后性能的关系。

步骤1.搭建简单的系统。

作用工具:matlab->simulink.

所用到的模块:

1.ramp: 用于产生从-1v 到1v 的线性输出。输入到adc 系统中。

2.zero-order hold: 用于进行对输入的采样保持,采样时间由adc 所要工作的频

率决定。

3.lookup-1d: 一维的查找表,设定不同的输入输出,可以做成adc 和dac 模块。

4.sum: 把两个数相加,实现实际中的信号相加减。或者用于数字补偿。

5.gain: 模拟余数的放大功能,或者用于数字量移位。

6.xy-graph: 用于查看adc 的传输函数。

整个系统的结构:

1.9 级相同的处理模块

2.最后一级的比较(2 位)

3.数字矫正

每一级处理模块的构成:

1.包括模块:zero-order hold, subadc(look-up),dac(lookup),sum,gain.

2.两个查找表都需要进行对输入输出进行处理:解释如下

最后的每一级电路都是要做出mask 的,对外的接口有比较器的阈值,dac 的输

出,以及采样时间,每一级的增益。比如如果要求输入阈值为[-0.25 0.25](以矩

阵的形式输入)。但是为了使查找表工作的更合理。subadc 查找表对应的。输入

输出为:输入[-realmax -0.25 -0.25 0.25 0.25 realmax] 输出[0 0 1 1 2 2].同样

如果要求dac 的输出为[-0.5 0 0.5], dac 查找表对应的输入输出为 输入[0 0 1 1 2

2],输出[-0.5 -0.5 0 0 0.5 0.5].这就需要两个函数 来做成接口,实现这种矩阵的

扩展。参见(adc_glue,dac_glue).如图:

3.然后把信号相加。

最后一级的比较:

也是用查找表来实现:

输入[-realmax -0.5 -0.5 0 0 0.5 0.5 realmax]

输出[0 0 1 1 2 2 3 3]

数字矫正:

把每一级数字输出乘以一个特定常数后(比如最后一级处理模块数字输出乘2 ),

后相加,就可以看输出波形了。

最后的总体结构:

步骤2 :计算inl_dnl

用到了提供的函数 inl_dnl,但是得保证输入是正弦信号。然后试图改变各参数的

值看最后inl_dnl 的变化。

测量dnl_inl,有两种方法,

1 种是固定采样的时间,但是输入波形的频率不断变化,如果要保持采样完整的

周期,那么显然采的点就会增加也就是说对一个周期正玹信号,采样的点是变化

的。这种情况下,对同一个adc 来说,最后计算的inl_dnl 会随着采样点的增多

越来越小。从这种方法得出得结论是,当输入频率越小时,dnl_inl.表现的越好。

2 种是固定采样的时间,而且固定输入波形的频率,但是可以通过增加周期来增

加点的数量(最好是奇数个周期,这样对以后做 snr 分析有用),这种情况下,

在满足一定数量的点以后,inl_dnl,就不怎么发生变化了。也就是说,对同一个

输入频率,采样足够多的点(满足概率分布的要求?)后,dnl_inl,就不怎么发

生变化了。

实际情况下,应该是第二种方法更具有参考价值,也就是说固定输入频率下,计

算 dnl_inl,但是这个固定频率应该取多少是个问题。还有就是应该取多少个点。

一般来说,为了保持取得代码得完整性,这样的话做 dnl_inl 才有意义,这就要

求采样频率不能是输入频率的周期倍,一般来说,要取一个比较合适的值,使能

够在一定码数内,覆盖所有的1024 个点(10bit)。对于本设计,采样周期为

0.001s.相对的输入频率为12.505hz. (应该由数学上解释,从而算出比较理想的

值),运行时间16.383s, 保证采样的点数为16*1024.这样的值比较理想。

计算snr 时,如果不加窗函数,为了防止频谱泄漏,就需要计算得点数是2 得整

数倍,而且一般取得点数越多,越能反映实际情况,而且输入波形得频率相对于