Forum: FPGA, VHDL & Co. Frage zur Erstellung eines VHDL - Codes


von Christian K. (kniebs)


Angehängte Dateien:

Lesenswert?

Hallo liebe Leute,

ich hab ein kleines Problemchen, und zwar studiere ich im nunmehr 3. 
Semester Informations- und Elektrotechnik und habe in der Digitalen 
Schaltungstechnik nun Kenntnis von VHDL genommen bzw. bekommen. Bin im 
Moment an einem Versuchsbericht dran, für eine Stoppuhr, welche wir 
selbst programmiert haben. Bei den Verständnisaufgaben zu diesem 
Bericht, habe ich nun die Aufgabe, einen VHDL - Code zu dem angehängtem 
Scan zu schreiben. Bin mir da aber absolut unsicher und kriege das noch 
nicht wirklich hin.
Handelt es sich dabei denn um einen FlipFlop o. Ä.? Kann im Internet 
nicht wirklich hilfreiches entdecken, grade weil ich auch nur einen 
Ausgang (Q) habe. Habe schonmal begonnen, die Eingänge S,D als 
std_logic_vector Eingänge zu deklarieren, bin mir aber insbesonere bei 
den Masse gelegten Eingänge unsicher wie ich das festlege. Vielleicht 
kann mir ja jemand weiterhelfen..


Beste Grüße

Christian

von Christian K. (kniebs)


Lesenswert?

Natürlich handelt es sich hier um ein FlipFlop, kann in meinen 
Unterlagen dennoch keinen Zusammenhang der inneren Verschaltung 
erkennen. Ich hab hier mal die port-zuweisung:
1
library ieee;
2
library work;
3
use ieee.std_logic_1164.all
4
use ieee.std_logic_arith.all
5
use ieee.std_logic_unsigned.all
6
7
entity Schaltung is
8
  port ( 
9
      A : IN  std_logic;
10
      B : IN  std_logic;
11
      C : IN  std_logic;
12
      Y : OUT std_logic);
13
end Schaltung;

Der Rest ist noch nicht so weit..

Dann habe ich noch eine weitere Frage, und zwar wird bei Anzeigetreiber 
in unserem Fall in den generics die "tick_num" auf 100 gesetzt. Das ist 
der Teilerwert zur Erzeugung des internen 10µs Takts. Jetzt muss ich 
erklären, wie der 10µs Takt im Anzeigetreiber entsteht. Ich hab schon 
soviel gegoogelt, aber ich finde keine Erklärung dafür..

von Daniel M. (daniel__m)


Lesenswert?

Dann scheinst du unglücklich gesucht zu haben. Allein wenn ich bei 
Wikipedia nach FlipFlops suche, dann finde ich schnell ein entspechendes 
Symbol.

von Christian K. (kniebs)


Lesenswert?

Meinst du ein flankengesteuertes D - FlipFlop?  Das sieht auf jeden Fall 
ähnlich aus, aber wozu hab ich dann die eingänge S, R und CE?

von Daniel M. (daniel__m)


Lesenswert?

ohje, die teileweise (hoffnungslos) veralteten Lehrunterlagen der Profs 
oder Dozenten. Bibliotheken einbinden, die (aktuell noch garnicht) 
verwendet werden und dann sind
1
use ieee.std_logic_arith.all
2
use ieee.std_logic_unsigned.all

Bibliotheken, welche schon eine Weile "deprecated" sind, also nicht für 
Neues verwendet werden sollten. Nimm, wenn es soweit ist, dass du mit 
Zahlen umgehen musst lieber
1
use ieee.numeric_std.all

Zu dem "tick_num" fällt mir spontan der Begriff "Taktteiler" ein und ist 
mitunter ein Grundkonstrukt im FPGA. Evtl. hilft der Begriff dir weiter.

von Daniel M. (daniel__m)


Lesenswert?

Christian Knabe schrieb:
> wozu hab ich dann die eingänge S, R und CE

Vielleicht ist es ein RS-Flipflop mit CE-Eingang?

R -> Reset
S -> Set
CE -> Clock Enable

von Christian K. (kniebs)


Lesenswert?

Super Danke schonmal für die Tipps.. :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel M. schrieb:
> Bibliotheken, welche schon eine Weile "deprecated" sind, also nicht für
> Neues verwendet werden sollten.
Siehe auch den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Christian Knabe schrieb:
> Habe schonmal begonnen, die Eingänge S,D als std_logic_vector Eingänge
> zu deklarieren
Als Vektoren?
Aha, zum Glück doch nicht:
1
  port ( 
2
      A : IN  std_logic;
3
      B : IN  std_logic;
4
      C : IN  std_logic;
5
      Y : OUT std_logic);
Ein Tipp: du solltest (gerade bei VHDL) genau das hinschreiben, was du 
meinst. Da gibt es keine impliziten Typkonvertierungen wie z.B. bei C. 
Aber das wird dir auch noch auffallen... ;-)

