ARCHITECTURE order2_masterVersion OF DAC IS constant attenuationShift: positive := 3; constant acc1BitNb: positive := parallelIn'length+5; constant acc2BitNb: positive := parallelIn'length+5; signal parallelIn1, parallelIn2: signed(parallelIn'high downto 0); signal acc1: signed(acc1BitNb-1 downto 0); signal acc2: signed(acc2BitNb-1 downto 0); constant c1: signed(acc1'range) := shift_left(to_signed(1, acc1'length), parallelIn'length-1); constant c2: signed(acc2'range) := resize(shift_left(c1, 4), acc2'length); signal quantized: std_ulogic; BEGIN ------------------------------------------------------------------------------ -- offset input to signed values parallelIn1(parallelIn1'high) <= not parallelIn(parallelIn'high); parallelIn1(parallelIn1'high-1 downto 0) <= signed(parallelIn(parallelIn'high-1 downto 0)); -- attenuate signal parallelIn2 <= parallelIn1 - shift_right(parallelIn1, attenuationShift); ------------------------------------------------------------------------------ -- SD integrators integrate1: process(reset, clock) begin if reset = '1' then acc1 <= (others => '0'); elsif rising_edge(clock) then if quantized = '1' then acc1 <= acc1 + resize(parallelIn2, acc1'length) - c1; else acc1 <= acc1 + resize(parallelIn2, acc1'length) + c1; end if; end if; end process integrate1; integrate2: process(reset, clock) begin if reset = '1' then acc2 <= (others => '0'); elsif rising_edge(clock) then if quantized = '1' then acc2 <= acc2 + resize(acc1, acc2'length) - c2; else acc2 <= acc2 + resize(acc1, acc2'length) + c2; end if; end if; end process integrate2; ------------------------------------------------------------------------------ -- test last integrator output quantized <= '1' when acc2 >= 0 else '0'; serialOut <= quantized; END ARCHITECTURE order2_masterVersion;