Forum: FPGA, VHDL & Co. Procedure - Definition in eigener Datei möglich?


von Samuel J. (capstrovor)


Lesenswert?

Hallo

Ich arbeite gerade dieses Tutorial durch:
https://www.youtube.com/watch?v=3epKbSGbMCA&index=36&list=PL7kkolCtIBKLukrBsEDwKRTE64JvaJDhM

In dieser Lesson wurde ein 4Bit Comparator gebaut, und zwar aus 
einzelnen 1 bit Comparatoren.

Dazu wurde dann eine Procedure verwendet und mit Hilfe einer for 
Schleife kaskadiert.
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.std_logic_unsigned.all;
4
5
6
entity comp4bit is
7
port
8
(
9
  x: in std_logic_vector(3 downto 0);
10
  y: in std_logic_vector(3 downto 0);
11
  gt: out std_logic;
12
  lt: out std_logic;
13
  eq: out std_logic
14
);
15
end comp4bit;
16
17
architecture comp4bit_arch of comp4bit is
18
  procedure comp1bit
19
  (
20
      x: in std_logic;
21
      y: in std_logic;
22
      Gin: in std_logic;
23
      Lin: in std_logic;
24
      Gout: out std_logic;
25
      Lout: out std_logic;
26
      Eout: out std_logic      
27
  ) is
28
  begin
29
    Gout := (x AND not y) or (x AND Gin) or (not y AND Gin);
30
    Eout := (not x AND not y AND not Gin AND not Lin) or (x AND y AND not Gin AND not Lin);
31
    Lout := (not x AND y) or (not x AND Lin) or (y AND Lin);
32
  end procedure;
33
begin
34
  process(x, y)
35
  variable G, L, E: std_logic_vector(4 downto 0);
36
  
37
  begin
38
    G(0) := '0';
39
    L(0) := '0';
40
    
41
    for i in 0 to 3 loop
42
      comp1bit(x(i), y(i), G(i), L(i), G(i+1), L(i+1), E(i+1));
43
    end loop;
44
    
45
    gt <= G(4);
46
    lt <= L(4);
47
    eq <= E(4);
48
  end process;
49
end comp4bit_arch;

Es funktioniert auch alles.
Nur wollte ich Fragen, ob man die Definition der Procedure auch in eine 
eigene Datei auslagern kann, oder sogar eine entity in eine procedure 
einfügen? Denn wenn es eine aufwändigere Definition wird, als hier diese 
paar AND, NOT und OR Gatter, wird es ziemlich unübersichtlich...

von Christian R. (supachris)


Lesenswert?

Nimm die numeric_std Lib, da kannst du einfach mit < und > vergleichen, 
dazu vorher den Vektor nach unsigned oder signed casten. Damit ersparst 
du dir den ganzen Quark da und hast nur eine Zeile. Überhaupt sollte man 
die alten synopsys Libs nicht mehr einsetzen, bei Arithmetik erst recht 
nicht.

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


Lesenswert?

Samuel J. schrieb:
> Nur wollte ich Fragen, ob man die Definition der Procedure auch in eine
> eigene Datei auslagern kann, oder sogar eine entity in eine procedure
> einfügen?
Wenn du das Modul auslagern willst, dann brauchst du entweder
1. ein Package, das die Funktion enthält
oder
2. eine eigene Entity, die den 1-Bit-Vergleicher beinhaltet. Und dieser 
wird dann als Komponente in das übergeordnete Modul (Entity) 
eingebunden.

Aber das was du hier machst, sind eh' nur akademische Spielereien. Im 
echten Leben hat da keiner Zeit dafür und nimmt die passende 
Bibliothek...

Eine Procedure ist hier übrigens technischer Blödsinn. Und auch die 
Schleife schlag dir schnellstmöglich aus dem Kopf. Durch so einen Krampf 
bekommt VHDL den Ruf, eine "umständliche" oder "geschwätzige" Sprache zu 
sein. Siehe hierzu das hier: 
http://www.lothar-miller.de/s9y/archives/88-VHDL-vs.-Verilog-am-Beispiel-einer-Stoppuhr.html

von Samuel J. (capstrovor)


Lesenswert?

Ok danke für die Antworten!

@Christian R.

Ja ich weiß, dass diese Beispiel sehr umständlich gemacht wurde. Es war 
wahrscheinlich nur als Beispiel für ein Procedure gedacht.

>Überhaupt sollte man >die alten synopsys Libs nicht mehr einsetzen, bei 
>Arithmetik erst recht nicht.

Was meinst du mit synopsys libs? Meinst du die IEEE.std_logic_1164 und 
die IEEE.std_logic_unsigned? Wieso sollte man die nicht mehr verwenden?

@Lothar Miller:

Gibt es also auch Libraries, die solche Grundsachen enthalten (wie 
Komparator, Addierer, usw)?

Was würdest du anstatt der Schleife und der Procedure vorschlagen?
Aber für solch eine Kaskadierung ist doch eine Schleife in einer 
Procedure OK oder?

mfg

von Christian R. (supachris)


Lesenswert?

Ja, die unsigned und signes Libs. Du brauchst eigentlich nur die 
IEEE.std_logic_1164 und die numeric_std dann kannst du einfach addieren, 
multiplizieren und vergleichen und dann stimmt auch das Ergebnis immer, 
denn mit Vektoren rechnet man nicht in VHDL sondern mit signed und 
unsigned. Dafür braucht man keine speziellen Libs.

von Samuel J. (capstrovor)


Lesenswert?

@Christian:

Also kann ich mir mit diesen Libs das hier ersparen:
1
y = (0 & a) + (0 & b);

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


Lesenswert?

Samuel J. schrieb:
> Was würdest du anstatt der Schleife und der Procedure vorschlagen?
Ich verwende für einen Komparator die Vergleiche <,> und =
Dad kann man dann auch so richtig einfach lesen...

Samuel J. schrieb:
> Was meinst du mit synopsys libs? Meinst du die IEEE.std_logic_1164 und
> die IEEE.std_logic_unsigned? Wieso sollte man die nicht mehr verwenden?
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

von Samuel J. (capstrovor)


Lesenswert?

OK vielen Danke für die Antworten! :)

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.