3

None of the answer on the internet worked for me as I am a beginner in VHDL.

I am making a password interface in vhdl with pushbuttons and LEDs. My program simulates correctly as expected.

Basically, I want LEDs to blink when entering wrong password but glow continuously when entering correct password. You can see, this works in simulation.

SIMULATION IMAGE (In simulation first wrong password is entered and then the correct password)

While synthesizing, following main warning occurs:

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.
.
.
.

The VHDL Code is :

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;

I understand that the variable ncount is being trimmed but I require it. The variable ncount is used to create a delay of 4 seconds using variable dcount which is used to create a delay of 0.5 seconds. Without variable ncount I cannot create delay for 4 seconds.

The complete warnings are:

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.

The FPGA development board I am using is: Xilinx Spartan 6 XC6SLX9 TQG144. Please, Help me.

Pankaj Kumar
  • 131
  • 12
  • The first slug of these is from declaring something as an integer instead of a constrained integer. entry_pass.ncount only has a range of 1 to 8. You don't apparently need the rest of it in your expressed code. Think binary/digital logic and what the numbers mean. An unconstrained integer is elaborated in synthesis as 32 bit binary and represents a two's complement value. If you only use four bits of it you're going to see the rest trimmed. –  Aug 11 '17 at 16:19
  • 1
    Possible duplicate of [VHDL Synthesis - FF/Latch Constant Value](https://stackoverflow.com/questions/16087307/vhdl-synthesis-ff-latch-constant-value) –  Aug 11 '17 at 16:29
  • Thankyou, @user1155120 for your comment, the code in the answer i posted solved my problem. However, you may like to enlighten us with the reason behind the code. – Pankaj Kumar Aug 11 '17 at 16:54

1 Answers1

0

I solved this problem myself. Thankyou everyone.

Replace Variables with Signals and add CONSTRAINTS (their range of values)

Adding constraints to variables may solve the problem.

The fact that my program was able to synthesize without any warning after changing variables (like i, dcount, ncount) to signals, makes me think that the problem was Scope of If Statement. Since the assignment operation on variables were inside nested if statements, synthesizer didn't find the change of values of variables in required scope and assumed it to be having constant value. The scope of signals are much better than variables.

HOWEVER, The reason I stated above can be wrong as I am beginner. But here is the code which solved my problem.

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;

This was my first question on this website. I will upvote every responses. I had a nice experience. Thankyou.

Pankaj Kumar
  • 131
  • 12
  • Your reasoning for why the warnings disappeared doesn't appear valid. It wasn't because they were signals, it was because they were constrained, which you could have done to the original variables. –  Aug 11 '17 at 21:22