综合期间警告 XST1293 和 XST1896

Warnings XST1293 and XST1896 during synthesis

我目前正在开发一款使用 VHDL 作为编程语言的游戏。我从一开始就能够避免懈怠,但是在这一点上,我完全迷失了...

当我的小马里奥到达终点平台(切换到下一个级别)时,我尝试增加级别编号。所以当他到达这个平台时,信号 nextLevel_i 值 '1'。

我实现了如下代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use     IEEE.NUMERIC_STD.all;

entity level is
    port (
            clk_i                   : in std_Logic;
            reset_i             : in std_Logic;
            nextLevel_i         : in std_Logic;
            elem01_o                : out std_logic_vector (13 downto 0);
            elem02_o                : out std_logic_vector (13 downto 0);
            elem03_o                : out std_logic_vector (13 downto 0);
            elem04_o                : out std_logic_vector (13 downto 0);
            elem05_o                : out std_logic_vector (13 downto 0);
            elem06_o                : out std_logic_vector (13 downto 0);
            elem07_o                : out std_logic_vector (13 downto 0);
            elem08_o                : out std_logic_vector (13 downto 0);
            elem09_o                : out std_logic_vector (13 downto 0);
            elem10_o                : out std_logic_vector (13 downto 0);
            elem11_o                : out std_logic_vector (13 downto 0);
            elem12_o                : out std_logic_vector (13 downto 0);
            elem13_o                : out std_logic_vector (13 downto 0);
            elem14_o                : out std_logic_vector (13 downto 0);
            elem15_o                : out std_logic_vector (13 downto 0);
            elem16_o                : out std_logic_vector (13 downto 0);
            elem17_o                : out std_logic_vector (13 downto 0);
            elem18_o                : out std_logic_vector (13 downto 0);
            elem19_o                : out std_logic_vector (13 downto 0);
            elem20_o                : out std_logic_vector (13 downto 0)
        );
end level;

architecture Behavioral of level is
    signal currentLevel_s       : integer range 0 to 127 := 0;
begin

processLevel : process (currentLevel_s)
begin
    elem01_o <= (others => '0');
    elem02_o <= (others => '0');
    elem03_o <= (others => '0');
    elem04_o <= (others => '0');
    elem05_o <= (others => '0');
    elem06_o <= (others => '0');
    elem07_o <= (others => '0');
    elem08_o <= (others => '0');
    elem09_o <= (others => '0');
    elem10_o <= (others => '0');
    elem11_o <= (others => '0');
    elem12_o <= (others => '0');
    elem13_o <= (others => '0');
    elem14_o <= (others => '0');
    elem15_o <= (others => '0');
    elem16_o <= (others => '0');
    elem17_o <= (others => '0');
    elem18_o <= (others => '0');
    elem19_o <= (others => '0');
    elem20_o <= (others => '0');
    case currentLevel_s is
        when 1 =>
            elem01_o <= "11111001010000";
            elem02_o <= "01110000110000";
            elem03_o <= "01110001010000";
            elem04_o <= "01110001110000";
            elem05_o <= "01110010010000";
            elem06_o <= "01110010110000";
            elem07_o <= "01110011010000";
            elem08_o <= "01110011110000";
            elem09_o <= "01110100010000";
            elem10_o <= "01110100110000";
            elem11_o <= "01110101010000";
            elem12_o <= "01110101110000";
            elem13_o <= "01110110010000";
            elem14_o <= "01110110110000";
            elem15_o <= "01110111010000";
            elem16_o <= "01110111110000";
            elem17_o <= "01111000010000";
            elem18_o <= "01111000110000";
            elem19_o <= "01110011101101";
            elem20_o <= "01110100001100";
        when 2 =>
    elem01_o <= "00010000010010";
        when others =>
            elem01_o <= "00100001010000";
            elem02_o <= "11111001010000";
    end case;
end process processLevel;

----------------------
-- nextLevel Logic
----------------------
processNextLevel : process (clk_i, reset_i)
begin
    if (reset_i = '1') then 
        currentLevel_s <= 0;
    elsif rising_edge(clk_i) then
        if (nextLevel_i = '1') then
            currentLevel_s <= currentLevel_s + 1;
        end if;
    end if;
end process processNextLevel;

end Behavioral;

注:currentLevel_s声明如下:

signal currentLevel_s       : integer range 0 to 127 := 0;

然后我启动了合成并得到以下结果:

我认为出现此结果是因为我不影响 currentLevel_s 的值(if (reset_i = '1') then 后没有 else 子句)。如果条件未满足,我只是想保留当前值。

关于如何解决这些警告的任何想法?

这很简单: 只有当 currentLevel_s 为 1(“01”)或 2(“10”)时,你才做某事。所有其他值都无关紧要。综合工具优化掉所有其他值。

尝试添加 when 127 => [something].

或者只是

signal currentLevel_s : integer range 0 to 3 := 0;

    if nextLevel_i = '1' and currentLevel_s < 3 then
        currentLevel_s <= currentLevel_s + 1;
    end if;