Tengo una pregunta general sobre la eficiencia de una máquina de estado sintetizable.
La primera versión usa el mismo contador para cada estado. El segundo usa un contador propio para cada estado. ¿Qué versión de las dos es más eficiente (área lógica, velocidad ...)?
¿Cuánta área del FPGA está ocupada por el enrutamiento de la señal count1 cuando uso el mismo contador para cada estado? ¿Es mejor usar un contador para cada estado?
Espero que alguien con más experiencia pueda explicar qué solución es la mejor (quizás una tercera versión) y por qué.
¡Gracias!
Saludos cordiales,
Oliver
- 1. Versión ========================================== =====================
signal count1: integer range 0 to 1000 := 1000;
type mystates is (s1, s2, s3, s4);
signal mymode: mystates := s1;
BEGIN
MyProcess: process(clk)
BEGIN
IF (clk'event and clk = '1') THEN
case mymode is
when s1 =>
If (count1 = 0) then
mymode <= s2;
count1 <= 555;
-- (stuff)
else
count1 <= count1 - 1;
end if;
when s2 =>
If (count1 = 0) then
mymode <= s3;
count1 <= 666;
-- (stuff)
else
count1 <= count1 - 1;
end if;
when s3 =>
If (count1 = 0) then
mymode <= s4;
count1 <= 784;
-- (stuff)
else
count1 <= count1 - 1;
end if;
when s4 =>
If (count1 = 0) then
mymode <= s1;
count1 <= 1000;
-- (stuff)
else
count1 <= count1 - 1;
end if;
when others =>
Null;
end case;
END IF;
end process;
- 2. Versión ========================================== =====================
signal count1, count2, count3, count4: integer range 0 to 1000 := 1000;
type mystates is (s1, s2, s3, s4);
signal mymode: mystates := s1;
BEGIN
MyProcess: process(clk)
BEGIN
IF (clk'event and clk = '1') THEN
case mymode is
when s1 =>
If (count1 = 0) then
mymode <= s2;
count1 <= 555;
-- (stuff)
else
count1 <= count1 - 1;
end if;
when s2 =>
If (count2 = 0) then
mymode <= s3;
count2 <= 666;
-- (stuff)
else
count2 <= count2 - 1;
end if;
when s3 =>
If (count3 = 0) then
mymode <= s4;
count3 <= 784;
-- (stuff)
else
count3 <= count3 - 1;
end if;
when s4 =>
If (count4 = 0) then
mymode <= s1;
count4 <= 1000;
-- (stuff)
else
count4 <= count4 - 1;
end if;
when others =>
Null;
end case;
END IF;
end process;