53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| architecture studentVersion of ex_24_1_5 is
 | |
| 
 | |
|   signal running : std_ulogic;
 | |
|   signal deccel : std_ulogic;
 | |
|   signal counter : unsigned(speedBitNb/2-1 downto 0);
 | |
|   signal accumulator : unsigned(speedBitNb-1 downto 0);
 | |
| 
 | |
| begin
 | |
|   process(clock, reset) begin
 | |
|     if reset = '1' then
 | |
| 
 | |
|       running <= '0';
 | |
|       deccel <= '0';
 | |
|       counter <= (others => '0');
 | |
|       accumulator <= (others => '0');
 | |
|       speed <= (others => '0');
 | |
|       done <= '0';
 | |
|     
 | |
|     elsif rising_edge(clock) then 
 | |
|       
 | |
|       if start = '1' then
 | |
|         running <= '1';
 | |
|         deccel <= '0';
 | |
|         counter <= (others => '0');
 | |
|         accumulator <= (others => '0'); -- Comment this line if you want 2 accel without overflow (l.38-39)
 | |
|       end if;
 | |
| 
 | |
|       if running = '1' then
 | |
|         if deccel = '0' then
 | |
|           counter <= counter + 1;
 | |
|         else
 | |
|           counter <= counter - 1;
 | |
|         end if;
 | |
|         accumulator <= accumulator + counter;
 | |
|         speed <= accumulator;    
 | |
|       end if;
 | |
| 
 | |
|       --if ((counter = 2**(speedBitNb/2-1)) and (deccel = '0')) then -- For 2 accel without overflow
 | |
|       if ((counter = 2**((speedBitNb/2))-2) and (deccel = '0')) then -- For best fit for only one acceleration
 | |
|         deccel <= '1';
 | |
|         done <= '1';
 | |
|       else
 | |
|         done <= '0';
 | |
|       end if;
 | |
| 
 | |
|       if ((deccel = '1') and (counter = 0)) then
 | |
|         running <= '0';
 | |
|       end if;
 | |
| 
 | |
|     end if;
 | |
|   end process;
 | |
| end studentVersion;
 |