Ich habe ein Problem, den in der Xilinx APP 154 publizerten Code mit dem darunter gezeichneten Diagramm in Einklang zu bringen. Ich vermisse da die eigentliche Delta-Bildung, also die Rückführung der Differenz, dass die Summenzählung auch wieder "rückwaerts" gehen kann und der Ausgang schwingt. Wie ist in dem Zusammnhang die gezeichnete Rückführung (die Zahl mit dem Bit 9 und den vielen Nullen) zu verstehen? Steckt da in impliziertes Abziehen durch Überläufe oder Interpretation des Vectors als Komplement drin?
1 | ‘timescale 100 ps / 10 ps |
2 | ‘define MSBI 7 // Most significant Bit of DAC input |
3 | //This is a Delta-Sigma Digital to Analog Converter |
4 | module dac(DACout, DACin, Clk, Reset); |
5 | output DACout; // This is the average output that feeds low pass filter |
6 | reg DACout; // for optimum performance, ensure that this ff is in IOB |
7 | input [‘MSBI:0] DACin; // DAC input (excess 2**MSBI) |
8 | input Clk; |
9 | input Reset; |
10 | reg [‘MSBI+2:0] DeltaAdder; // Output of Delta adder |
11 | reg [‘MSBI+2:0] SigmaAdder; // Output of Sigma adder |
12 | reg [‘MSBI+2:0] SigmaLatch; // Latches output of Sigma adder |
13 | reg [‘MSBI+2:0] DeltaB; // B input of Delta adder |
14 | always @(SigmaLatch) DeltaB = {SigmaLatch[‘MSBI+2], SigmaLatch[‘MSBI+2]} << (‘MSBI+1); |
15 | always @(DACin or DeltaB) DeltaAdder = DACin + DeltaB; |
16 | always @(DeltaAdder or SigmaLatch) SigmaAdder = DeltaAdder + SigmaLatch; |
17 | always @(posedge Clk or posedge Reset) |
18 | begin |
19 | if(Reset) |
20 | begin |
21 | SigmaLatch <= #1 1’bl << (‘MSBI+1); |
22 | DACout <= #1 1‘b0; |
23 | end |
24 | else |
25 | begin |
26 | SigmaLatch <== #1 SigmaAdder; |
27 | DACout <= #1 SigmaLatch[‘MSBI+2]; |
28 | end |
29 | end |
30 | endmodule |