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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.