Hallo,
Ik ben laatst begonnen met VHDL en heb nu probeer ik een 4 bits adder te maken, maar om de een om andere reden werkt het 5de bit niet goed (van de uitkomst). Als ik namelijk 1xxx + xxxx optel gaat wordt de uitkomst altijd 1xxxx, maar als ik xxxx + 1xxx dan wordt de uitkomst altijd 0xxxx tenzij ik met 1xxx weer optel. Oftewel van 0 +0 tot 7 + 7 gaat prima, dan komt er ook het goede antwoord uit, en de hogere uitkomsten 13 + 13 tot 16 + 16 gaan ook goed, maar alle uitkomsten daartussenin zijn rare antwoorden weet iemand hoe dit kan en hoe ik dit kan oplossen?
Hier is mijn code:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
entity adder is
port ( a, b, c, d, e, f, g, dp, led1, led2, led3, led4, led5, led6, led7, led8, active1, segA, segB, segC, segD: out std_logic;
led9, led10, led11, led12, led13, active2: out std_logic;
switch1, switch2, switch3, switch4, switch5, switch6, switch7, switch8, clk : in std_logic);
end adder;
architecture schakeling of adder is
signal waarde : std_logic_vector (3 downto 0);
signal waarde2 : std_logic_vector (3 downto 0);
signal output : std_logic_vector (7 downto 0);
signal output2 : std_logic_vector (7 downto 0);
signal output3 : std_logic_vector (7 downto 0);
signal output4 : std_logic_vector (7 downto 0);
signal antwoord : std_logic_vector (4 downto 0);
signal counter : std_logic_vector (1 downto 0);
signal uitgang : std_logic_vector (7 downto 0);
signal clock : std_logic;
signal temp : std_logic_vector (1 downto 0);
begin
--leds aan of uitzetten om waardes weer te geven
led1 <= switch1;
led2 <= switch2;
led3 <= switch3;
led4 <= switch4;
led5 <= switch5;
led6 <= switch6;
led7 <= switch7;
led8 <= switch8;
active1 <= '1';
active2 <= '1';
-- waardes inlezen en optellen
waarde <= (switch1, switch2, switch3, switch4);
waarde2 <= (switch5, switch6, switch7, switch8);
--hier wordt opgeteld
antwoord <= conv_std_logic_vector((conv_integer(waarde) + conv_integer(waarde2)),5);
led9 <= antwoord(0);
led10 <= antwoord(1);
led11 <= antwoord(2);
led12 <= antwoord(3);
led13 <= antwoord(4);
-- hex omzetten naar 7 segments formaat
output <= "00000110" when waarde="0001" else
"01011011" when waarde="0010" else
"01001111" when waarde="0011" else
"01100110" when waarde="0100" else
"01101101" when waarde="0101" else
"11111101" when waarde="0110" else
"00000111" when waarde="0111" else
"01111111" when waarde="1000" else
"11101111" when waarde="1001" else
"01110111" when waarde="1010" else
"01111100" when waarde="1011" else
"00111001" when waarde="1100" else
"01011110" when waarde="1101" else
"01111001" when waarde="1110" else
"01110001" when waarde="1111" else
"00111111";
output2 <= "00000110" when waarde2="0001" else
"01011011" when waarde2="0010" else
"01001111" when waarde2="0011" else
"01100110" when waarde2="0100" else
"01101101" when waarde2="0101" else
"11111101" when waarde2="0110" else
"00000111" when waarde2="0111" else
"01111111" when waarde2="1000" else
"11101111" when waarde2="1001" else
"01110111" when waarde2="1010" else
"01111100" when waarde2="1011" else
"00111001" when waarde2="1100" else
"01011110" when waarde2="1101" else
"01111001" when waarde2="1110" else
"01110001" when waarde2="1111" else
"00111111";
output3 <= "00000110" when antwoord(4)='1' else
"00000000";
output4 <= "00000110" when antwoord(3 downto 0)="0001" else
"01011011" when antwoord(3 downto 0)="0010" else
"01001111" when antwoord(3 downto 0)="0011" else
"01100110" when antwoord(3 downto 0)="0100" else
"01101101" when antwoord(3 downto 0)="0101" else
"11111101" when antwoord(3 downto 0)="0110" else
"00000111" when antwoord(3 downto 0)="0111" else
"01111111" when antwoord(3 downto 0)="1000" else
"01101111" when antwoord(3 downto 0)="1001" else
"11110111" when antwoord(3 downto 0)="1010" else
"01111100" when antwoord(3 downto 0)="1011" else
"00111001" when antwoord(3 downto 0)="1100" else
"01011110" when antwoord(3 downto 0)="1101" else
"01111001" when antwoord(3 downto 0)="1110" else
"01110001" when antwoord(3 downto 0)="1111" else
"00111111";
-- aansturen 7segment
a <= uitgang(0);
b <= uitgang(1);
c <= uitgang(2);
d <= uitgang(3);
e <= uitgang(4);
f <= uitgang(5);
g <= uitgang(6);
dp <= uitgang(7);
-- schakelen tussen verschillende display's
process(temp, output, output2, output3, output4)
begin
if (temp = "00") then
segA <= '1';
segB <= '0';
segC <= '0';
segD <= '0';
uitgang <= output;
elsif (temp= "01") then
segA <= '0';
segB <= '1';
segC <= '0';
segD <= '0';
uitgang <= output2;
elsif (temp = "10") then
segA <= '0';
segB <= '0';
segC <= '1';
segD <= '0';
uitgang <= output3;
elsif (temp = "11") then
segA <= '0';
segB <= '0';
segC <= '0';
segD <= '1';
uitgang <= output4;
end if;
end process;
--clock vertragen met een factor 128
process(clk)
variable cnt : std_logic_vector (6 downto 0);
begin
if(clk'event and clk = '1') then
if cnt = "1111111" then
cnt := "0000000";
else
cnt := cnt + 1;
end if;
end if;
clock <= cnt(6);
end process;
--interne clocksignaal
process(clock)
begin
if(clock'event and clock='1') then
temp <= temp + 1;
end if;
end process;
end schakeling;