VHDL-Latch für Xilinx Spartan 3E

Ich codiere eine Anzeigesteuerung für den Spartan 3E. Es hat 8 LEDs. Wenn das Zustandssignal der ALU (von einem anderen Block) "00" ist, werden die MSBs und LSBs für eine Sekunde pro Byte zeitgemultiplext. Wenn der Zustand nicht "00" ist, wird eine LED alle 125 ms nach rechts gedreht. Der FPGA-Takt beträgt 100 MHz. Ich habe folgenden Code:

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;

Aber wenn ich den Code synthetisiere, erhalte ich die folgenden Warnungen:

WARNUNG:Xst:3002 - Dieses Design enthält ein oder mehrere Register/Latches, die direkt sind
   nicht kompatibel mit der Spartan6-Architektur. Die beiden Hauptursachen dafür sind
   entweder ein Register oder ein Latch, das sowohl mit einem asynchronen Satz als auch beschrieben wird
   asynchrones Zurücksetzen oder ein Register oder Latch, das mit einem asynchronen beschrieben wird
   set oder reset, die jedoch einen entgegengesetzten Initialisierungswert hat
   Polarität (dh asynchroner Reset mit einem Initialisierungswert von 1).

Und

WARNING:Xst:1426 - Der Wert init des FF/Latch cnt0_reg_31_LD verhindert die ständige Reinigung im Block display_control.
   Sie sollten bessere Ergebnisse erzielen, wenn Sie diese Initialisierung auf 0 setzen.

Wie kann ich es reparieren?

Sie sollten getaktete und kombinatorische Verfahren nicht in einem kombinieren. Auch wenn das Tool dies akzeptiert, ist es nicht der richtige Codierungsstil. Sie sollten Ihren Prozess in 2 separate Prozesse aufteilen, einen mit (clk, rst) in der Empfindlichkeitsliste und den zweiten mit (en_8Hz, en_1Hz) darin.

Antworten (1)

Wenn ich die zweite Warnung richtig verstehe, möchte ISE, dass Sie einigen Ihrer Signale einen expliziten Startwert geben:

signal cnt0_next, cnt0_reg : integer := 0;
signal cnt1_next, cnt1_reg : integer := 0;