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.