用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 得整
数倍,而且一般取得点数越多,越能反映实际情况,而且输入波形得频率相对于
采