Übung
(EN google-translate)
(PL google-translate)
Bitte verbinden Sie die Taster in der Schaltung genau so wie in der hier unten zu sehenden aktuellen Version, um Schäden an der Hardware zu vermeiden!
Entwickeln Sie mit Hilfe des FPGA-Boards eine Uhr mit 24-Stunden-Anzeige und Minutenanzeige oder eine Stoppuhr mit Sekunden (0..99) und Hundertstelsekunden.
Als Anzeigeelement wird ein LTC-2723WC Element benutzt.
Verwenden Sie als Vorwiderstand an den Anoden 2200 Ohm. An den Katoden wird kein Widerstand vorgeschaltet.
Die Uhr / Stoppuhr soll mit entsprechenden Buttons ausgerüstet sein: Stunden+/- Minuten+/- bzw. Start Stop Reset
Teilaufgaben
|
Bild 0-1: Pinzuordnungen / Überblick.
Hinweise zur Musterlösung
|
Quelltexte zur Musterlösung
1. uhr.vhd
library IEEE; use IEEE.STD_LOGIC_1164.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity uhr is Port ( MEINECLOCK : in STD_LOGIC; LEDROT : out STD_LOGIC; LEDGRUEN : out STD_LOGIC; DIGIT12P34 : out STD_LOGIC_VECTOR (4 downto 0); ABCDEFG : out STD_LOGIC_VECTOR (6 downto 0); GROUND123 : out STD_LOGIC_VECTOR (2 downto 0); TASTE123 : in STD_LOGIC_VECTOR (2 downto 0)); end uhr; architecture Behavioral of uhr is -- ABCDEFG constant ZIFFER0: STD_LOGIC_VECTOR := "1111110"; constant ZIFFER1: STD_LOGIC_VECTOR := "0110000"; constant ZIFFER2: STD_LOGIC_VECTOR := "1101101"; constant ZIFFER3: STD_LOGIC_VECTOR := "1111001"; constant ZIFFER4: STD_LOGIC_VECTOR := "0110011"; constant ZIFFER5: STD_LOGIC_VECTOR := "1011011"; constant ZIFFER6: STD_LOGIC_VECTOR := "1011111"; constant ZIFFER7: STD_LOGIC_VECTOR := "1110000"; constant ZIFFER8: STD_LOGIC_VECTOR := "1111111"; constant ZIFFER9: STD_LOGIC_VECTOR := "1111011"; signal zaehler : integer range 0 to 2999999 := 0; signal D1 : integer range 0 to 9 := 0; -- Stunden obere Stelle signal D2 : integer range 0 to 9 := 0; -- Stunden untere Stelle signal D3 : integer range 0 to 9 := 0; -- Minuten obere Stelle signal D4 : integer range 0 to 9 := 0; -- Minuten untere Stelle signal D1_anzeige : std_logic_vector (6 downto 0) := "0000000"; signal D2_anzeige : std_logic_vector (6 downto 0) := "0000000"; signal D3_anzeige : std_logic_vector (6 downto 0) := "0000000"; signal D4_anzeige : std_logic_vector (6 downto 0) := "0000000"; signal logikpegel : std_logic := '0'; signal auswahl : std_logic_vector (4 downto 0) := "01111"; signal tasten : std_logic_vector (2 downto 0) := "111"; signal blockiert : std_logic := '0'; begin process begin wait until rising_edge(MEINECLOCK); if (zaehler<2999999) then zaehler <= zaehler+1; else -- schalten im Halb-Sekundentakt blockiert <= '0'; zaehler <= 0; logikpegel <= not logikpegel; if(D4<9) then D4 <= D4+1; -- Minuten untere Stelle else D4 <= 0; if(D3<5) then D3 <= D3+1; -- Minuten obere Stelle else D3 <= 0; if( ((D2<9) and (D1<2)) or ((D2<3) and (D1=2)) ) then -- Stunden untere Stelle D2 <= D2+1; else D2 <= 0; if(D1<2) then -- Stunden obere Stelle D1 <= D1+1; else D1 <= 0; end if; end if; end if; end if; end if; if ( (TASTE123(0) = '0') and (blockiert='0')) then blockiert <= '1'; if( ((D2<9) and (D1<2)) or ((D2<3) and (D1=2)) ) then -- Stunden untere Stelle D2 <= D2+1; else D2 <= 0; if(D1<2) then -- Stunden obere Stelle D1 <= D1+1; else D1 <= 0; end if; end if; elsif ( (TASTE123(1) = '0') and (blockiert='0') ) then blockiert <= '1'; if(D4<9) then D4 <= D4+1; -- Minuten untere Stelle else D4 <= 0; if(D3<5) then D3 <= D3+1; -- Minuten obere Stelle else D3 <= 0; end if; end if; elsif ( (TASTE123(2) = '0') and (blockiert='0') ) then blockiert <= '1'; if(D4>1) then D4 <= D4-2; -- Minuten untere Stelle else D4 <= 9; if(D3>0) then D3 <= D3-1; -- Minuten obere Stelle else D3 <= 5; end if; end if; end if; -- Umwandlung Ziffer in Digit: case D1 is when 0 => D1_anzeige <= ZIFFER0; when 1 => D1_anzeige <= ZIFFER1; when 2 => D1_anzeige <= ZIFFER2; when 3 => D1_anzeige <= ZIFFER3; when 4 => D1_anzeige <= ZIFFER4; when 5 => D1_anzeige <= ZIFFER5; when 6 => D1_anzeige <= ZIFFER6; when 7 => D1_anzeige <= ZIFFER7; when 8 => D1_anzeige <= ZIFFER8; when 9 => D1_anzeige <= ZIFFER9; end case; case D2 is when 0 => D2_anzeige <= ZIFFER0; when 1 => D2_anzeige <= ZIFFER1; when 2 => D2_anzeige <= ZIFFER2; when 3 => D2_anzeige <= ZIFFER3; when 4 => D2_anzeige <= ZIFFER4; when 5 => D2_anzeige <= ZIFFER5; when 6 => D2_anzeige <= ZIFFER6; when 7 => D2_anzeige <= ZIFFER7; when 8 => D2_anzeige <= ZIFFER8; when 9 => D2_anzeige <= ZIFFER9; end case; case D3 is when 0 => D3_anzeige <= ZIFFER0; when 1 => D3_anzeige <= ZIFFER1; when 2 => D3_anzeige <= ZIFFER2; when 3 => D3_anzeige <= ZIFFER3; when 4 => D3_anzeige <= ZIFFER4; when 5 => D3_anzeige <= ZIFFER5; when 6 => D3_anzeige <= ZIFFER6; when 7 => D3_anzeige <= ZIFFER7; when 8 => D3_anzeige <= ZIFFER8; when 9 => D3_anzeige <= ZIFFER9; end case; case D4 is when 0 => D4_anzeige <= ZIFFER0; when 1 => D4_anzeige <= ZIFFER1; when 2 => D4_anzeige <= ZIFFER2; when 3 => D4_anzeige <= ZIFFER3; when 4 => D4_anzeige <= ZIFFER4; when 5 => D4_anzeige <= ZIFFER5; when 6 => D4_anzeige <= ZIFFER6; when 7 => D4_anzeige <= ZIFFER7; when 8 => D4_anzeige <= ZIFFER8; when 9 => D4_anzeige <= ZIFFER9; end case; -- Digit waehlen und richtig setzen, das aufgefrischt werden soll: case (zaehler mod 4) is when 0 => DIGIT12P34 <= "01111"; ABCDEFG <= D1_anzeige; when 1 => DIGIT12P34 <= "10111"; ABCDEFG <= D2_anzeige; when 2 => DIGIT12P34 <= "11101"; ABCDEFG <= D3_anzeige; when others => DIGIT12P34 <= "11110"; ABCDEFG <= D4_anzeige; end case; end process; --- LEDROT und GRUEN blinken lassen LEDROT <= logikpegel; LEDGRUEN <= not logikpegel; --- GROUND123 auf Masse setzen: GROUND123 <= "000"; end Behavioral;
Code 0-1: uhr.vhd
2. uhr.ucf
## GCLK6 ist auf FPGA-Chip Pin 56 NET "MEINECLOCK" LOC = "P56" | IOSTANDARD = LVCMOS25; ## LEDROT NET "LEDROT" LOC = "P126" | IOSTANDARD = LVCMOS33; ## LEDGRUEN NET "LEDGRUEN" LOC = "P125" | IOSTANDARD = LVCMOS33; ## DIGIT12P34 NET "DIGIT12P34<4>" LOC = "P105" | IOSTANDARD = LVCMOS33; ## 1 NET "DIGIT12P34<3>" LOC = "P106" | IOSTANDARD = LVCMOS33; ## 2 NET "DIGIT12P34<2>" LOC = "P112" | IOSTANDARD = LVCMOS33; ## P NET "DIGIT12P34<1>" LOC = "P113" | IOSTANDARD = LVCMOS33; ## 3 NET "DIGIT12P34<0>" LOC = "P116" | IOSTANDARD = LVCMOS33; ## 4 ## ABCDEFG NET "ABCDEFG<6>" LOC = "P130" | IOSTANDARD = LVCMOS33; ## A NET "ABCDEFG<5>" LOC = "P131" | IOSTANDARD = LVCMOS33; ## B NET "ABCDEFG<4>" LOC = "P132" | IOSTANDARD = LVCMOS33; ## C NET "ABCDEFG<3>" LOC = "P134" | IOSTANDARD = LVCMOS33; ## D NET "ABCDEFG<2>" LOC = "P135" | IOSTANDARD = LVCMOS33; ## E NET "ABCDEFG<1>" LOC = "P139" | IOSTANDARD = LVCMOS33; ## F NET "ABCDEFG<0>" LOC = "P140" | IOSTANDARD = LVCMOS33; ## G ## TASTEN123 IO0,2,5 NET "TASTE123<2>" LOC = "P58" | PULLUP | IOSTANDARD = LVCMOS33; NET "TASTE123<1>" LOC = "P93" | PULLUP | IOSTANDARD = LVCMOS33; NET "TASTE123<0>" LOC = "P97" | PULLUP | IOSTANDARD = LVCMOS33; ## GROUND123 IO1,4,7 NET "GROUND123<2>" LOC = "P59" | IOSTANDARD = LVCMOS33; NET "GROUND123<1>" LOC = "P96" | IOSTANDARD = LVCMOS33; NET "GROUND123<0>" LOC = "P104" | IOSTANDARD = LVCMOS33;
Code 0-2: uhr.ucf