Forum: FPGA, VHDL & Co. Alternative Prozess-Beschreibung


von Heinze78 (Gast)


Lesenswert?

Hallo zusammen,

bin beim Googeln auf folgende Seite gestoßen:

www.gaisler.com/doc/vhdl2proc.pdf


Hat jemand diese VHDL-Prozess-Variante schon mal verwendet ?

Wenn ja, was waren Eure Erfahrungen im Vergleich zur "gängigen"
Architektur mit mehreren Prozessen ?

Wenn nein, was ist Eure Meinung hierzu ? Unter welchen 
(Design-)Umständen könnte sich eine solche Herangehenweise lohnen ?

VG,
Heinze

von Roger S. (edge)


Lesenswert?

> Hat jemand diese VHDL-Prozess-Variante schon mal verwendet ?

Such mal in diesem Forum nach statemachine. Wenn immer sich jemand ins 
Knie schiesst, dann weil er die Zwei-Prozess-Variante verwendet und sie 
nicht versteht.

> Wenn nein, was ist Eure Meinung hierzu ?

Das count8 Beispiel zeigt sehr schoen wie man etwas simples 
verkomplizieren kann.

Cheers, Roger

von Heinze78 (Gast)


Lesenswert?

Hi Roger,

kann den von dir angesprochenen Beitrag nicht finden.
Wie hieß denn der Beitrag ?

Heinze

von Roger S. (edge)


Lesenswert?


von Heinze78 (Gast)


Lesenswert?

Roger,

hast du dir den Paper-Link überhaupt mal angeschaut ? Die Beiträge, die
du nennst, haben aber auch rein gar nix damit zu tun :o(

VG,
Heinze

von Roger S. (edge)


Lesenswert?

Tja da verstanden wir uns wohl Miss.
Wenns dir um das angesprochene count8 Beispiel geht, auf Seite 5 (45).

Cheers, Roger

von Heinze78 (Gast)


Lesenswert?

Was willst du mir mit deinem letzten Beitrag sagen ? Du musst mal
vollständige und verständliche Sätze schreiben, dann klappts vielleicht 
auch ;O)

Du willst mir also sagen, dass das Zähler-Beispiel auf Seite 5 des 
Papers
in Deinen Augen durch die Record-Verwendung zu kompliziert wird ?
Was genau ist deiner Meinung nach daran kompliziert ?

VG,
Heinze

von Roger S. (edge)


Lesenswert?

Heinze78 schrieb:
> Was willst du mir mit deinem letzten Beitrag sagen ? Du musst mal
> vollständige und verständliche Sätze schreiben, dann klappts vielleicht
> auch ;O)

Perlen vor die Saeue.

von Heinze78 (Gast)


Lesenswert?

Wenn man nur wirres Zeug von sicht gibt, das nicht auf die Eingangsfrage
eingeht, dann sollte man sich die Perlen tatsächlich sparen ;O)

Gibt es noch konstruktive Meinungen zum Thema ?

VG,
Heinze78

von Duke Scarring (Gast)


Lesenswert?

@Heinze78:

Die Methode hat m.E. mehr Vor- als Nachteile. Man kann Dank records z.B. 
keine Signale beim Reset vergessen. Nach einer gewissen 
Einarbeitungszeit kann man auch nachträglich gut verstehen, was da vom 
Code gemacht wird (ist fast selbsterklärend).

Duke

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


Lesenswert?

1
The goals and means of the ’two-process’ design method
> Hat jemand diese VHDL-Prozess-Variante schon mal verwendet ?
Meine Meinung:
Da werden wieder mal ein paar Desginvarianten zusammengemostet und an 
simplen Beispielen anschaulich dargestellt. Arg pauschal sind dann 
solche Aussagen:
1
The above goals are reached with suprisingly simple means:
2
• Using record types in all port and signal declarations
3
• Only using two processes per entity
4
• Using high-level sequential statements to code the algorithm
Nur zwei Prozesse pro Entity? Na dann viel Spass bei größeren 
Projekten...
1
combinational : process(load, count, d, r)
2
variable tmp : std_logic_vector(7 downto 0);
3
begin
4
  if load = 1 then tmp := d;
