ADDAC满足相干采样防止频谱泄露的测试原理

本文详细介绍了在芯片测试中ADDAC模块的测试,涉及静态和动态参数,以及如何通过相干采样确保信号质量。重点讲解了ADC和DAC的测试方法,以及设置参数Fin、Fs和M/N以满足相干采样的要求。

概要

提示:这里可以添加技术概要
在模拟芯片、视音频芯片和MCU测试中通常都需要进行ADDAC的测试,一般情况下为了满足快速傅里叶变化的原理以及使的原始波形频谱转化之后不存在频谱泄露,就需要利用相干采样的原理

整体架构流程

`
这里简单的先对ADDAC做一个简单介绍,简单的说ADC就是将一个模拟信号(时域上是一个连续的信号)通过电压比较器(这里一般会有reference voltage作为基准电压)转化为一个离散的数字信号方便计算机的处理;而DAC就是将一个数字信号(时域上是一个离散的信号)通过电信号的调制输出为一个连续的模拟信号。
在芯片测试中如何评价芯片的ADDAC模块是否是合格的,是否满足技术要求,就需要有一个参考的方式,于是就有了静态参数测试和动态参数测试:
静态参数包括:DNL,INL,GainError,OffsetError;
动态参数包括:SNR,THD,ENOB等。
这里再介绍一下什么是相干采样:简单的说就是如果我们采了1048个点,这些点必须分布在输出波形的的整数周期的不同位置,不能出现重复的点。在输入比如输入的信号为Fin,芯片的采样率为Fs,采样点数为N(N等于2的n次方),采样周期为M,且M和N互质,我们如果需要满足相干采样,就需要满足如下公式:
Fin/Fs = M/N
如何使得这个公式满足测试要求,还请各位老爷再往下看。
这里就不一一介绍,各大网点都能找到详细的介绍!~

技术名词解释

  • ADC测试
  • DAC测试
  • ADDAC 测试
  • 相干采样
  • 模拟芯片测试

技术细节

这里先介绍ADC,DAC 和 ADDAC的动态参数测试(Fin为Sine 波)对于ADC满足相干采样(Fin/Fs = M/N):
ADC测试:如果为10Bit 的ADC,FS为1Msps,Fin为1kHz波形采样点N一般为2的(10+1)次方;为了满足相干采样于是M= NFin/Fs= 2.048,这里我们注意M必须为正整数,因此这里我们需要将M通过进一法所以M=3;因此反过来计算Fin = FsM/N=1,464.84375,我们将次Fin作为输入波形频率,然后计算离散的数字信号的SNR和THD等一些动态参数;
DAC测试:如果芯片输出的频率一定,我们可以先任意采样点进行采样,抓取的波形进行频谱转化,得到主频的频率Fout,通过Fout计算Fs,也就是通过Fs 进行满足相干采样原理,然后计算连续的模拟信号的SNR和THD等。
ADDAC测试:如果芯片同时存在ADC和DAC两种,首先AD部分的测试与上述ADC测试的原理一致,对于DA部分也和上述DAC测试原理一致,这里不同的是需要看一下ADC输入的波形Fin与DAC输出波形的Fout是否一致,或者频偏是否很小,如果很小则也是正常的现象,如果过小则可能是芯片本身有问题,可以检查寄存器的配置是否符合要求。

小结

在芯片测试中,ADDAC想要满足相干采样,而不会出现频谱泄露的情况设置合理的参数Fin,Fs, M ,N 是非常必要的。

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity addac is port ( -- 输入接口 clk : in std_logic; -- 系统时钟 bo_data : in std_logic_vector(7 downto 0); -- 来自 ROM 的波形数据(8位) AD_datain : in std_logic_vector(7 downto 0); -- ADC 输入数据(8位) -- 输出接口 DA_BUFFER : out std_logic_vector(15 downto 0); -- DAC 数据输出(16位) AD_BUFFER : out std_logic_vector(15 downto 0); -- ADC 数据输出(16位) DA_control : out std_logic; -- DAC 控制信号(高电平启动) AD_control : out std_logic; -- ADC 控制信号(高电平启动) AD_dataout : out std_logic_vector(7 downto 0); -- ADC 输出数据(8位) VGA_C : out std_logic := '0' -- VGA 时钟信号(初始为低) ); end addac; architecture main of addac is begin process(clk) -- 内部变量 variable DA_contime : integer := 0; -- DAC 初始化计数器 variable cycle_time : integer range 0 to 20 := 0; -- 主循环计数器(0-19) begin if (clk'event and clk = '1') then -- ADC 数据直通输出 AD_dataout <= AD_datain; -- DAC 初始化阶段(仅执行一次) if (DA_contime = 0) then DA_contime := 1; -- 标记初始化完成 DA_BUFFER <= "1101000000000001"; -- 初始配置 DAC 控制字 DA_control <= '1'; -- 启动 DAC else -- 主循环计数器递增 cycle_time := cycle_time + 1; if (cycle_time = 20) then cycle_time := 0; -- 循环复位 end if; -- 周期阶段逻辑 if (cycle_time = 0) then -- 配置 DAC 数据(控制字 + 波形数据) DA_BUFFER(15 downto 12) <= "0100"; -- DAC 控制字(R1=0, R0=1) DA_BUFFER(3 downto 0) <= "0000"; -- 低位补零 DA_BUFFER(11 downto 4) <= bo_data; -- 波形数据(8位) elsif (cycle_time = 10) then -- 清空 ADC 缓冲器 AD_BUFFER <= "0000000000000000"; end if; -- 控制信号生成 if (cycle_time = 5) then DA_control <= '1'; -- 启动 DAC AD_control <= '0'; -- 关闭 ADC elsif (cycle_time = 15) then DA_control <= '0'; -- 关闭 DAC AD_control <= '1'; -- 启动 ADC else DA_control <= '0'; -- 默认关闭 AD_control <= '0'; end if; -- VGA 时钟生成(周期末尾两个时钟高电平) if ((cycle_time = 18) or (cycle_time = 19)) then VGA_C <= '1'; else VGA_C <= '0'; end if; end if; end if; end process; end architecture main; 从接口来看,输入时钟clk是1Mhz的,输出的吧VGA_C不是时钟,是控制信号, AD_dataout 是给VGA控制模块的AD采样数据,请分析这个数据的频率和时钟是多少
最新发布
09-20
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值