Pestillo VHDL para Xilinx Spartan 3E

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?

No debe combinar el proceso cronometrado y combinatorio en uno. Aunque la herramienta acepta esto, no es el estilo de codificación correcto. Debe dividir su proceso en 2 procesos separados, uno con (clk, rst) en la lista de sensibilidad y el segundo con (en_8Hz, en_1Hz) en él.

Respuestas (1)

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;