Estoy codificando un control de pantalla para el Spartan 3E. Tiene 8 LED. Cuando la señal de estado de la ALU (de otro bloque) es "00", los MSB y LSB se multiplexan en el tiempo durante un segundo cada byte. Cuando el estado no es "00", un LED gira hacia la derecha cada 125 ms. El reloj de la FPGA es de 100 MHz. Tengo el siguiente código:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity display_control is
port (
clk : in std_logic;
rst : in std_logic;
state : in std_logic_vector(1 downto 0);
MSB_result : in std_logic_vector(7 downto 0);
LSB_result : in std_logic_vector(7 downto 0);
leds : out std_logic_vector(7 downto 0));
end display_control;
architecture rtl of display_control is
signal en_1Hz : std_logic;
signal en_8Hz : std_logic;
signal cnt0_next, cnt0_reg : integer;
signal cnt1_next, cnt1_reg : integer;
signal ror_next, ror_reg, x : std_logic_vector(7 downto 0);
signal muxctrl_reg, muxctrl_next : std_logic;
constant PRESCALER0_DIV_FACTOR : integer := 100; --000000; -- 100M = (100MHz/0.5MHz)
constant PRESCALER1_DIV_FACTOR : integer := 12; --500000; -- 12.5M = (100MHz/8MHz)
begin
-- registers
process (clk, rst, en_8Hz, en_1Hz)
begin
if rst = '1' then
cnt0_reg <= 0;
cnt1_reg <= 0;
muxctrl_reg <= '0';
ror_reg <= (others => '0');
elsif clk'event and clk = '1' then
cnt0_reg <= cnt0_next;
cnt1_reg <= cnt1_next;
if en_1Hz = '1' then
muxctrl_reg <= muxctrl_next;
end if;
if en_8Hz = '1' then
ror_reg <= ror_next;
end if;
end if;
end process;
-- register's next state
cnt0_next <= cnt0_reg +1 when cnt0_reg /= PRESCALER0_DIV_FACTOR -1 else 0;
cnt1_next <= cnt1_reg +1 when cnt1_reg /= PRESCALER1_DIV_FACTOR -1 else 0;
muxctrl_next <= not muxctrl_reg;
ror_next <= ror_reg(0) & ror_reg(6 downto 0);
-- prescalers output
en_1Hz <= '1' when cnt0_reg = PRESCALER0_DIV_FACTOR -1 else '0';
en_8Hz <= '1' when cnt1_reg = PRESCALER1_DIV_FACTOR -1 else '0';
-- output logic
x <= LSB_result when muxctrl_reg = '0' else MSB_result;
leds <= x when state = "00" else ror_reg;
end rtl;
Pero cuando sintetizo el código obtengo las siguientes advertencias:
ADVERTENCIA:Xst:3002: este diseño contiene uno o más registros/latches que están directamente incompatible con la arquitectura Spartan6. Las dos causas principales de esto son ya sea un registro o pestillo descrito con un conjunto asíncrono y reinicio asíncrono, o un registro o pestillo descrito con un reinicio asíncrono set o reset que, sin embargo, tiene un valor de inicialización opuesto polaridad (es decir, reinicio asíncrono con un valor de inicialización de 1).
y
ADVERTENCIA:Xst:1426 - El valor init del FF/Latch cnt0_reg_31_LD dificulta la limpieza constante en el bloque display_control. Debería obtener mejores resultados configurando este init en 0.
¿Cómo puedo arreglarlo?
Si entiendo correctamente la segunda advertencia, ISE quisiera que le diera un valor de inicio explícito a algunas de sus señales:
signal cnt0_next, cnt0_reg : integer := 0;
signal cnt1_next, cnt1_reg : integer := 0;
FarhadA