从行为模型到Verilog和VHDL的Sigma-Delta模数转换器设计

作者:Ali Behboodian,MathWorks和Jeff Miller,MathWorks

使用不同的工具和语言开发模拟混合信号集成电路,使得设计过程容易出错、耗时和复杂。基于模型的设计通过使工程师能够在MATLAB金宝app。通过使用Simulin金宝appk模型作为设计的基础,团队可以在开发的所有阶段测试和验证设计,从而减少在实现阶段发现昂贵的结构更改或bug的机会。

在本文中,我们使用MATLAB和Simulink进行基于模型的设计,设计了一个sigma-delta模数转换器(ADC金宝app)。首先对ADC的高级行为模型进行了详细的设计,最后生成了可合成的VHDL代码。

此设计的文件可用于下载。我们鼓励您打开Simulink模型,探索设计的不同方面。金宝app

Sigma-Delta ADC转换器

Sigma-delta模数转换器几乎只用于需要高分辨率输出的应用,例如高保真音频或工业测量。为了达到所需的高分辨率,模拟信号的采样速率必须远高于奈奎斯特速率。一般来说,电路设计的复杂性与采样率成正比。基于这个原因,sigma-delta adc传统上被用于采样低频信号,即奈奎斯特速率相对较低的信号,例如移动电话中的语音。

一个sigma-delta ADC由一个模拟部分和一个数字部分组成(图1)。模拟部分包括一个sigma-delta调制器,它对输入进行高速率采样,并产生一个二进制输出,其随时间的平均值跟踪模拟输入。数字部分,包括抽取滤波,通过低通抽取FIR滤波器运行sigma-delta调制器的输出,求平均值。在本文的后面,我们将利用过滤器输入的二进制特性来实现一个非常有效的过滤器架构。

图1。sigma-delta模数转换器的高级模型。点击图片查看放大图。

建立行为模型

我们首先开发一个高级行为Simulink模型。金宝app这个模型是浮点型的。我们使用它作为系统的图形表示和可执行规范。

数字部分的滤波器是在MATLAB中设计的,它基于模拟设备AD1877的16位sigma-delta ADC规范。它是一个单级FIR滤波器,可以将信号的采样率降低64倍,并且有大约3000个采样点。我们使用下面的MATLAB脚本来生成数字滤波器:

抽取因子=64;通带波纹=0.006;% dBStopband_Attenuation = 90;% dBFs=48e3;通带=21.6e3;% 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倍,显著地减少了所需的算术运算的数量。

图2。三级过滤器的设计。

我们将原一级滤波器的频率响应与新三级滤波器的频率响应进行对比(图3),我们发现三级滤波器的幅值响应与原一级滤波器的幅值响应非常接近。

图3。一级和三级过滤器的比较。红线表示规范掩码。点击图片查看放大图。

在Simuli金宝appnk环境中,我们测试了我们的详细设计,并验证了它与行为模型的比较良好(图4)。使用多速率、多级滤波器设计显著降低了计算复杂度,但为滤波器引入了更大的群延迟。这种较大的延迟在图4底部所示的滤波器输出记录道中是明显的,其中第二个记录道的末端明显滞后于第一个记录道的末端,因为滤波器延迟较大。

图4。验证了Simulink中的三级滤波设计。金宝app点击图像查看放大视图。

过滤器第一级的详细说明

如上所述,第一步是一个40-tap FIR滤波器。一般来说,要实现这样一个过滤器,我们需要对每个输出样本进行40次乘法和39次加法。但是,由于模拟部分将二进制信号提供给滤波器的第一阶段,我们可以使用查找表实现第一阶段。这个方法不需要乘法,只需要4次加法。其他两个阶段将以传统方式执行。

为了理解我们如何用查找表来代替40-tap FIR decimation by 8 filter,让我们先来看看8-tap FIR decimation by 8 filter这个更简单的例子。在这种情况下,对于每8个二进制输入样本,过滤器生成一个输出样本。输出样本依赖于8个输入样本,可以取256个不同的值(因为每个样本只有两个级别)。查找表将使用8个二进制输入样本作为具有256个预先计算的过滤器输出的查找表的索引。这导致了一个非常有效的过滤器设计,没有乘数。