Christian Knabe schrieb:
> Das ist der Teilerwert zur Erzeugung des internen 10µs Takts.
> Jetzt muss ich erklären, wie der 10µs Takt im Anzeigetreiber entsteht.
Man macht in einem FPGA nicht unnötig eine zweite Taktdomäne auf. Und 
dass man das nicht muss, dafür gibt es ein Clock-Enable. Sieh dir mal 
die blinkende LED und das Lauflicht an:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html

> Ich hab schon soviel gegoogelt, aber ich finde keine Erklärung dafür..
Sieh dir einfach mal hier im Forum alle die VHDL-Threads durch, wo du 
das Wort "Anfänger" oder "Postulate" findest... ;-)

Christian Knabe schrieb:
> Handelt es sich dabei denn um einen FlipFlop o. Ä.?
Bei Xilinx ist das ein FDRSE...   ;-)

von Christian K. (kniebs)


Lesenswert?

Danke schonmal für die Beiträge. Ich weiß das ich das normal auch selbst 
hinkriegen müsste, aber im Moment gehts Vollgas auf die Klausurenphase 
mit 8 Klausuren an 10 Tagen zu und ich hab einfach nicht die Zeit mich 
den ganzen Tag mit dem Kram hier auseinanderzusetzen, weil ich einfach 
zu viel lernen muss. Werd mich in den "Ferien" mal hinsetzen und das 
alles versuchen zu verstehen und auch was für das weitere Leben 
mitzunehmen, weil es ja wirklich interessant ist. Die Stoppuhr an sich 
ist schon super gewesen. Nur ist das jetzt alles wirklich zu knapp um es 
zu verstehen, ich muss es einfach fertig kriegen und mein Skript hilft 
mir auch nicht wirklich weiter. Ich bin einfach extrem unsicher was die 
Fortsetzung des Codes angeht. Sicher will ich keine Musterlösung hier 
hingeschrieben bekommen, aber 1/2 Tipps bzw. Ansätze wären schon 
wunderbar.  Allein die Darstellung ,das Reset und CE das constante 
Signal bekommen macht mich schon unsicher.
Ansonsten würd ich weitermachen mit der architecture:
1
architecture Aufgabe of Schaltung is
2
  process(CE, R)
3
  begin
4
  A <= S;
5
  B <= D;
6
  Y <= Q;
7
  if R='1' then
8
  Q <= '0';
9
elsif S='1' then
10
  Q <= '1';
11
elsif CE='1' and C='1' then
12
  Q <= D;
13
end if;
14
end process;
15
end Aufgabe;

CE und R hab ich als process gesetzt, ist das richtig? Ich weiß ja in 
dem Fall hier garnicht, ob das eine konstante 1 oder 0 ausgibt oder? Und 
dann gehe ich einfach mal davon aus, dass dieser FlipFlop B ausgeben 
soll wenn CE und C auf 1 gesetzt sind. Wenn R eine 1 setzt, soll eine 0 
rauskommen, da resettet wurde. Ansonsten, wenn S (set?) 1 ist, soll 
diese auch ausgeben werden.  Hoffe noch ein wenig Hilfe zu bekommen, tut 
mir auch Leid wenn das für euch etwas Langeweile hervorruft.. :-(

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ein Takt wird in VHDL mit rising_edge oder 'event beschrieben...

Du hast das nicht, deshalb gibt es nur ein pegelgesteuertes 
Speicherelement: ein Latch.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian Knabe schrieb:
> Allein die Darstellung ,das Reset und CE das constante
> Signal bekommen macht mich schon unsicher.
Lies mal das Xilinx WP275 "Get your Priorities Right" und den 
Beitrag "Re: Hardware mit VHDL "richtig" beschreiben."

von Daniel M. (daniel__m)


Lesenswert?

Lothar Miller schrieb:
> Lies mal das Xilinx WP275 "Get your Priorities Right"

Ich glaube, Christian hat ganz andere Sorgen, als sich mit 
FPGA-spezifischen Reset-Sonderheiten auseinanderzusetzen.

Ansonsten kann man auf den Code aufbauen, er enthält zwar etliche Fehler 
(und Dinge, die man nicht machen sollte), aber zum Löschen reichts 
widerum nicht ;)

Ein großer Schrit ist schon einmal, wenn du den Takt korrekt 
beschreibst.
Also anstelle
1
 C='1'
 wäre
1
 rising_edge(C)
 zu schreiben.

Die erste Beschreibung sagt: solange das Signal C '1' ist, dann 
übernehme D nach Q, das ist wie Lothar schon sagte ein Latch und hat in 
FPGAs nur in absolut begründeten Ausnahmefällen etwas zu suchen.

