El proceso debe reaccionar en los bordes ascendentes y descendentes de MainClk. La única diferencia es que también puede restablecer las variables si se cumplen las condiciones de reloj ascendente. Como manejo todas las posibles condiciones del reloj por separado, ¿por qué me da un error?
ERROR:Xst:827 - "D:/Projects/Xilinx/blincker/blinker_mod.vhd" line 47: Signal PixlCounter cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.
Aquí está el script:
COUNT4: PROCESS(MainClk)
BEGIN
IF RISING_EDGE(MainClk) THEN
IF Stop = '1' OR SLEEP = '1' THEN
FastCounter :=(OTHERS => '0');
PixlCounter :=(OTHERS => '0');
ELSIF (MainCounter >= 35) THEN
IF FastCounter >= 3 THEN
FastCounter := (OTHERS => '0');
PixlCounter := PixlCounter + 1;
ELSE FastCounter := FastCounter + 1;
END IF;
ELSE NULL;
END IF;
ELSIF FALLING_EDGE(MainClk) THEN
IF (MainCounter >= 35) THEN
IF FastCounter >= 3 THEN
FastCounter := (OTHERS => '0');
PixlCounter := PixlCounter + 1;
ELSE FastCounter := FastCounter + 1;
END IF;
ELSE NULL;
END IF;
ELSE NULL;
END IF;
END PROCESS COUNT4;
EDIT
Dado que el proceso se produce al cambiar MainClk (el clima está subiendo o bajando), ¿por qué no es práctico simplemente verificar si está subiendo o bajando si MainClk = '1' o = '0':
COUNT4: PROCESS(MainClk)
BEGIN
IF MainClk = '1' THEN
IF Stop = '1' OR Sleep = '1' THEN
FastCounter :=(OTHERS => '0');
PixlCounter :=(OTHERS => '0');
ELSIF (MainCounter >= 35) THEN
IF FastCounter >= 3 THEN
FastCounter := (OTHERS => '0');
PixlCounter := PixlCounter + 1;
ELSE FastCounter := FastCounter + 1;
END IF;
ELSE NULL;
END IF;
ELSE
IF (MainCounter >= 35) THEN
IF FastCounter >= 3 THEN
FastCounter := (OTHERS => '0');
PixlCounter := PixlCounter + 1;
ELSE FastCounter := FastCounter + 1;
END IF;
ELSE NULL;
END IF;
END IF;
END PROCESS COUNT4;