mikrocontroller.net

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


Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.