5
  elsif count = 1 then tmp := r + 1;
6
  else tmp := r; end if;
7
  rin <= tmp;
8
  q <= r;
9
end process;
Kombinatorik für einen ladbaren 8-Bit-Zähler...
Lesbar????

> Wenn ja, was waren Eure Erfahrungen im Vergleich zur "gängigen"
> Architektur mit mehreren Prozessen ?
Ich mache keine Zwei- und Mehr-Prozess-Beschreibungen mehr. Gründe siehe 
dort: 
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html

BTW:
Ich gebe nichts auf Dokumente, in denen nicht einmal das 
Erstellungsdatum festgehalten wurde. Evtl. wird dort Designpraxis von 
1997 als "neu" verkauft   :-o

von berndl (Gast)


Lesenswert?

Hi,

ich hab's mir auch mal durchgelesen. Haengen geblieben ist der Vorsatz, 
in Zukunft ernsthafter ueber Records nachzudenken. Aber wie oben schon 
erwaehnt wurde, der Counter ist m.E. in der Form eine Katastrophe. Das 
kann man mit weniger Code, evtl. einer Kommentarzeile dazu, viel 
einfacher und uebersichtlicher machen.

Schliesse mich also der Kritik der Vorposter an. Und die Sache mit den 
Records sorgt eigentlich auch nur dafuer, dass ich an ein oder zwei 
Stellen nicht aendern muss. Aber das Dokument geht ueberhaupt nicht 
darauf ein, was mit neu hinzu gekommenen Signalen irgendwo gemacht wird. 
Und wenn ich in eine Komponente einen Record mit Signalen route, die 
dann dort ueberhaupt nicht gebraucht/benutzt werden, dann ist's mit der 
Lesbarkeit und dem Verstaendnis auch schnell vorbei. Also mein Fazit: 
Cool bleiben!

von Duke Scarring (Gast)


Lesenswert?

@berndl:
> Und wenn ich in eine Komponente einen Record mit Signalen route, die
> dann dort ueberhaupt nicht gebraucht/benutzt werden, dann ist's mit der
> Lesbarkeit und dem Verstaendnis auch schnell vorbei.

Das mit den records ist schon eine coole Sache, die m.E. wirklich was 
bringt. In der Synthese werden nicht benötigte record-Elemente, 
wegoptimiert. Und wenn ich irgendwo ein record-Element drinhabe und 
nicht brauche, dann schreibe ich es auch nicht hin.
Also an der Stelle leiden dann weder Lesbarkeit, noch das Verständnis.

@Lothar:
> Nur zwei Prozesse pro Entity? Na dann viel Spass bei größeren
> Projekten...
Ich würde das woran ich hier arbeite schon als größeres Projekt 
bezeichnen. Wir setzen auch so ziemlich jeden Designstil, den man sich 
ausdenken kann (aus jedem Dorf ein Hund...)

Meiner Erfahrung nach läßt sich der Teil, der mit der 
Zwei-Prozess-Methode (seq, comb) realisiert ist, wesentlich besser 
warten und erweitern als die anderen Projektteile.

> Arg pauschal sind dann
> solche Aussagen:
1
The above goals are reached with suprisingly simple means:
2
• Using record types in all port and signal declarations
3
• Only using two processes per entity
4
• Using high-level sequential statements to code the algorithm
Hast Du es schonmal praktiziert? Ich kann das, was da steht genau so 
unterschreiben.

Duke

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


Lesenswert?

Duke Scarring schrieb:
>> Arg pauschal sind dann solche Aussagen:
>
1
> The above goals are reached with suprisingly simple means:
2
> • Using record types in all port and signal declarations
3
> • Only using two processes per entity
4
> • Using high-level sequential statements to code the algorithm
5
>
> Hast Du es schonmal praktiziert?
> Ich kann das, was da steht genau so unterschreiben.

Wenn ich das mal zerpflücke:
> • Using record types in all port and signal declarations
Das ist einen genaueren Blick wert.
Im Text werden allerdings genau diese Records als Allheilmittel gegen 
unvollständige Sensitiv-Listen angepriesen. Und solche unvollständige 
Sensitiv-Listen kann es nur geben, wenn ich einen kombinatorischen 
Prozess habe und somit die Listen brauche.

