library ieee; use ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; entity UHR_3 is port ( clk : in std_logic; reset : in std_logic; AN0,AN1,AN2,AN3: inout std_logic; -- 4 schalter I1,I2,I3,I4:in std_logic; d1a,d1b,d1c,d1d,d1e,d1f,d1g:out std_logic ); end; architecture UHR_3_behav of UHR_3 is signal CTR : STD_LOGIC_VECTOR(12 downto 0); SIGNAL seconds: integer range 9 downto 0 :=0; SIGNAL ten_sec: integer range 9 downto 0 :=0; SIGNAL minutes: integer range 9 downto 0 :=0; SIGNAL ten_min: integer range 9 downto 0 :=0; SIGNAL hours: integer range 9 downto 0 :=0; SIGNAL ten_hrs: integer range 9 downto 0 :=0; SIGNAL disp1 : std_logic_vector (6 downto 0); -- displ. D1 SIGNAL disp2 : std_logic_vector (6 downto 0); -- displ. D2 SIGNAL disp3 : std_logic_vector (6 downto 0); -- displ. D3 SIGNAL disp4 : std_logic_vector (6 downto 0); -- displ. D4 begin display1: process (reset,clk,I1,I2,I3,I4) begin IF (reset = '1') THEN seconds <= 0; ten_sec <= 0; minutes <= 0; ten_min <= 0; hours <= 0; ten_hrs <= 0; elsIF (clk'event AND clk = '1') THEN IF (I1 = '1') THEN IF (ten_hrs = 2) THEN ten_hrs <= 0; ELSE ten_hrs <= ten_hrs + 1; END IF; ELSIF (I2 = '1') THEN IF (hours = 9) THEN hours <= 0; ELSE hours <= hours + 1; END IF; ELSIF (I3 = '1') THEN IF (ten_min = 5) THEN ten_min <= 0; ELSE ten_min <= ten_min + 1; END IF; ELSIF (I4 = '1') THEN IF (minutes = 9) THEN minutes <= 0; ELSE minutes <= minutes + 1; END IF; -- IF 23:59:59 ELSIF ((ten_hrs = 2) AND (hours = 3) AND (ten_min = 5) AND (minutes = 9) AND (ten_sec = 5) AND (seconds = 9)) THEN seconds <= 0; ten_sec <= 0; minutes <= 0; ten_min <= 0; hours <= 0; ten_hrs <= 0; -- IF x9:59:59 ELSIF ((hours = 9) AND (ten_min = 5) AND (minutes = 9) AND (ten_sec = 5) AND (seconds = 9)) THEN seconds <= 0; ten_sec <= 0; minutes <= 0; ten_min <= 0; hours <= 0; ten_hrs <= ten_hrs + 1; -- IF xx:59:59 ELSIF ((ten_min = 5) AND (minutes = 9) AND (ten_sec = 5) AND (seconds = 9)) THEN seconds <= 0; ten_sec <= 0; minutes <= 0; ten_min <= 0; hours <= hours + 1; -- IF xx:x9:59 ELSIF ((minutes = 9) AND (ten_sec = 5) AND (seconds = 9)) THEN seconds <= 0; ten_sec <= 0; minutes <= 0; ten_min <= ten_min + 1; -- IF xx:xx:59 ELSIF ((ten_sec = 5) AND (seconds = 9)) THEN seconds <= 0; ten_sec <= 0; minutes <= minutes + 1; -- IF xx:xx:x9 ELSIF (seconds = 9) THEN seconds <= 0; ten_sec <= ten_sec + 1; ELSE seconds <= seconds + 1; END IF; END IF; end process display1; --desplay led: process (clk) begin IF (clk'event and clk = '0') THEN IF (ten_hrs = 0) THEN disp1 <= "1000000"; ELSIF (ten_hrs = 1) THEN disp1 <= "1111001"; ELSIF (ten_hrs = 2) THEN disp1 <= "0100100"; END IF; IF (hours = 0) THEN disp2 <= "1000000"; ELSIF (hours = 1) THEN disp2 <= "1111001"; ELSIF (hours = 2) THEN disp2 <= "0100100"; ELSIF (hours = 3) THEN disp2 <= "0110000" ; ELSIF (hours = 4) THEN disp2 <= "0011001"; ELSIF (hours = 5) THEN disp2 <= "0010010"; ELSIF (hours = 6) THEN disp2 <= "0000010"; ELSIF (hours = 7) THEN disp2 <= "1111000"; ELSIF (hours = 8) THEN disp2 <= "0000000" ; ELSIF (hours = 9) THEN disp2 <= "0010000"; END IF; IF (ten_min = 0) THEN disp3 <= "1000000"; ELSIF (ten_min = 1) THEN disp3 <= "1111001"; ELSIF (ten_min = 2) THEN disp3 <= "0100100"; ELSIF (ten_min = 3) THEN disp3 <= "0110000" ; ELSIF (ten_min = 4) THEN disp3 <= "0011001"; ELSIF (ten_min = 5) THEN disp3 <= "0010010"; ELSIF (ten_min = 6) THEN disp3 <= "0000010"; ELSIF (ten_min = 7) THEN disp3 <= "1111000" ; ELSIF (ten_min = 8) THEN disp3 <= "0000000" ; ELSIF (ten_min = 9) THEN disp3 <= "0010000"; END IF; IF (minutes = 0) THEN disp4 <= "1000000"; ELSIF (minutes = 1) THEN disp4 <= "1111001"; ELSIF (minutes = 2) THEN disp4 <= "0100100"; ELSIF (minutes = 3) THEN disp4 <= "0110000" ; ELSIF (minutes = 4) THEN disp4 <= "0011001"; ELSIF (minutes = 5) THEN disp4 <= "0010010"; ELSIF (minutes = 6) THEN disp4 <= "0000010"; ELSIF (minutes = 7) THEN disp4 <= "1111000"; ELSIF (minutes = 8) THEN disp4 <= "0000000"; ELSIF (minutes = 9) THEN disp4 <= "0010000"; END IF; END IF; end process led; q:Process (CLK,AN0,AN1,AN2,AN3) begin if (CLK'event and CLK = '1') then if (CTR="0000000000000") then if (AN0='0') then AN0 <= '1'; d1a <= disp3(0); d1b <= disp3(1); d1c <= disp3(2); d1d <= disp3(3); d1e <= disp3(4); d1f <= disp3(5); d1g <= disp3(6); AN1 <= '0'; elsif (AN1='0') then AN1 <= '1'; d1a <= disp2(0); d1b <= disp2(1); d1c <= disp2(2); d1d <= disp2(3); d1e <= disp2(4); d1f <= disp2(5); d1g <= disp2(6); AN2 <= '0'; elsif (AN2='0') then AN2 <= '1'; d1a <= disp1(0); d1b <= disp1(1); d1c <= disp1(2); d1d <= disp1(3); d1e <= disp1(4); d1f <= disp1(5); d1g <= disp1(6); AN3 <= '0'; elsif (AN3='0') then AN3 <= '1'; d1a <= disp4(0); d1b <= disp4(1); d1c <= disp4(2); d1d <= disp4(3); d1e <= disp4(4); d1f <= disp4(5); d1g <= disp4(6); AN0 <= '0'; end if; end if; CTR<=CTR+"0000000000001"; if (CTR > "1000000000000") then -- counter reaches 2^13 CTR<="0000000000000"; end if; end if; -- CLK'event and CLK = '1' End Process q; end UHR_3_behav; Ich bin Anfänger in VHDL und ich möchte eine Uhr in Spartan 3 testen (7 Segment) aber leider hat es nicht funktioniert weil ich bis jetzt nicht die Steuerung von 7 Segment(spartan3) verstanden habe. zu dem Programm oben gehört noch ein Frequenzteiler. kann mir jemanden Bitte helfen das Programm zu korrigieren, damit ich auf Sparten 3 teste und dabei natürlich auch lernen. ich bin noch offen für fragen oder noch kommentare.
Immer diese Hausaufgaben ;). Du solltest die Abfragen für den Zählerstand in umgekehrter Reihenfolge machen. Dann kannst du dir die komplizierten elseifs sparen. Ich würde dir aber eher empfehlen für jede Stelle einen einzelnen Zähler zu nehmen. Dann brauchst du nur noch eine Abfrage ob die obere Grenze erreicht ist (Stunden musst du natürlich noch bei 25 zurücksetzen). Die 7-Segmentanzeige ist gemultiplext. D.h. die einzelnen Segmente der 4 Anzeigen sind parallel verschaltet. Du hast dann noch eine Leitung mit der du die richtige Stelle auswählen kannst. Deshalb braucht man im Prinzip auch nur einen einzelnen 7 Segment Decoder.
Hi, ist das das S3-Board von Digilent mit den 4x 7-Segment, 8x LED, 4xTaster und 8 Switches? Gib mal Deine e-mail Addy, denn für dieses Board habe ich gerade eine Uhr gebaut. Mein Code sieht halt ganz anders aus, bin auch nicht erfahren darin, aber es funzt sekundengenau. Stunden und Minuten auf den 7-Segmentanzeigen, und die Sekunden binär auf den LED. Wennde willst, gib Laut. guude ts
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.