Предупреждение VHDL Xst:1293 FF/Latch имеет постоянное значение 0

Ни один из ответов в Интернете не помог мне, так как я новичок в VHDL.

Я делаю интерфейс пароля в vhdl с кнопками и светодиодами. Моя программа имитирует правильно, как и ожидалось.

По сути, я хочу, чтобы светодиоды мигали при вводе неправильного пароля, но постоянно светились при вводе правильного пароля. Вы видите, это работает в симуляции.

ИМИТИРОВАННОЕ ИЗОБРАЖЕНИЕ (при моделировании сначала вводится неправильный пароль, а затем правильный)

При синтезе возникает следующее основное предупреждение:

Optimizing unit <safehouse> ...
WARNING:Xst:1293 - FF/Latch <entry_pass.ncount_6> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_7> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
.
.
.

Код VHDL:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity safehouse is
    Port ( keyled : out  STD_LOGIC_VECTOR(0 TO 4);
              keypad : in STD_LOGIC_VECTOR(0 to 7);
              clk : in STD_LOGIC );
end safehouse;

architecture safehouse of safehouse is

signal temp : std_logic_vector(0 to 7) := "00000000";

begin

entry_pass: process(clk,keypad,temp)

    type integer_vector is array (0 to 3) of integer;
    variable i : integer := 0;
    constant passoriginal : integer_vector := (2,5,2,6);
    variable passcode : integer_vector := (0,0,0,0);
    variable dcount : integer := 0;
    variable ncount : integer := 0;

begin
    if (rising_edge(clk)) then

            keyled(4) <= '1';

            if i < 4 then

                keyled(0) <= '1';

                if (temp /= keypad) then
                    case keypad is
                        when "10001000" => 
                            passcode(i) := 1;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "10000100" => 
                            passcode(i) := 2;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "10000010" => 
                            passcode(i) := 3;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "10000001" => 
                            passcode(i) := 10;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "01001000" => 
                            passcode(i) := 4;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "01000100" => 
                            passcode(i) := 5;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "01000010" => 
                            passcode(i) := 6;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "01000001" => 
                            passcode(i) := 11;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00101000" => 
                            passcode(i) := 7;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00100100" => 
                            passcode(i) := 8;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00100010" => 
                            passcode(i) := 9;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00100001" => 
                            passcode(i) := 12;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00011000" => 
                            passcode(i) := 14;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00010100" => 
                            passcode(i) := 0;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00010010" => 
                            passcode(i) := 15;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when "00010001" => 
                            passcode(i) := 13;
                            keyled(i+1) <= '1';
                            i := i + 1;
                        when others => 
                            keyled(4) <= '1';
                    end case;
                    temp <= keypad;
                end if;

            else

                if passcode = passoriginal then

                    dcount := dcount + 1;
                    if dcount >= 50000000 then

                        keyled <= ('1','1','1','1','1');

                        dcount := 1;
                        ncount := ncount + 1;

                        if ncount >= 8 then

                            i := 0;
                            passcode := (0,0,0,0);
                            keyled <= ('0','0','0','0','1');

                            ncount := 1;
                        end if;     
                    end if;

                else

                    dcount := dcount + 1;
                    if dcount >= 50000000 then
                        if (ncount rem 2) = 0 then

                            keyled <= ('1','1','1','1','1');

                        else

                            keyled <= ('0','0','0','0','1');

                        end if;
                        dcount := 1;
                        ncount := ncount + 1;

                        if ncount >= 8 then

                            i := 0;
                            keyled <= ('1','0','0','0','1');

                            ncount := 1;
                        end if;
                    end if;                                                                             
                end if;     
            end if;             
    end if;
end process;

end safehouse;

Я понимаю, что переменная ncount обрезается, но мне это нужно. Переменная ncount используется для создания задержки в 4 секунды, а переменная dcount — для создания задержки в 0,5 секунды. Без переменной ncount я не могу создать задержку на 4 секунды.

Полные предупреждения:

WARNING:Xst:1710 - FF/Latch <keyled_4> (without init value) has a constant value of 1 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.

Optimizing unit <safehouse> ...
WARNING:Xst:1293 - FF/Latch <entry_pass.ncount_6> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_7> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_8> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_11> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_9> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_10> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_14> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_12> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_13> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_17> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_15> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_16> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_20> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_18> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_19> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_23> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_21> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_22> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_26> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_24> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_25> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_29> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_27> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_28> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_30> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_31> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.dcount_26> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.dcount_29> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.dcount_27> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.dcount_28> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.dcount_30> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.dcount_31> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_3> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_4> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_5> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_6> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_7> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_8> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_9> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_10> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_11> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_12> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_13> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_14> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_15> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_16> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_17> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_18> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_19> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_20> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_21> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_22> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_23> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_24> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_25> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_26> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_27> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_28> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_29> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_30> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.i_31> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_4> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_3> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <entry_pass.ncount_5> has a constant value of 0 in block <safehouse>. This FF/Latch will be trimmed during the optimization process.

Я использую плату разработки FPGA: Xilinx Spartan 6 XC6SLX9 TQG144. Пожалуйста, помогите мне.