Für eine sinnvolle Umsetzung der Record-Strategie wäre ein 
"Auto-Vervollständigen" wie z.B. bei Structs im Visual-Studio zwingend 
notwendig. Denn sonst müsste ich immmer parallel die Package-Definition 
offen halten, um zu sehen, welche Elemente der Record beinhaltet.

> • Only using two processes per entity
Das wäre für mich eine unnötige Einschränkung, weil sich dadurch einfach 
(zwingend) mehr Entities ergeben. Und was soll daran dann besser les- 
und wartbar sein?

> • Using high-level sequential statements to code the algorithm
Das ist etwas, das einen meiner Prozesse direkt beschreibt. Und die 
angegebenen Beispiele lassen sich auch in der 1-Prozess-Schreibweise 
vortrefflich einsetzen.

In der Summe ist m.E. in diesen 3 "suprisingly simple means" nichts zum 
eigentlichen Designstil festgehalten. Und als Fazit dürfte gelten:
1
By defining a common coding style, the algorithm can be easily identified and 
2
the code analysed and maintained also by other engineers than the 
3
main designer.

von Heinze78 (Gast)


Lesenswert?

@ Duke
>Man kann Dank records z.B >keine Signale beim Reset vergessen.

Ist dies so ? Man muss doch jedes Record-Element einzeln resetten, 
durchaus
mit unterschiedlichen Reset-Werten. Da könnte es doch passieren, dass
man Record-Elemente vergisst ?

Könntest du deine Aussage noch etwas weiter ausführen ?


Ein weiterer Punkt, der mir noch unklar erscheint, ist der, dass man
bei der "klassischen" Verwendung von mehreren Prozessen pro ARCHITECTURE
Pipeline-Stufen überschaubar einfügen kann. Wie verhält es sich bei
der im Paper beschriebenen Zwei-Prozess-Variante ? Wie ist hier die
Vorgehensweise, um nachträglich Pipelines einzufügen ?


VG,
Heinze

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


Lesenswert?

Ich habe mal das Beispiel des 8-Bit-Counters auf der Seite 45 
synthetisiert.
Erst mal waren in dem Code-Beispiel gute 8 Syntaxfehler drin: vom 
fehlenden end record; über falsch geschriebene d.data und r.val + 1, bis 
zur fehlenden use ieee.std_logic_unsigned.all; für ebendiese Addition. 
Das stimmt mich bei einem publizierten Codeabschnitt nachdenklich...

Und dann fiel mir auf, dass in diesem Beispiel
1
   comb : process(d, r) -- combinational process
2
      variable v : reg_type;
3
   begin
4
      v := r; -- default assignment
5
      v.load := d.load; v.count := d.count; -- overriding assignments
6
      v.zero := '0';
7
      if r.count = '1' then v.cval := r.cval + 1; end if; -- module algorithm
8
      if r.load = '1' then v.cval := d.din; end if;
9
      if v.cval = "00000000" then v.zero := '1'; end if;
10
      rin <= v; -- drive register inputs
11
      q.dout <= r.cval; q.zero <= r.zero; -- drive module outputs
12
   end process;
so viel implizites Wissen drinsteckt (korrekte Reihenfolge der 
Zuweisungen unbedingt einhalten), dass ein Fortschritt in Richtung 
bessere Verständlichkeit und Wartbarkeit des Codes für mich nicht 
erkennbar ist.

Der einzige Vorteil gegenüber der "traditionellen" 2-Prozess-Methode 
ist, dass alle Ausgänge registriert sind. Es kann also keine Glitches 
geben. Allerdings könnte man sich im ersten Augenblick fragen, wozu ein 
ladbarer 8-Bit Counter 11 FFs braucht  :-o

von Duke Scarring (Gast)


Lesenswert?

@Heinze78:
Hier mal ein Codebeispiel:
1
  type matrix_t is record
2
    en    : std_logic;
3
    fd    : std_logic; -- first data
4
    h11   : complex_t;
5
    h12   : complex_t;
