从行为模型到Verilog和VHDL的Sigma-Delta ADC设计
作者Ali Behboodian, MathWorks和Jeff Miller, MathWorks
Sigma-Delta ADC转换器
Sigma-delta ADC转换器几乎只用于需要高分辨率输出的应用,例如高保真音频或工业测量。为了实现所需的高分辨率,模拟信号必须以远高于奈奎斯特速率的速率采样。一般来说,电路设计的复杂程度与采样率成正比。由于这个原因,sigma-delta adc传统上用于采样低频信号,即奈奎斯特速率相对较低的信号,例如移动电话中的语音。
σ - δ ADC由模拟部分和数字部分组成(图1)。模拟部分包括σ - δ调制器,以高速率采样输入,并产生二进制输出,其平均值随时间跟踪模拟输入。数字部分,包括抽取滤波,通过运行sigma-delta调制器的输出通过低通抽取FIR滤波器得到平均值。在本文的后面部分,我们将利用过滤器输入的二进制特性来实现非常高效的过滤器体系结构。
建立行为模型
我们首先开发一个高级行为Simulink模型。金宝app模型是浮点数的。我们使用它作为系统的图形表示和可执行规范。
数字部分的滤波器是在MATLAB中设计的,基于Analog Devices AD1877 16位sigma-delta ADC的规范。它是一个单级FIR滤波器,将信号抽取为64倍,大约有3000个点。我们使用下面的MATLAB脚本来生成数字滤波器:
Decimation_Factor = 64;Passband_Ripple = .006;% dBStopband_Attenuation = 90;% dBFs = 48 e3;通频带= 21.6 e3;% dB阻带= 26.4 e3;% dBInput_Sampling_Rate = Decimation_Factor*Fs;f = fdesign.decimator (Decimation_Factor低通滤波器的、通带、阻带…Passband_Ripple、Stopband_Attenuation Input_Sampling_Rate);h =设计(f);
精心设计
在这个阶段,行为模型还不适合定点FPGA或ASIC实现。原因是滤波器非常大,计算成本很高。在详细设计时,我们将减小过滤器大小,为实现做准备。然后,我们将使用过滤器输入的二进制性质,使设计更加有效。最后,我们将数字转换为定点。高级行为模型将作为一个参考贯穿始终。
优化滤波器设计
作为一个单级滤波器,大约有3000个点,我们的原始数字滤波器需要大量的算术运算符。使用MATLAB,我们将其分解为三个阶段的抽取滤波器(图2)。每个阶段分别有40、12和194个滤波器抽头,每个阶段分别以8、2和4的因子抽取信号,总共为64。这种方法将系数的总数减少了大约10倍,显著减少了所需的算术运算的数量。
我们比较了原始一级滤波器和新的三级滤波器的频率响应(图3)。我们看到三级滤波器的幅度响应与原始一级滤波器的幅度响应非常接近。
在Simuli金宝appnk环境中,我们测试了我们精心设计的设计,并验证它与行为模型相比(图4)。使用多速率、多级滤波器设计极大地降低了计算复杂性,但为滤波器引入了更大的组延迟。这种较大的延迟在图4底部所示的滤波器输出迹中是明显的,其中由于较大的滤波器延迟,第二个迹的结束明显滞后于第一个迹的结束。
阐述了筛选的第一阶段
如上所述,第一级是一个40抽头FIR滤波器。一般来说,要实现这样的过滤器,我们需要对每个输出样本进行40次乘法和39次加法。然而,由于模拟部分将二进制信号馈送到滤波器的第一级,我们可以使用查找表实现第一级。这种方法不需要乘法,只需要4次加法。另外两个阶段将按常规方式执行。
为了理解我们如何用查找表替换用8个滤波器进行的40次FIR抽取,让我们先看看用8个滤波器进行的8次FIR抽取的简单情况。在这种情况下,每8个二进制输入样本,过滤器生成一个输出样本。输出样本依赖于8个输入样本,可以取256个不同的值(因为每个样本只有两个级别)。查找表将使用8个二进制输入样本作为查找表的索引,该查找表具有256个预先计算的过滤器输出。这导致了一个非常有效的滤波器设计,没有乘数。
使用这种方法,我们将40个水龙头过滤器分解为5个部分,每个部分8个水龙头。我们为每个段生成一个查找表,并将5个查找表输出结合起来生成总体结果。你可以下载MATLAB代码我们用来生成查找表项的。
图5显示了最终的设计。该设计的输入是一个二进制信号,其值为1或-1。注意,该设计使用了下采样块和嵌入式MATLAB函数块。下采样块的输出速率比输入慢8倍。图5中不同颜色表示不同速率的信号。
通过嵌入式MATLAB函数块,我们可以将MATLAB代码引入Simulink,然后模拟设计。金宝app嵌入式MATLAB可以简化基于文本建模的最佳和最容易表示的建模算法。在这种情况下,MATLAB代码非常简单(图6)。
在这一点上,我们验证了设计的正常运行。最好现在就确定任何差异,而不是在随后的硬件上的过滤器实现期间。图7所示金宝app的Simulink模型将原始过滤器的输出与我们精心设计的过滤器的输出进行了比较。我们看到,最初两种设计的输出存在差异,但随着时间的推移,差异逐渐变为零。不匹配的原因是原始设计的初始条件与使用lut创建的详细设计的初始条件之间的差异。我们可以通过设置适当的初始条件和放置额外的延迟块来消除不匹配。
将模型转换为定点
到目前为止,我们所有的模型都使用了浮点运算。为了高效的FPGA或ASIC实现,我们必须将我们的模型转换为定点(图8)。我们使用MATLAB和Simulink将滤波器转换为定点。金宝app在Simuli金宝appnk环境中,每个算术块都可以处理浮点和定点计算,简化了转换过程。我们使用Sim金宝appulink来验证定点设计的输出与参考设计的输出是否匹配。
高密度脂蛋白代码生成
MathWorks工具使我们能够为定点、多速率系统生成可合成的VHDL或Verilog代码,其中包括滤波器、嵌入式MATLAB函数块和ADC设计数字部分使用的其他块。我们使用金宝appSimulink HDL编码器从如图8和所示的过滤器的第一阶段生成VHDL代码滤波器设计HDL编码器从第二和第三阶段生成VHDL代码。图9显示了我们从过滤器的第一阶段生成的部分VHDL代码。
金宝appSimulink HDL Coder允许我们为特定块(如Sum、Product和MinMax块)的不同硬件实现生成VHDL或Verilog代码。这些不同的实现通常是速度和芯片面积之间的折衷。在我们的示例中,我们使用一个可选的控制文件来探索图8所示的Sum块的替代实现,首先使用Cascade实现,然后使用Tree实现。
除了VHDL或Verilog代码外,Simulink HDL Coder还可以生成金宝app一个周期精确的模型,该模型对应于为Sum块所做的特定实现选择。图10显示了为Cascade实现生成的模型。图11显示了为Tree实现生成的模型。我们可以模拟生成的模型,并根据参考模型验证它们的输出。
合成的结果
在生成VHDL代码之后,我们必须为硬件实现准备代码。为此,我们合成了为滤波器的第一阶段生成的VHDL代码,并使用Xilinx ISE软件工具为Virtex 4 vsx25-10 FPGA执行位置和路由。时序分析表明,我们可以在210 MHz的时钟频率下运行该设计。
总结
在本文中,我们使用基于模型的设计(model - based Design)和MathWorks工具创建了sigma-delta ADC的高级可执行行为模型。我们对行为模型进行了详细的阐述,为在FPGA上的硬件实现做了准备。在整个过程中,我们不断验证模型的输出。这种方法使我们能够发现设计中的差异,如果不被发现,可能会导致性能问题。我们使用Simu金宝applink HDL Coder从模型中生成HDL代码,并使用嵌入式MATLAB函数块将MATLAB代码合并到Simulink模型中。使用MATLAB和Simulink创建的可执行模型是这种设计方法的基石。金宝app
2007年出版的