person Pankaj Kumar    schedule 11.08.2017    source источник
comment
Первый из них связан с объявлением чего-либо как целого числа вместо ограниченного целого числа. entry_pass.ncount имеет только диапазон от 1 до 8. Очевидно, вам не нужна остальная часть в вашем выраженном коде. Подумайте о двоичной/цифровой логике и о том, что означают числа. Неограниченное целое число обрабатывается при синтезе как 32-битный двоичный код и представляет собой значение дополнения до двух. Если вы используете только четыре его части, вы увидите, что остальные будут обрезаны.   -  person    schedule 11.08.2017
comment
Возможный дубликат VHDL Synthesis — FF/Latch Constant Value   -  person    schedule 11.08.2017
comment
Спасибо, @ user1155120 за ваш комментарий, код в ответе, который я разместил, решил мою проблему. Тем не менее, вы можете просветить нас о причине кода.   -  person Pankaj Kumar    schedule 11.08.2017


Ответы (1)


Я сам решил эту проблему. Спасибо всем.

Замените переменные сигналами и добавьте ОГРАНИЧЕНИЯ (диапазон их значений)

Добавление ограничений к переменным может решить проблему.

Тот факт, что моя программа смогла выполнить синтез без какого-либо предупреждения после замены переменных (таких как i, dcount, ncount) на сигналы, заставляет меня думать, что проблема заключалась в области действия оператора If. Поскольку операция присваивания переменных находилась внутри вложенных операторов if, синтезатор не находил изменения значений переменных в требуемой области видимости и предполагал, что оно имеет постоянное значение. Объем сигналов намного лучше, чем переменных.

ОДНАКО причина, по которой я изложил выше, может быть неверной, поскольку я новичок. Но вот код, который решил мою проблему.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity safehouse is
    Port ( keyled : out  STD_LOGIC_VECTOR(0 TO 4);
              keypad : in STD_LOGIC_VECTOR(0 to 7);
              clk : in STD_LOGIC );
end safehouse;

architecture safehouse of safehouse is

signal temp : std_logic_vector(0 to 7) := "00000000";
signal dcount : integer range 0 to 100000000 := 0;
signal ncount : integer range 0 to 10 := 0;
signal i : integer range 0 to 5;

begin

entry_pass: process(clk,keypad,temp,dcount,ncount,i)

    type integer_vector is array (0 to 3) of integer;
    constant passoriginal : integer_vector := (2,5,2,6);
    variable passcode : integer_vector := (0,0,0,0);

begin
    if (rising_edge(clk)) then

            keyled(4) <= '1';

            if i < 4 then

                keyled(0) <= '1';

                if (temp /= keypad) then
                    case keypad is
                        when "10001000" => 
                            passcode(i) := 1;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "10000100" => 
                            passcode(i) := 2;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "10000010" => 
                            passcode(i) := 3;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "10000001" => 
                            passcode(i) := 10;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "01001000" => 
                            passcode(i) := 4;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "01000100" => 
                            passcode(i) := 5;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "01000010" => 
                            passcode(i) := 6;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "01000001" => 
                            passcode(i) := 11;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00101000" => 
                            passcode(i) := 7;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00100100" => 
                            passcode(i) := 8;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00100010" => 
                            passcode(i) := 9;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00100001" => 
                            passcode(i) := 12;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00011000" => 
                            passcode(i) := 14;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00010100" => 
                            passcode(i) := 0;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00010010" => 
                            passcode(i) := 15;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when "00010001" => 
                            passcode(i) := 13;
                            keyled(i+1) <= '1';
                            i <= i + 1;
                        when others => 
                            keyled(4) <= '1';
                    end case;
                    temp <= keypad;
                end if;

            else

                if passcode = passoriginal then

                    dcount <= dcount + 1;
                    if dcount >= 50000000 then

                        keyled <= ('1','1','1','1','1');

                        dcount <= 1;
                        ncount <= ncount + 1;

                        if ncount >= 8 then

                            i <= 0;
                            passcode := (0,0,0,0);
                            keyled <= ('0','0','0','0','1');

                            ncount <= 1;
                        end if;     
                    end if;

                else

                    dcount <= dcount + 1;
                    if dcount >= 50000000 then
                        if (ncount rem 2) = 0 then

                            keyled <= ('1','1','1','1','1');

                        else

                            keyled <= ('0','0','0','0','1');

                        end if;
                        dcount <= 1;
                        ncount <= ncount + 1;

                        if ncount >= 8 then

                            i <= 0;
                            keyled <= ('1','0','0','0','1');

                            ncount <= 1;
                        end if;
                    end if;                                                                             
                end if;     
            end if;             
    end if;
end process;

end safehouse;

Это был мой первый вопрос на этом сайте. Я буду голосовать за каждый ответ. У меня был хороший опыт. Спасибо.

person Pankaj Kumar    schedule 11.08.2017
comment
Ваши рассуждения о том, почему предупреждения исчезли, не кажутся действительными. Это было не потому, что они были сигналами, а потому, что они были ограничены, что вы могли бы сделать с исходными переменными. - person ; 12.08.2017