Du willst aber, das D nach Q geht, wenn eine Takt-Flanke da ist: daher 
"flankengesteuerten FF".

Dann solltest du dir im klaren sein, wann welcher Datenfluss sattfindet. 
So wird z.B. dem Signal B das Signal von D zugewiesen und nicht 
umgekehrt.

grüße

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel M. schrieb:
> Lothar Miller schrieb:
>> Lies mal das Xilinx WP275 "Get your Priorities Right"
> Ich glaube, Christian hat ganz andere Sorgen, als sich mit
> FPGA-spezifischen Reset-Sonderheiten auseinanderzusetzen.
Das schon, aber vielleicht ist dort eine 1:1 Copy-Paste-Lösung drin. Und 
eine schöne Erklärung, wie solche Bauteile allgemein funktionieren...

von Christian K. (kniebs)


Lesenswert?

1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
5
entity Schaltung is
6
  port (
7
      A : IN  std_logic;
8
      B : IN  std_logic;
9
      C : IN  std_logic;
10
      Y : OUT std_logic);
11
end Schaltung;
12
13
architecture Aufgabe of Schaltung is
14
begin
15
 
16
sch_prc:  process(CE)
17
  begin
18
19
  S <= A;
20
  D <= B;
21
  R = '0'
22
  Y <= Q;
23
 
24
 
25
  if rising_edge(C)and CE='1' then
26
  if B='1' or A='1' then
27
  Q <= '1';
28
  else
29
  Q <= '0';
30
 
31
end if;
32
end if;
33
end process;
34
end architecture;

So, hier ist mein "fertiger" Code den ich jetzt heute abgegeben habe.. 
Hab mich nochmal mit meinem Dozenten zusammengesetzt und das ganze ein 
wenig besser verstanden. könnten sicher noch fehler drin sein, aber 
daraus lernt man. dennoch vielen dank an alle beiträge hier, in den 
semesterferien werd ich mich mal tiefer damit auseinandersetzen  :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Christian Knabe schrieb:
> So, hier ist mein "fertiger" Code den ich jetzt heute abgegeben habe..
Uuuups...
1
ERROR:HDLParsers:3312 - Line 16. Undefined symbol 'CE'.
2
ERROR:HDLParsers:1209 - Line 16. CE: Undefined symbol (last report in this block)
3
ERROR:HDLParsers:3312 - Line 17. Undefined symbol 'S'.
4
ERROR:HDLParsers:3312 - Line 18. Undefined symbol 'D'.
5
ERROR:HDLParsers:3312 - Line 19. Undefined symbol 'R'.
6
ERROR:HDLParsers:164 -  Line 20. parse error, unexpected IDENTIFIER, expecting SEMICOLON
7
ERROR:HDLParsers:3312 - Line 23. Undefined symbol 'Q'.
8
ERROR:HDLParsers:1209 - Line 25. Q: Undefined symbol (last report in this block)
9
Number of errors   :    8 (0 filtered)

Dazu wird deine Simulation auch nicht stimmen, denn der Takt fehlt in 
der Sensitivliste...   :-o


Christian Knabe schrieb:
1
 if rising_edge(C)and CE='1' then
2
   if B='1' or A='1' then
3
     Q <= '1';
4
   else
5
     Q <= '0';
6
   end if;
7
 end if;
Dass dabei nicht das gewünschte Bauteil (Bild im ersten Post), sondern 
bestenfalls das gewünschte Verhalten herauskommt, das ist dir klar?
Deshalb hatte ich auf das WP275 verwiesen...
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity Schaltung is
5
  port (
6
      A : IN  std_logic;
7
      B : IN  std_logic;
8
      C : IN  std_logic;
9
      Y : OUT std_logic);
10
end Schaltung;
11
12
architecture Aufgabe of Schaltung is
13
signal R,S,D,CE,Q : std_logic;
14
begin
15
16
  S  <= A;
17
  D  <= B;
18
  Y  <= Q;
19
  R  <= '0';
20
  CE <= '1';
21
  
22
  -- aus WP275  
23
  process (c)
24
  begin
25
    if c'event and c='1' then
26
      if r='1' then
27
        q <= '0'; 
28
      else
29
        if ce='1' then 
30
          if s='1' then 
31
            q <= '1';
32
          else
33
            q <= d;
34
          end if; 
35
        end if;
36
      end if;
37
    end if;
38
  end process;
39
40
  -- unnötig komplizierte Variante
41
  process(C, CE) begin
42
    if rising_edge(C) and CE='1' then
43
      if B='1' or A='1' then
44
        Q <= '1';
45
      else
46
        Q <= '0';
47
      end if;
48
    end if;
49
  end process;
50
51
end architecture;

von Simon K. (simon) Benutzerseite


Lesenswert?

An der Formatierung/Einrückung hättest du wenigstens noch arbeiten 
können ;-)

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.