2.04 - Дельта-сигма

ШИМ модуль сильно делит частоту дискретизации, что плохо. Дельтасигма имеет более высокую частоту, что снижает требования к ФНЧ.

Два модуля, внешне ничем не отличаются по результату

Один от Xilinx, брал по ссылке на марсоходе http://marsohod.org/index.php/projects/marsohod2/262-delta-sigma

// Delta-Sigma DAC

module ds8dac1(clk, DACin, DACout); output DACout; // This is the average output that feeds low pass filterreg DACout; // for optimum performance, ensure that this ff is in IOBinput [7:0] DACin; // DAC input input clk;reg [9:0] DeltaAdder; // Output of Delta adderreg [9:0] SigmaAdder; // Output of Sigma adderreg [9:0] SigmaLatch; // Latches output of Sigma adderreg [9:0] DeltaB; // B input of Delta adder initial begin DeltaAdder = 10'd0; SigmaAdder = 10'd0; SigmaLatch = 10'd0; DeltaB = 10'd0; endalways @(SigmaLatch) DeltaB = {SigmaLatch[9], SigmaLatch[9]} << (8); always @(DACin or DeltaB) DeltaAdder = DACin + DeltaB; always @(DeltaAdder or SigmaLatch) SigmaAdder = DeltaAdder + SigmaLatch; always @(posedge clk) begin SigmaLatch <= SigmaAdder; DACout <= SigmaLatch[9]; endendmodule

Второй от fpga4fun http://www.fpga4fun.com/PWM_DAC_2.html

module fpga4fun_ds8dac1(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

Существует еще интересная тема с 16 битным дельтасигма, но нет итогового кода

http://electro-music.com/forum/topic-37942.html

module fpga4fun_ds8dac1(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

Еще есть поинтереснее на N Бит

module dac(DACout, DACin, Clk, Reset);output DACout;reg DACout;input [`MSBI:0] DACin;input Clk;input Reset;reg [`MSBI+2:0] DeltaAdder;reg [`MSBI+2:0] SigmaAdder;reg [`MSBI+2:0] SigmaLatch;reg [`MSBI+2:0] DeltaB;always @(SigmaLatch) DeltaB = {SigmaLatch[`MSBI+2], SigmaLatch[`MSBI+2]} << (`MSBI+1);always @(DACin or DeltaB) DeltaAdder = DACin + DeltaB;always @(DeltaAdder or SigmaLatch) SigmaAdder = DeltaAdder + SigmaLatch;always @(posedge Clk or posedge Reset) begin if(Reset) begin SigmaLatch <= #1 1'bl << (`MSBI+1); DACout <= #1 1'b0; end else begin SigmaLatch <== #1 SigmaAdder; DACout <= #1 SigmaLatch[`MSBI+2]; endendendmodule

Существует еще интересная тема с 16 битным дельтасигма, но нет итогового кода

http://electro-music.com/forum/topic-37942.html