Forum: FPGA, VHDL & Co. UHR mit VHDL


von VHDL_ANFÄNGER (Gast)


Lesenswert?

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.




von Mike (Gast)


Lesenswert?

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.

von HomerS (Gast)


Lesenswert?

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

von VHDL_ANFÄNGER (Gast)


Lesenswert?

Hallo HomerS
Danke für deine Hilfe,meien mail ist parispaul@gmx.de

von Cheffe (Gast)


Lesenswert?

So ein Uhrenbeispiel gibt es doch im ISE-Tutorial. Fertig aufgebaut!

von Carsten (Gast)


Lesenswert?

@ VHDL Anfänger - Wo studierst Du ?

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