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?
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;
FarhadA