6
    h21   : complex_t;
7
    h22   : complex_t;
8
  end record matrix_t;
9
  constant default_matrix_c : matrix_t := (en => '0', fd => '0', others => (others => (others => '0'))); 
10
11
  type reg_t is record
12
    p_toggle     : std_logic;
13
    d_toggle     : std_logic;
14
    odd          : std_logic;
15
    cdd_type     : cdd_type_t;
16
    add_matrix   : matrix_t;
17
    mul_matrix   : matrix_t;
18
    d_i          : cdd_data_t;
19
    d_o          : cdd_data_t;
20
  end record reg_t;
21
  constant default_reg_c : reg_t :=(
22
    p_toggle     => '0',
23
    d_toggle     => '0',
24
    odd          => '0',
25
    cdd_type     => direct,
26
    add_matrix   => default_matrix_c,
27
    mul_matrix   => default_matrix_c,
28
    d_i          => default_cdd_data_c,
29
    d_o          => default_cdd_data_c
30
  );
31
32
[...]
33
34
  seq: process (clk, rst_n)
35
  begin
36
    if rst_n = '0' then
37
      r <= default_reg_c;
38
    elsif rising_edge(clk) then
39
      r <= rin;
40
    end if;
41
  end process seq;

Beim Reset wird der default zugewiesen. Wenn man den record erweitert, 
gibt es schon eine Fehlermeldung wenn man die default_*_c nicht mit 
erweitert.

Pipelines sind in der Tat etwas ungewohnt. Da man im Kombinatorischen 
Prozess nur mit Variablen arbeitet, muß man die letzte Pipelinestufe 
zuerst beschreiben. Ungefähr so:
1
  comb: process (r, d_i) is
2
    variable v: reg_t;
3
  begin
4
    v   := r;
5
    d_o <= v.d_o;
6
7
    v.d_o.matrix := v.mul_matrix;
8
    v.mul_matrix := v.add_matrix;
9
    v.add_matrix := v.d_i.matrix;
10
    v.d_i        := d_i;
11
12
    rin <= v;
13
  end process comb;

@Lothar:
Deine Aussage
> (korrekte Reihenfolge der Zuweisungen unbedingt einhalten)
entspricht
1
• Using high-level sequential statements to code the algorithm

:-) Damit wird VHDL zur sequenziellen Programmiersprache. Man darf 
trotzdem nicht vergessen, das da Hardware draus gebaut wird und das das 
im Prinzip alles in einem Takt realisiert werden muss. (Außer man 
verwendet Pipelines und FSMs.)

Happy coding
Duke

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


Lesenswert?

> Damit wird VHDL zur sequenziellen Programmiersprache.
Ok, das habe ich bisher implizit in Schleifen und Unterprgrammen auch 
schon gemacht...
Die Verwendung von Variablen war schon immer sequenziell. Durch das 
Verwaltungs-Korsett, das um den Prozess geschnallt wird, wird dann der 
ganze Prozess quasi-sequenziell.

Allerdings ist da auch eine Art "Pseudo-Sequenz" versteckt:
1
   comb : process(d, r) -- combinational process
2
      variable v : reg_type;
3
   begin
4
      v := r; -- default assignment
5
      v.load := d.load; v.count := d.count; -- overriding assignments
6
      v.zero := '0';
7
      if r.count = '1' then v.cval := r.cval + 1; end if; -- module algorithm
8
      if r.load = '1' then v.cval := d.din; end if;
9
      if v.cval = "00000000" then v.zero := '1'; end if;
10
      rin <= v; -- drive register inputs
11
      q.dout <= r.cval; q.zero <= r.zero; -- #### Ausgabezeile #### -- drive module outputs
12
13
   end process;
Die "Ausgabezeile" könnte überall im Prozess stehen, ohne dass sich an 
der Funktion irgenwas ändert.
Ich würde die "sogar" concurrent beschreiben. Denn ich gebe/gäbe für 
einen neuartigen Beschreibungsstil nicht die Hälfte der Syntaxelemente 
von VHDL auf.

> Man darf nicht vergessen, das da Hardware draus gebaut wird
Fullstes ACK  ;-)

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.