mirror of
				https://github.com/Klagarge/Cursor.git
				synced 2025-10-31 05:59:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| ARCHITECTURE rtl OF rotaryToUnsigned IS
 | |
| 
 | |
|   signal rotaryDelayed1, rotaryDelayed2, rotaryStable : unsigned(rotary'range);
 | |
|   signal rotary_changed : std_ulogic;
 | |
|   signal glitchDelayCounter : unsigned(counterBitNb-1 downto 0);
 | |
|   signal rotaryStableDelayed : unsigned(rotary'range);
 | |
|   signal numberMsbs : unsigned(number'length-rotary'length-1 downto 0);
 | |
| 
 | |
| BEGIN
 | |
|   ------------------------------------------------------------------------------
 | |
|                                          -- synchronize input and detect changes
 | |
|   delayRotary: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       rotaryDelayed1 <= (others => '0');
 | |
|       rotaryDelayed2 <= (others => '0');
 | |
|     elsif rising_edge(clock) then
 | |
|       rotaryDelayed1 <= rotary;
 | |
|       rotaryDelayed2 <= rotaryDelayed1;
 | |
|     end if;
 | |
|   end process delayRotary;
 | |
| 
 | |
|   rotary_changed <= '1' when rotaryDelayed1 /= rotaryDelayed2
 | |
|     else '0';
 | |
|                                                               -- count dead time
 | |
|   countDeadTime: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       glitchDelayCounter <= (others => '1');
 | |
|     elsif rising_edge(clock) then
 | |
|       if rotary_changed = '1' then
 | |
|         glitchDelayCounter <= (others => '1');
 | |
|       elsif glitchDelayCounter > 0 then
 | |
|         glitchDelayCounter <= glitchDelayCounter - 1;
 | |
|       end if;
 | |
|     end if;
 | |
|   end process countDeadTime;
 | |
|                                                 -- store new rotary button value
 | |
|   storeRotary: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       rotaryStable <= (others => '0');
 | |
|     elsif rising_edge(clock) then
 | |
|       if glitchDelayCounter = 0 then
 | |
|         rotaryStable <= rotaryDelayed2;
 | |
|       end if;
 | |
|     end if;
 | |
|   end process storeRotary;
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|                                      -- keep previous value of stablilzed rotary
 | |
|   delayRotaryStable: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       rotaryStableDelayed <= (others => '0');
 | |
|     elsif rising_edge(clock) then
 | |
|       rotaryStableDelayed <= rotaryStable;
 | |
|     end if;
 | |
|   end process delayRotaryStable;
 | |
|                                          -- synchronize input and detect changes
 | |
|   updateMsbs: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       numberMsbs <= (others => '0');
 | |
|     elsif rising_edge(clock) then
 | |
|       if (rotaryStable = 0) and (rotaryStableDelayed+1 = 0) then
 | |
|         numberMsbs <= numberMsbs + 1;
 | |
|       elsif (rotaryStable+1 = 0) and (rotaryStableDelayed = 0) then
 | |
|         numberMsbs <= numberMsbs - 1;
 | |
|       end if;
 | |
|     end if;
 | |
|   end process updateMsbs;
 | |
| 
 | |
|   number <= numberMsbs & rotaryStableDelayed;
 | |
| 
 | |
| END ARCHITECTURE rtl;
 |