世界上最简单的 sigma-delta DAC 是如何工作的?

信息处理 数模 delta-sigma
2022-01-29 01:15:24

我遇到了一个简单的 delta-sigma(据说,delta 部分在哪里?)使用累加器的 DAC 实现,然后使用溢出位作为调制的 1 位输出。

来自https://www.fpga4fun.com/PWM_DAC_2.html

module PWM(clk, PWM_in, PWM_out);
input clk;
input [7:0] PWM_in;
output PWM_out;

reg [8:0] PWM_accumulator;
always @(posedge clk) PWM_accumulator <= PWM_accumulator[7:0] + PWM_in;

assign PWM_out = PWM_accumulator[8];
endmodule

我已经实现了这个并在 FPGA 上进行了测试,并将其与 Xilinx 应用说明中的 delta-sigma DAC 进行了比较:https ://www.xilinx.com/support/documentation/application_notes/xapp154.pdf

module ds_modulator (
        output DACout,
        input [7:0] DACin,
        input Clk,
        input Resetn
);

reg DACout;
reg [9:0] DeltaAdder;
reg [9:0] SigmaAdder;
reg [9:0] SigmaLatch;
reg [9:0] DeltaB;

assign DeltaB = {SigmaLatch[9], SigmaLatch[9], 8'b0};
assign DeltaAdder = DACin + DeltaB;
assign SigmaAdder = DeltaAdder + SigmaLatch;

always @(posedge Clk, negedge Resetn) begin
    if (!Resetn) begin
            SigmaLatch <= 10'b1111111111;
            DACout <= 1'b0;
    end else begin
            SigmaLatch <= SigmaAdder;
            DACout <= SigmaLatch[9];
    end
end

endmodule

我正在寻找尽可能简单的 delta-sigma DAC,其中包含最少的逻辑,同时仍保持合理的性能。非常简单的累加器溢出解决方案似乎效果很好。我从概念上理解它——高值会导致更频繁的溢出,而低值会导致不太频繁的溢出。有什么缺点吗?我使用 120 MHz 采样频率并通过直接数字合成生成 100 kHz 和 500 kHz 之间的正弦波。

我对这种简单的方法很感兴趣。有人可以阐明为什么它在如此简单的同时运作良好吗?另外,如果有这种方法的正式名称,或者如果网上某处有一些分析,如果您可以在回复中引用它,将不胜感激。

我还在这里找到了简单的累加器溢出 DAC 参考(第 71 页):https ://github.com/hamsternz/IntroToSpartanFPGABook/blob/master/IntroToSpartanFPGABook.pdf

谢谢你。

1个回答

这只是一个输入为无符号二进制数的一阶 sigma delta DAC。下面显示了带有符号数字的经典变体,其中 MSB 作为符号位将从输入中减去 (Delta)。在这个有符号的变体中,考虑输入是一个范围从 +/- Full Scale 的缩放数字,反馈可能是 +Full Scale 或 -Full Scale;在这种情况下,累加器可以根据实际输入值与 +/-Full Scale 之间的差值以斜率向上或向下计数,当累加器输出越过中间范围时,输出切换。

与 OP 的情况相比,输入是无符号的,并且累加器仅在正方向上增长,其斜坡速率基于输入和 +Full Scale 之间的差异。当累加器溢出时,它被重置为 0 加上溢出,这实际上是减去满量程(在这种情况下是 Delta)。

Sigma Delta 数模转换器

这具有任何一阶 Sigma Delta 的所有缺点:与更高阶架构(-9 dB/倍频程)相比,噪声抑制更低,需要更高的过采样率才能实现所需的等效位数,并且会受到模式噪声的影响,从而导致更高的杂散内容如果输入没有改变。