mikrocontroller.net

Forum: FPGA, VHDL & Co. UHR mit VHDL


Autor: VHDL_ANFÄNGER (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.




Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HomerS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: VHDL_ANFÄNGER (Gast)
Datum:

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

Autor: Cheffe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ein Uhrenbeispiel gibt es doch im ISE-Tutorial. Fertig aufgebaut!

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ VHDL Anfänger - Wo studierst Du ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.