62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| library Common;
 | |
|   use Common.CommonLib.all;
 | |
| 
 | |
| ARCHITECTURE studentVersion OF unitCounter IS
 | |
| 
 | |
|   signal unitCounter: unsigned(requiredBitNb(unitCountDivide)-1 downto 0);
 | |
|   signal unitCountDone: std_ulogic;
 | |
|   signal unitNbCounter: unsigned(unitnB'range);
 | |
|   signal unitNbCountDone: std_ulogic;
 | |
| 
 | |
| BEGIN
 | |
|                                                        -- count unit base period
 | |
|   countUnitDuration: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       unitCounter <= (others => '0');
 | |
|     elsif rising_edge(clock) then
 | |
|       if unitCounter = 0 then
 | |
|         if (startCounter = '1') or (unitNbCounter > 0) then
 | |
|           unitCounter <= unitCounter + 1;
 | |
|         end if;
 | |
|       else
 | |
|         if unitCountDone = '0' then
 | |
|           unitCounter <= unitCounter + 1;
 | |
|         else
 | |
|           unitCounter <= (others => '0');
 | |
|         end if;
 | |
|       end if;
 | |
|     end if;
 | |
|   end process countUnitDuration;
 | |
| 
 | |
|   unitCountDone <= '1' when unitCounter = unitCountDivide
 | |
|     else '0';
 | |
|                                                      -- count unit period number
 | |
|   countPeriods: process(reset, clock)
 | |
|   begin
 | |
|     if reset = '1' then
 | |
|       unitNbCounter <= (others => '0');
 | |
|     elsif rising_edge(clock) then
 | |
|       if unitNbCounter = 0 then
 | |
|         if startCounter = '1' then
 | |
|           unitNbCounter <= unitNbCounter + 1;
 | |
|         end if;
 | |
|       else
 | |
|         if unitNbCountDone = '0' then
 | |
|           if unitCountDone = '1' then
 | |
|             unitNbCounter <= unitNbCounter + 1;
 | |
|           end if;
 | |
|         else
 | |
|           unitNbCounter <= (others => '0');
 | |
|         end if;
 | |
|       end if;
 | |
|     end if;
 | |
|   end process countPeriods;
 | |
| 
 | |
|   unitNbCountDone <= '1' when (unitNbCounter = unitNb) and (unitCountDone = '1')
 | |
|     else '0';
 | |
| 
 | |
|   done <= unitNbCountDone;
 | |
| 
 | |
| END ARCHITECTURE studentVersion;
 |