Mira este fragmento de código (voltea la imagen en X)
PROCESS(iCLK)
BEGIN
IF (rising_edge(iCLK)) THEN
-- Mise en mémoire du pixel
ram(640*IdxC + PixX) <= PIXIN;
-- Choix traitement
IF (SWITCH='1') THEN
PIXOUT <= ram(640*((IdxC + 1) mod 2) + PixX);
ELSE
PIXOUT <= ram(640*(2-IdxC) - PixX + 1);
END IF;
END IF;
END PROCESS;
Cuando lo compilo, el proyecto general toma aproximadamente el 15% de los elementos lógicos y el 13% de los bits de memoria total (QuartusII en el ciclón III). Si cambio el código a
PROCESS (iCLK)
BEGIN
IF(rising_edge(iCLK)) THEN
-- Mise en mémoire du pixel
ram(640*IdxC + PixX) <= PIXIN;
-- Choix traitement
IF (SWITCH='1') THEN
PIXOUT <= ram(640*((IdxC + 1) mod 2) + PixX);
ELSE
IF (PixX > 1 AND PixX < 640) THEN
PIXOUT <= ram(640*(2-IdxC) - PixX + 1);
ELSE
PIXOUT <= x"111";
END IF;
END IF;
END IF;
END PROCESS;
me sale
Error (276003): Cannot convert all sets of registers into RAM megafunctions when creating nodes. The resulting number of registers remaining in design exceeds the number of registers in the device or the number specified by the assignment max_number_of_registers_from_uninferred_rams. This can cause longer compilation time or result in insufficient memory to complete Analysis and Synthesis
Parece que ya no puedo encajar el diseño. Yo no creo esto. ¿Hay algún error en el compilador o estoy haciendo algo mal?
Tengo la edición web de Quartus II
Simplemente poniendo algunos comentarios --
en las líneas como esta y compila nuevamente:
PROCESS (iCLK)
BEGIN
IF (rising_edge(iCLK)) THEN
-- Mise en mémoire du pixel
ram(640*IdxC + PixX) <= PIXIN;
-- Choix traitement
IF (SWITCH='1') THEN
PIXOUT <= ram(640*((IdxC + 1) mod 2) + PixX);
ELSE
-- IF (PixX > 1 AND PixX < 640) THEN
PIXOUT <= ram(640*(2-IdxC) - PixX + 1);
-- ELSE
-- PIXOUT <= x"111";
-- END IF;
END IF;
END IF;
END PROCESS;
Este código funciona con el puerto Megafunction RAM 2:
PROCESS (iCLK)
BEGIN
IF rising_edge(iCLK) THEN
-- Ecrire linéairement dans la RAM le pixel de la cam
RAMWRITE <= TO_UNSIGNED(640*IdxC + PixX - 1, 11);
-- Choix traitement
IF (SWITCH='1') THEN
RAMREAD <= TO_UNSIGNED(640*((IdxC + 1) mod 2) + PixX - 1, 11);
PIXOUT <= PIXMEM;
ELSE
RAMREAD <= TO_UNSIGNED(640*(2-IdxC) - PixX, 11);
IF (PixX > 1 AND PixX < 640) THEN
PIXOUT <= PIXMEM;
ELSE
PIXOUT <= x"FFF";
END IF;
END IF;
END IF;
END PROCESS;