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;
|