使用这种方法,我们将40抽头滤波器分成5段,每段8抽头。我们为每个段生成一个查找表,并将5个查找表输出组合起来生成总体结果。你可以下载MATLAB代码用于生成查找表项的。

图5显示了最终的设计。设计的输入是一个二进制信号,它不是1就是-1。注意,这个设计使用了一个向下采样块和一个嵌入的MATLAB函数块。下采样块的输出速率比输入速率慢8倍。图5中的不同颜色表示不同速率的信号。

图5。高效设计的第一阶段的过滤器。点击图像查看放大视图。

利用嵌入的MATLAB函数块,将MATLAB代码引入Simulink中进行仿真设计。金宝app嵌入式MATLAB可以简化建模算法,这些算法使用基于文本的建模是最好和最容易表示的。在本例中,MATLAB代码非常简单(图6)。

图6。图5中嵌入式MATLAB功能块的内容。点击图片查看放大图。

此时,我们将验证设计是否正常工作。最好是现在就确定差异,而不是在随后的硬件上实现过滤器。图7所示金宝app的Simulink模型将原始过滤器的输出与我们精心设计的过滤器的输出进行了比较。我们看到,在最初的两个设计的输出有一个差异,但随着时间的推移,差异趋于零。不匹配的原因是原始设计的初始条件与使用LUTs创建的详细设计的初始条件不同。我们可以通过设置适当的初始条件和放置额外的延迟块来消除失配。

图7。图5中详细设计的验证。点击图像查看放大视图。

将模型转换为定点

到目前为止,我们所有的模型都使用了浮点运算。为了高效的FPGA或ASIC实现,我们必须将模型转换为固定点(图8)。我们使用MATLAB和Simulink将滤波器转换为不动点。在Simulink环境下,每个运算块可以同时处理浮点和定点计算,简化了转换过程。我们使用Simulink来验证定点设计的输出与参考设计的输出是否匹配。金宝app

图8。定点模型。点击图片查看放大图。

高密度脂蛋白代码生成

MathWorks工具使我们能够为定点多速率系统生成可合成的VHDL或Verilog代码,该系统包括过滤器、嵌入的MATLAB函数块和ADC设计数字部分使用的其他块。我们使用金宝appSimulink HDL编码器从图8和图8所示的过滤器的第一阶段生成VHDL代码滤波器设计HDL编码器从第二和第三阶段生成VHDL代码。图9显示了我们从过滤器的第一阶段生成的部分VHDL代码。

图9。使用Simulink HDL编码器生成的VHDL代码示例。金宝app点击图像查看放大视图。

金宝appSimulink HDL编码器允许我们为特定块的不同硬件实现生成VHDL或Verilog代码,例如Sum、Product和MinMax块。这些不同的实现通常是速度和芯片面积之间的折衷。在我们的例子中,我们使用一个可选的控制文件来探索图8所示Sum块的替代实现,首先使用一个级联,然后使用一个树实现。

除了VHDL或Verilog代码之外,Simulink HDL编码器还可以生成与S金宝appum块的特定实现选择相对应的精确循环模型。图10显示了为级联实现生成的模型。图11显示了为树实现生成的模型。我们可以模拟生成的模型,并根据参考模型验证它们的输出。

图10。和块的级联实现。点击图像查看放大视图。
图11。求和块的树实现。点击图片查看放大图。

合成的结果

在生成VHDL代码之后,我们必须为硬件实现准备代码。为此,我们使用Xilinx ISE软件工具,合成我们为过滤器的第一阶段生成的VHDL代码,并为Virtex 4 vsx25-10 FPGA执行位置和路由。时序分析表明,我们可以在210兆赫的时钟频率下进行设计。

摘要

在本文中,我们使用基于模型的设计和MathWorks工具来创建sigma-delta ADC的高级可执行行为模型。我们详细阐述了行为模型,为在FPGA上实现硬件做好准备。我们在整个过程中不断验证模型的输出。这种方法使我们能够发现设计中的一个差异,如果不被发现,它可能会导致性能问题。我们使用Simulink HDL编码器从模型中生成HDL代码,并使用嵌入式的MATLAB功能块将MATLAB代码合并到Simulink模型中。使用MATLAB和Simulink创建的可执行模型是这种设计方法的基础。金宝app

2007年出版的


查看相关功能的文章

查看相关行业的文章