Forum: FPGA, VHDL & Co. VHDL Zahlen addieren und auf 7Seg ausgeben


von Marko (Gast)


Lesenswert?

Hallo,

Hätte da ein riesengroßes Problem.

Und zwar soll ich mittels einer PS/2 Tastatur Zahlen von 0-9 (also 
einstellige) einlesen können und diese dann auf einer 7Seg-Anzeige 
ausgeben. Soweit, so gut, das hab ich einmal geschafft. Wenn ich auf der 
Tastatur auf die Ziffern drücke, bekomme ich auch den richtigen Wert auf 
der 7Seg.

Doch als nächstes soll ich 2 Zahlen addieren können.

D.h. das Programm soll 2 Zahlen einlesen, die mittels "+" getrennt 
eingegeben werden sollen. Also z.B. 1+2 eingeben und dann durch Drücken 
der "Enter" Taste soll das Ergebnis, also in dem Fall "3", auf der 7Seg 
ausgegeben werden.

Könnte mir jemand dabei behilflich sein bzw. was brauche ich alles 
dafür??

Hier noch ein Auszug meines Codes (ohne den Tastatur-Scanner):

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


entity Rechner is
    Port ( mclk : in STD_LOGIC;                         -- Main clock
           rst  : in STD_LOGIC;                         -- Reset Taster

        SW   : in STD_LOGIC_VECTOR(3 downto 0);      -- Schalter
        PS2C : in STD_LOGIC;                         -- PS/2 Clock
        PS2D : in STD_LOGIC;                         -- PS2 Data
        SSD_CAT : out STD_LOGIC;
        SSD_AN  : out STD_LOGIC_VECTOR (6 downto 0));
end Rechner;

architecture Behavioral of Rechner is

  component Tastaturscanner                                  -- Tastatur 
Komponente
    Port ( mclk    : in std_logic;                      -- System Clock
         PS2C    : in std_logic;                      -- PS2 Clock
           PS2D    : in std_logic;                      -- PS2 Data
        rst     : in std_logic;                      -- Reset BTN0
        Ps2Dout : out std_logic_vector(7 downto 0);  -- out data
           fRd     : out std_logic);                    -- data valid 
flag
  end component;

  signal clkdiv : std_logic_vector(20 downto 0);        -- General clock 
divider register
  signal hex_dig : std_logic_vector(3 downto 0);        -- Input zu HEX 
zu SSD decoder
  signal KBD_SC : std_logic_vector(7 downto 0);         -- PS2 Keyboard 
Scan Code
  signal SSD_sel : std_logic_vector(1 downto 0);        -- Mux select 
für SSD Daten
  signal KD : std_logic;                                -- Data valid 
flag
  signal operand0 : integer;
  signal operand1 : integer;
  signal state : Integer := 0;


begin

  -- General Clock Divider
  process (mclk, rst)
    begin
     if ( rst = '1') then clkdiv <= (others => '0');
        elsif mclk = '1' and mclk'Event then
          clkdiv <= clkdiv + 1;
      end if;
  end process;


  process (mclk, rst)
    begin

    if    ( KBD_SC = "01110000" ) then operand0 <= 0;  --KP 0
    elsif ( KBD_SC = "01101001" ) then operand0 <= 1;  --KP 1
    elsif ( KBD_SC = "01110010" ) then operand0 <= 2;  --KP 2
    elsif ( KBD_SC = "01111010" ) then operand0 <= 3;  --KP 3
    elsif ( KBD_SC = "01101011" ) then operand0 <= 4;  --KP 4
    elsif ( KBD_SC = "01110011" ) then operand0 <= 5;  --KP 5
    elsif ( KBD_SC = "01110100" ) then operand0 <= 6;  --KP 6
    elsif ( KBD_SC = "01101100" ) then operand0 <= 7;  --KP 7
    elsif ( KBD_SC = "01110101" ) then operand0 <= 8;  --KP 8
    elsif ( KBD_SC = "01111101" ) then operand0 <= 9;  --KP 9
    elsif ( KBD_SC = "01111001" ) then operand0 <= 10;  --KP +
    elsif ( KBD_SC = "01011010" ) then operand0 <= 11;  --Enter
    elsif ( KBD_SC = "00100001" ) then operand0 <= 12;  --C
    elsif ( KBD_SC = "00100100" ) then operand0 <= 13;  --E
    end if;


    if(state = 0 and operand0 <= 13) then
      operand1 <= operand0;
  end if;

  end process;


  -- Assignemt of Data to SSD
  SSD_CAT <= clkdiv(10);
  SSD_sel <= SW(0) & clkdiv(10);  -- CLKdiv muxes data between the two 
LEDs


  -- SSD Decoder
  with operand0 select
    SSD_AN <= "0111111" when 0,  -- 0
             "0000110" when 1,  -- 1
              "1011011" when 2,  -- 2
              "1001111" when 3,  -- 3
          "1100110" when 4,  -- 4
          "1101101" when 5,  -- 5
          "1111101" when 6,  -- 6
          "0000111" when 7,  -- 7
          "1111111" when 8,  -- 8
          "1101111" when 9,  -- 9
          "1000000" when 10,  -- KP+
          "0110111" when 11,  -- Enter
          "0111001" when 12,  -- C
          "1111001" when 13,  -- E
            "0000001" when others;  --X



  -- PS2 Keyboard Scanner
C1 : PS2_reader port map (mclk=>mclk, PS2C=>PS2C, PS2D=>PS2D, rst=>rst, 
Ps2Dout=>KBD_SC, fRd=>KD);

end Behavioral;

Danke im Voraus

von Rick Dangerus (Gast)


Lesenswert?

Für alle die, die Deine Hardware nicht haben (und auch für Dich) wäre 
ein Testbench sehr wichtig. Ansonsten hier noch zwei Stichworte: 
Rechnen in VHDL und "State machine".

Rick

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.