1

I have a problem trying to add my integer signal and trying to decode it on my segment. BTW, our project is try to display the incremented value when one switch is click. There are 3 switches (swA,swB,swC). Initially, all 3 segments are 0,0,0 if you click switchA, it will display = 1,0,0 then.. if you click switchC, it will display = 1,0,2 then.. if you click switchB, it will display = 1,3,2 then.. if you click switchC, it will display = 1,3,4

so the algorithm goes like that. my problem is the addition part. my decoder codes are fine but my sequence when clicking, jumps +4, +2, +8. I think my problem is on my addition algorithm, or im not sure maybe its on my frequency division.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;



entity SwitchCounterModule is
    port( SegmentIndicator: inout STD_LOGIC_VECTOR(6 downto 0);
            SegmentA : inout STD_LOGIC_VECTOR(6 downto 0);
            SegmentB : inout STD_LOGIC_VECTOR(6 downto 0);
            SegmentC : inout STD_LOGIC_VECTOR(6 downto 0);
            SwitchA : in STD_LOGIC;
            SwitchB : in STD_LOGIC;
            SwitchC : in STD_LOGIC);
end SwitchCounterModule;

architecture Behavioral of SwitchCounterModule is
signal counter :std_logic_vector(3 downto 0);

signal sumOut1: integer;





begin
process(sumOut1)
begin

        sumOut1<=5;
        if SwitchA = '1' then
        SegmentIndicator <= "0001000"; --A

            sumOut1 <= sumOut1 +1;


            if(sumOut1>9)then
            sumOut1<= 0;


            case sumOut1 is
            when 0 => SegmentA <="1000000";  -- '0'
            when 1 => SegmentA <="1111001";  -- '1'
            when 2 => SegmentA <="0100100";  -- '2'
            when 3 => SegmentA <="0110000";  -- '3'
            when 4 => SegmentA <="0011001";  -- '4' 
            when 5 => SegmentA <="0010010";  -- '5'
            when 6 => SegmentA <="0000010";  -- '6'
            when 7 => SegmentA <="1111000";  -- '7'
            when 8 => SegmentA <="0000000";  -- '8'
            when others => SegmentA <="0010000"; -- '9'
            end case;

            else                        
            case sumOut1 is
            when 0 => SegmentA <="1000000";  -- '0'
            when 1 => SegmentA <="1111001";  -- '1'
            when 2 => SegmentA <="0100100";  -- '2'
            when 3 => SegmentA <="0110000";  -- '3'
            when 4 => SegmentA <="0011001";  -- '4' 
            when 5 => SegmentA <="0010010";  -- '5'
            when 6 => SegmentA <="0000010";  -- '6'
            when 7 => SegmentA <="1111000";  -- '7'
            when 8 => SegmentA <="0000000";  -- '8'
            when others => SegmentA <="0010000"; -- '9'
            end case;
            end if;



        elsif SwitchB = '1' then
            SegmentIndicator <= "0000011"; --B

            sumOut1 <= sumOut1 +1;


            if(sumOut1=10)then
            sumOut1<= 0;
            case sumOut1 is
            when 0 => SegmentB <="1000000";  -- '0'
            when 1 => SegmentB <="1111001";  -- '1'
            when 2 => SegmentB <="0100100";  -- '2'
            when 3 => SegmentB <="0110000";  -- '3'
            when 4 => SegmentB <="0011001";  -- '4' 
            when 5 => SegmentB <="0010010";  -- '5'
            when 6 => SegmentB <="0000010";  -- '6'
            when 7 => SegmentB <="1111000";  -- '7'
            when 8 => SegmentB <="0000000";  -- '8'
            when others => SegmentB <="0010000"; -- '9'
            end case;

            else    
            case sumOut1 is
            when 0 => SegmentB <="1000000";  -- '0'
            when 1 => SegmentB <="1111001";  -- '1'
            when 2 => SegmentB <="0100100";  -- '2'
            when 3 => SegmentB <="0110000";  -- '3'
            when 4 => SegmentB <="0011001";  -- '4' 
            when 5 => SegmentB <="0010010";  -- '5'
            when 6 => SegmentB <="0000010";  -- '6'
            when 7 => SegmentB <="1111000";  -- '7'
            when 8 => SegmentB <="0000000";  -- '8'
            when others => SegmentB <="0010000"; -- '9'
            end case;
            end if;



        elsif SwitchC = '1' then

            SegmentIndicator <= "1000110"; --C

            sumOut1 <= sumOut1 +1;


            if(sumOut1=10)then
            sumOut1<= 0;
            case sumOut1 is
            when 0 => SegmentC <="1000000";  -- '0'
            when 1 => SegmentC <="1111001";  -- '1'
            when 2 => SegmentC <="0100100";  -- '2'
            when 3 => SegmentC <="0110000";  -- '3'
            when 4 => SegmentC <="0011001";  -- '4' 
            when 5 => SegmentC <="0010010";  -- '5'
            when 6 => SegmentC <="0000010";  -- '6'
            when 7 => SegmentC <="1111000";  -- '7'
            when 8 => SegmentC <="0000000";  -- '8'
            when others => SegmentC <="0010000"; -- '9'
            end case;

            else

            case sumOut1 is
            when 0 => SegmentC <="1000000";  -- '0'
            when 1 => SegmentC <="1111001";  -- '1'
            when 2 => SegmentC <="0100100";  -- '2'
            when 3 => SegmentC <="0110000";  -- '3'
            when 4 => SegmentC <="0011001";  -- '4' 
            when 5 => SegmentC <="0010010";  -- '5'
            when 6 => SegmentC <="0000010";  -- '6'
            when 7 => SegmentC <="1111000";  -- '7'
            when 8 => SegmentC <="0000000";  -- '8'
            when others => SegmentC <="0010000"; -- '9'
            end case;
            end if;

        else
            sumOut1<=sumOut1;
            SegmentA<=SegmentA;
            SegmentB<=SegmentB;
            SegmentC<=SegmentC;

        end if;

        end process;
