60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| 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;
 | |
| 
 |