Reputation: 45
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;
Upvotes: 1
Views: 75
Reputation: 128
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.
Upvotes: 1