end Behavioral;
Johnny
  • 45
  • 5
  • 3
    Your process is sensitive to `sumOut1`. `sumOut1` is thus an input. But the process also modifies `sumOut1` which is thus also an output. You created a combinatorial loop. Moreover, the sensitivity list is incomplete: the switches are also inputs. There is no clock of any kind, so no registers. How do you think your circuit will store the current values between two actions on the switches? You should probably stop thinking as a software engineer and first decide which hardware you need (no VHDL yet, just paper and pencils). Coding only comes next. – Renaud Pacalet Jul 18 '17 at 06:46
  • 1
    I am impressed that the synthesis tool actually made some implementation that 'kind of' works. Because this description is kind of hard to map to an FPGA. You really need to implement clock synchronous logic. Don't forget to use synchronizers and debounce logic on the external switches. – JHBonarius Jul 18 '17 at 07:34
  • 1
    You should use `ieee.numeric_std` instead of `ieee.std_logic_arith` and `ieee.std_logic_unsigned`. The latter are not actually standard. – mkrieger1 Jul 19 '17 at 12:31

1 Answers1

1

i found some mistakes in your design and i have corrected them. i did't understand your exact requirement like u want individual increment are all at a time. any how i understand the problem with counter and i have rectified it. the code is

`library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;



entity SwitchCounterModule is
    port( SegmentIndicator: out STD_LOGIC_VECTOR(6 downto 0);
            SegmentA : out STD_LOGIC_VECTOR(6 downto 0);
            SegmentB : out STD_LOGIC_VECTOR(6 downto 0);
            SegmentC : out STD_LOGIC_VECTOR(6 downto 0);
            SwitchA : in STD_LOGIC;
            SwitchB : in STD_LOGIC;
            SwitchC : in STD_LOGIC;
            clk : in STD_LOGIC;
            rst : in STD_LOGIC);
end SwitchCounterModule;

architecture Behavioral of SwitchCounterModule is
signal counter :std_logic_vector(3 downto 0);

signal sumOut1: std_logic_vector(3 downto 0);

begin
process(SwitchA,SwitchB,sumOut1,SwitchC,clk,rst)
begin   
if rst = '1' then
        sumOut1 <=  "0000";
         SegmentA <= "0000000";
         SegmentB <= "0000000";
         SegmentC <= "0000000";
         SegmentIndicator <= "1111111";

    elsif (clk='1' and clk'event) then

        --sumOut1 <= "00000" ;  --sumOut1 assigned with 5
        if SwitchA = '1' then   -- when pressing SwitchA

                SegmentIndicator <= "0001000"; --A indicating a
            sumOut1 <= sumOut1 +1; --integer increased to next value

            if(sumOut1>9)then -- the integer value is greater than 9 then sumout1 =0
                    sumOut1<= "0000";

            else                        
            case sumOut1 is
            when "0000" => SegmentA <="1000000";  -- '0'
            when "0001"=> SegmentA <="1111001";  -- '1'
            when "0010" => SegmentA <="0100100";  -- '2'
            when "0011"=> SegmentA <="0110000";  -- '3'
            when "0100" => SegmentA <="0011001";  -- '4' 
            when "0101" => SegmentA <="0010010";  -- '5'
            when "0110" => SegmentA <="0000010";  -- '6'
            when "0111" => SegmentA <="1111000";  -- '7'
            when "1000" => SegmentA <="0000000";  -- '8'
            when "1001" => SegmentA <="0010000"; -- '9'
                when others => SegmentA <="1111111"; -- '9'
            end case;
            end if;



        elsif SwitchB = '1' then
            SegmentIndicator <= "0000011"; --B

            sumOut1 <= sumOut1 +1;


            if(sumOut1=10)then
            sumOut1<= "0000";


            else    
            case sumOut1 is
            when "0000" => SegmentA <="1000000";  -- '0'
            when "0001"=> SegmentA <="1111001";  -- '1'
            when "0010" => SegmentA <="0100100";  -- '2'
            when "0011"=> SegmentA <="0110000";  -- '3'
            when "0100" => SegmentA <="0011001";  -- '4' 
            when "0101" => SegmentA <="0010010";  -- '5'
            when "0110" => SegmentA <="0000010";  -- '6'
            when "0111" => SegmentA <="1111000";  -- '7'
            when "1000" => SegmentA <="0000000";  -- '8'
            when "1001" => SegmentA <="0010000"; -- '9'
                when others => SegmentA <="1111111"; -- '9'
            end case;
            end if;



        elsif SwitchC = '1' then

            SegmentIndicator <= "1000110"; --C

            sumOut1 <= sumOut1 +1;


            if(sumOut1=10)then
            sumOut1<= "0000";


            else

            case sumOut1 is
            when "0000" => SegmentA <="1000000";  -- '0'
            when "0001"=> SegmentA <="1111001";  -- '1'
            when "0010" => SegmentA <="0100100";  -- '2'
            when "0011"=> SegmentA <="0110000";  -- '3'
            when "0100" => SegmentA <="0011001";  -- '4' 
            when "0101" => SegmentA <="0010010";  -- '5'
            when "0110" => SegmentA <="0000010";  -- '6'
            when "0111" => SegmentA <="1111000";  -- '7'
            when "1000" => SegmentA <="0000000";  -- '8'
            when "1001" => SegmentA <="0010000"; -- '9'
                when others => SegmentA <="1111111"; -- '9'
            end case;
            end if;

        else
            sumOut1<=sumOut1;


        end if;
end if;
        end process;
end Behavioral;
`

if you want individual take sumout1, sumout2, sumout3 for each switch.

venkat pasumarti
  • 138
  • 1
  • 1
  • 12