Forum: FPGA, VHDL & Co. Zuweisung in mehreren Processen


von Gustl B. (-gb-)


Lesenswert?

Hallo,

wenn man ein Signal in mehreren Processen zuweist, dann geht das nicht 
in Vivado, obwohl das in Hardware möglich wäre. Gibt es Synthese 
Werkzeuge die das verstehen und richtig machen?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity spielwiese is Port(
5
  clk : in std_logic;
6
  a: in std_logic;
7
  b: out std_logic);
8
end spielwiese;
9
10
architecture Behavioral of spielwiese is
11
12
begin
13
14
process begin
15
  wait until rising_edge(clk);
16
  if a = '1' then
17
    b <= '1';
18
  end if;
19
end process;
20
21
process begin
22
  wait until rising_edge(clk);
23
  if a = '0' then
24
    b <= '0';
25
  end if;
26
end process;
27
28
end Behavioral;

Und hier die Testbench:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity spielwiese_bench is
5
end spielwiese_bench;
6
7
architecture Behavioral of spielwiese_bench is
8
9
component spielwiese is Port(
10
  clk : in std_logic;
11
  a: in std_logic;
12
  b: out std_logic);
13
end component;
14
15
signal clk: std_logic:='0';
16
signal a: std_logic:='0';
17
signal b: std_logic:='0';
18
19
begin
20
21
uut: spielwiese port map(
22
  clk => clk,
23
  a => a,
24
  b => b);
25
  
26
clk <= not clk after 20 ns;
27
28
process begin
29
  wait until rising_edge(clk);
30
  a <= not a;
31
end process;
32
33
end Behavioral;

Also das ist ganz klar getrennt in in keinen Takt gibt es einen 
Konflikt.

: Bearbeitet durch User
von VHDL hotline (Gast)


Lesenswert?

Sowas würde höchstens für solche Spezialfälle gehen, wie du einen 
beschrieben hast. Was sollte die Synthese z.B. hier machen? a oder c 
bevorzugen?

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity spielwiese is Port(
5
  clk : in std_logic;
6
  a: in std_logic;
7
  c: in std_logic;
8
  b: out std_logic);
9
end spielwiese;
10
11
architecture Behavioral of spielwiese is
12
13
begin
14
15
process begin
16
  wait until rising_edge(clk);
17
  if a = '1' then
18
    b <= '1';
19
  end if;
20
end process;
21
22
process begin
23
  wait until rising_edge(clk);
24
  if c = '0' then
25
    b <= '0';
26
  end if;
27
end process;
28
29
end Behavioral;

von Gustl B. (-gb-)


Lesenswert?

Du hast glaube ich nicht verstanden um was es geht. Ich hatte zweimal a 
verwendet weil dadurch sichergestellt ist dass in jedem Takt nur eine 
Zuweisung ausgeführt wird. Also dass immer nur ein Ausgang mit einem 
Eingang verbunden ist und nie zwei Ausgänge untereinander.
Dass Deine Beschreibung nicht synthetisiert ist klar aber meine könnte 
man als Hardware aufbauen.

: Bearbeitet durch User
von Klakx (Gast)


Lesenswert?

Gustl B. schrieb:
> Du hast glaube ich nicht verstanden um was es geht. Ich hatte
> zweimal a verwendet weil dadurch sichergestellt ist dass in jedem Takt
> nur eine Zuweisung ausgeführt wird. Also dass immer nur ein Ausgang mit
> einem Eingang verbunden ist und nie zwei Ausgänge untereinander.
> Dass Deine Beschreibung nicht synthetisiert ist klar aber meine könnte
> man als Hardware aufbauen.

Bei deiner Beschreibung wird auch das Signal für den nächsten Takt 
gespeichert. Damit wird immer 0 und 1 getrieben und du erzählst immer 
ein x.

Im asic kann sowas durch die synthese laufen, aber das ist so 90er :) 
interne tristate Busse sind sehr fehleranfällig und schwer zu testen

von Gustl B. (-gb-)


Lesenswert?

Welches Signal wird bei mir wo gespeichert? Also ja da ist ein Speicher 
aber der Eingang davon wird immer nur mit einem Ausgang verbunden. Wo 
werden denn zwei Ausgänge verbunden?

: Bearbeitet durch User
von VHDL hotline (Gast)


Lesenswert?

Gustl B. schrieb:
> Du hast glaube ich nicht verstanden um was es geht.

Doch hab ich. Deswegen sprach ich von deinem Spezialfall. Warum sollte 
ein Synthesewerkzeug sowas unterstützen?

von Gustl B. (-gb-)


Lesenswert?

Na weil das dann ein Ding mehr ist, das das Werkzeug kann?

Also ich habe verstanden, dass da Vivado zwei Speicher reinbauen will 
und beide Ausgänge davon dann auf b gehen. Aber weil ich das so 
beschrieben habe, dass in jedem Takt nur eine Zuweisung gemacht wird, 
könnte man auch nur einen Speicher verwenden und wahlweise 1 oder 0 
einspeichern.

Wenn ich alles in einen Process schreibe funktioniert es, also wieso 
macht das einen Unterschied und gibt es Synthesewerkzeuge die das auch 
erkennen wenn es auf zwei Processe verteilt ist?
1
process begin
2
  wait until rising_edge(clk);
3
4
  if a = '1' then
5
    b <= '1';
6
  end if;
7
  
8
  if a = '0' then
9
    b <= '0';
10
  end if;
11
12
end process;

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


Angehängte Dateien:

Lesenswert?

Gustl B. schrieb:
> Wenn ich alles in einen Process schreibe funktioniert es
Ja, klar.
Das ist ja der Normalfall: einem Signal wird nur in 1 Prozess ein Wert 
zugewiesen.

> also wieso macht das einen Unterschied
Weil du bei getrennten Prozessen getrennte Flipflops mit jeweils eigenem 
Takt beschreibst. Das ist die Vorgehensweise des Synthesizers: er sieht 
ein rising_edge() mit Zuweisung an B und erzeugt daraus ein Flipflop. 
Und dann sieht er nochmal ein rising_edge() mit Zuweisung an B und 
möchte daraus auch ein Flipflop erzeugen. Da gibts aber schon eines. Und 
davor hängt schon Logik...

> und gibt es Synthesewerkzeuge die das auch erkennen wenn es auf
> zwei Processe verteilt ist?
Ich wüsste nicht.

> wenn man ein Signal in mehreren Processen zuweist, dann geht das nicht
> in Vivado
Siehe Screenshot: es geht nicht mal im ISE-Simulator (ich habe dafür das 
A ein wenig "symmetriert"). Hast du das simuliert bekommen? Womit?

von daniel__m (Gast)


Lesenswert?

Gustl B. schrieb:
> gibt es Synthesewerkzeuge die das auch
> erkennen

Ich denke nicht, dass es Werkzeuge gibt, die diese implizite Angabe 
verstehen. Deine 2 Version sind nämlich nicht gleich, auch wenn die 
Simulation es evtl. sagt. Ich habe mal vervollständigt:
1
process begin
2
  wait until rising_edge(clk);
3
  if a = '1' then
4
    b <= '1';
5
  else
6
    b <= b;
7
  end if;
8
end process;
9
10
process begin
11
  wait until rising_edge(clk);
12
  if c = '0' then
13
    b <= '0';
14
  else
15
    b <= b;
16
  end if;
17
end process;

Durch den fehlende Zweig wird implizit verlangt, dass sich das Signal b 
nicht ändern soll. Dies führt in HW zu einem clock enable oder einer 
feedback-Logik (wie ich es oben beschrieben habe).

Wie soll die Synthese jetzt dieses Kollision auflösen?

Daher würde ich nicht sagen, dass die Synthesewerkzeuge es falsch machen 
(oder besser machen könnten), sondern es vollkommen richtig ist.

PS: je nach Simulator führt die erste Beschreibung auch zu Fehlern (oder 
zumindest zu Warnungen): "multiple drivers".

grüße

von Klaus Falser (Gast)


Lesenswert?

Bitte 100 x an die Tafel schreiben:
"VHDL ist keine Programmiersprache".

Wenn man ein Signal aus 2 verschiedenen Prozessen zuweist, dann ergeben 
sich in VHDL 2 Treiber für das Signal.
Dies ist zulässig und wird für die Simulation eines Busses benötigt und 
verwendet.
Das Ergebnis ergibt sich mit der resolve Funktion( google nach resolved 
signals)
In deinem Beispiel treibt Prozess 1 das Signal mit 1, der andere mit 0.
Dies entspricht einem Bus Signal, das von einem Chip mit 0 und vom 
2.Chip mit 1 getrieben wird -> Konflikt.
Schlimmer noch, jeder Chip nimmt in deinem Beispiel das Signal nicht 
zurück.

Dein Wunsch kann nich implementiert werden, weil VHDL anders 
funktioniert als Du Dir vorstellst.

Deshalb: 100 x an die Tafel....

von Falk B. (falk)


Lesenswert?

@  Gustl Buheitel (-gb-)

>wenn man ein Signal in mehreren Processen zuweist, dann geht das nicht
>in Vivado,

Und auch nicht in anderen Synthesewerkzeugen, wahrscheinlich nicht mal 
im reinen Simulator.

>obwohl das in Hardware möglich wäre.

Ach ja? Na dann zeichne mal einen äquivalenten Schaltplan.

>Gibt es Synthese Werkzeuge die das verstehen und richtig machen?

Gibt es VHDL-Designer, die das mit den gegebenen Werkzeugen und Methoden 
richtig machen können?

von Vancouver (Gast)


Lesenswert?

Wenn ein Signal aus mehreren Prozessen zugewiesen wird, ist das im 
Allgemeinen unbeabsichtigt und ein Fehler, auch wenn es bei Deiner 
Beschreibung vielleicht rein logisch gesehen funktionieren würde. Auf 
jeden Fall ist das schlechter Stil, der Code ist kaum verständlich und 
schlecht wartbar. Es schüttelt mich bei dem Gedanken, erstmal alle 
Qullen eines Signal im Code suchen zu müssen, bevor ich sein Verhalten 
verstehen kann.

Deswegen machen meisten Tools "kurzen Prozess" und hauen Dir Dein 
Konstrukt gleich um die Ohren, anstatt eine tief gehende Analyse 
durchzuführen, ob es vielleicht dich geht. Wie in jeder Sprache gilt 
auch bei VHDL:  Nicht alles, was geht, ist auch gut.

von Valko Z. (hydravliska)


Lesenswert?

Vancouver schrieb:
> Wie in jeder Sprache gilt
> auch bei VHDL:  Nicht alles, was geht, ist auch gut.

Und dass nicht alles was simuliert wurde auch synthesefähig ist :)


Gruss

von Gustl B. (-gb-)


Lesenswert?

@ daniel__m: Ich hatte den else-Zweig extra weggelassen weil dann das 
Signal nur zugewiesen wird wenn die if-Bedingung zutrifft.

@ Lothar Miller: Vielen Dank, bei mir sah die Simulation so aus wie bei 
Dir.

@ Klaus Falser und Falk Brunner: Das was Ihr schreibt stimmt wenn man 
aus der Beschreibung zwei Speicherelemente gebaut werden. Ich möchte 
aber, dass die Synthese das erkennt und nur ein Speicherelement einbaut.

Ich weiß auch dass VHDL keine Programmiersprache ist und warum das was 
ich beschrieben hatte nicht funktioniert, das ist mir alles klar. Aber 
ich bin der Meinung, dass ein Synthesewerkzeug sehen könnte, dass b zu 
einem Zeitpunkt immer nur in einem Process zugewiesen wird. Und dann 
eben auch nur ein Speicherelement einbauen. Dass das nicht gemacht wird 
ist mir klar, die Frage war aber ob es Werkzeuge gibt die das erkennen.

Natürlich ist das keine saubere Beschreibung, die Frage hier war einfach 
nur aus Interesse.

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


Angehängte Dateien:

Lesenswert?

Gustl B. schrieb:
> Aber ich bin der Meinung, dass ein Synthesewerkzeug sehen könnte, dass b
> zu einem Zeitpunkt immer nur in einem Process zugewiesen wird.
Hier ist es so, dass das Signal eben immer mit definiertem Pegel 
speichernd(!) aus 2 Prozessen getrieben wird.

Wenn du es als Tristate und ohne Zugriffskonflikte beschreibst, dann 
simuliert es wie gewünscht und es kommt sogar Hardware raus:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity spielwiese is Port(
5
  clk : in std_logic;
6
  a: in std_logic;
7
  b: out std_logic);
8
end spielwiese;
9
10
architecture Behavioral of spielwiese is
11
12
begin
13
14
process begin
15
  wait until rising_edge(clk);
16
  if a = '1' then
17
    b <= '1';
18
  else
19
    b <= 'Z';
20
  end if;
21
end process;
22
23
process begin
24
  wait until rising_edge(clk);
25
  if a = '0' then
26
    b <= '0';
27
  else
28
    b <= 'Z';
29
  end if;
30
end process;
31
32
end Behavioral;
Allerdings sieht das Ganze recht grobschlächtig aus...

von Falk B. (falk)


Lesenswert?

@Gustl Buheitel (-gb-)

>@ Klaus Falser und Falk Brunner: Das was Ihr schreibt stimmt wenn man
>aus der Beschreibung zwei Speicherelemente gebaut werden. Ich möchte
>aber, dass die Synthese das erkennt und nur ein Speicherelement einbaut.

Und die Synthese möchte, daß DU dich an bestehende Regeln hälst und 
gleich alles in einen Prozess schreibst. Der Rest der Welt kommt damit 
problemlos klar.

>ist mir klar, die Frage war aber ob es Werkzeuge gibt die das erkennen.

Wozu? Damit DU dein persönliches Weltbild von VHDL ausleben kannst?

>Natürlich ist das keine saubere Beschreibung, die Frage hier war einfach
>nur aus Interesse.

Und wieder ist ein Sack Reis in China umgefallen . . .

von Gustl B. (-gb-)


Lesenswert?

Also ich will das nicht machen weil ich es selber für schlecht lesbar 
halte, aber theoretisch wäre sowas ja möglich dass ein Synthesewerkzeug 
das erkennen könnte. Und genau das war eben die Frage.
Ich weiß auch wie man das so beschreibt dass es synthetisiert, ist ja 
ein einfaches Beispiel. Wer mit der Frage unzufrieden ist braucht nicht 
zu antworten, ist jetzt aber auch beantwortet.

Vielen Dank an Alle!

von K. Alf (Gast)


Lesenswert?

Gustl B. schrieb:
> Also ich will das nicht machen weil ich es selber für schlecht lesbar
> halte, aber theoretisch wäre sowas ja möglich dass ein Synthesewerkzeug
> das erkennen könnte. Und genau das war eben die Frage.

Du kanns dir ja das ganze als eine Art Präprozessor wünschen, da 
brauchst kein neues synthesewerkzeug. Also ein Tool das den VHDL-code 
mit multi-process-write liest und daraus VHDL-code mit 
single-process-write code erzeugt. Hardwaretechnisch muss man dazu nur 
einen Multiplexor vor das speicherelement setzen.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Gustl B. schrieb:
> wenn man ein Signal in mehreren Processen zuweist, dann geht das nicht
> in Vivado, obwohl das in Hardware möglich wäre.

Sowas geht zurecht nicht. Es gibt keinen Grund, Signale aus mehreren 
Ecken heraus steuern zu wollen, weil dann, wenn man ein Signal als 
physisch interpretiert, es eben in der Hardware NICHT geht. Es geht nur 
über Verundung oder Verorderung und das kann man programmieren.

von Klakx (Gast)


Lesenswert?

Gustl B. schrieb:
> @ daniel__m: Ich hatte den else-Zweig extra weggelassen weil dann das
> Signal nur zugewiesen wird wenn die if-Bedingung zutrifft.

Nein, Daniel ist da völlig richtig, es wird auch genauso zugewiesen als 
wenn ein else-Zweig darin wäre. Ich denke hier liegt der massive 
Denkfehler.

Das Signal wird weiterhin getrieben, wenn der Prozess bei Taktflanke 
durchlaufen wird ohne in den if-Zweig zu springen. Egal ob else oder 
kein else geschrieben. Das wäre das selbe.

von Gustl B. (-gb-)


Lesenswert?

Klakx schrieb:
> Nein, Daniel ist da völlig richtig, es wird auch genauso zugewiesen als
> wenn ein else-Zweig darin wäre. Ich denke hier liegt der massive
> Denkfehler.

Natürlich wird es so zugewiesen als stünde da ein else-Zweig. Aber nur 
weil da zwei Speicherelemente verwendet werden, für jeden Process eines. 
Was ich meinte setzt vorher an und zwar dass das Werkzeug erkennt, dass 
es immer nur in einem Process zugewiesen wird zu einem Zeitpunkt und 
dann auch nur ein Speicherelement einbaut. Also dass es den zweiten 
Process als else Pfad von selbst erkennt.

von daniel__m (Gast)


Lesenswert?

Gustl B. schrieb:
> dass das Werkzeug erkennt, dass
> es immer nur in einem Process zugewiesen wird zu einem Zeitpunkt und
> dann auch nur ein Speicherelement einbaut.

Dazu müsste man die Regeln von VHDL (und vermutlich jeder anderen HDL) 
ändern, da es eine Behandlung eines Sonderfalls darstellt. Das würde 
m.M.n. alles eher komplizierter und undurchsichtiger machen. Es nimmt 
die Möglichkeit, eventuelle (bzw. eher wahrscheinliche) 
Beschreibungsfehler zu erkennen und anzumerken.

Falls es zu diesem Featurerequest käme, würde ich es nicht befürworten, 
da es genügend Alternativen der Beschreibung gibt.

grüße

von Gustl B. (-gb-)


Lesenswert?

Ich will dieses Feature auch nicht, ich hatte schlicht gefragt ob diese 
Beschreibung von irgendeinem Synthesewerkzeug umgesetzt wird.

von J. S. (engineer) Benutzerseite


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #4812940:
> wenn man ein Signal als
> physisch interpretiert, es eben in der Hardware NICHT geht.

Nicht nur dann. Auch wenn ein Signal als das interpretiert wird, als was 
es interpretiert werden sollte, nämlich als eine logische Zuweisung 
einer Information von einer Quelle zu einer Senke, entsteht immer ein 
möglicher Widerspruch.

Ich habe zu dem Thema schon mehrfach Stellung genommen und bleibe fest 
bei meiner Vorgehensweise, nämlich Signale vom Ausgang her zu denken und 
alle Fälle explizit aufzuziehen, in denen eine Wirkung auf diesen 
Ausgang entstehen soll. Dies kommt dann in einen einzigen Prozess. Das 
ist übersichtlich und vor allem gut prüfbar.

Sparen kann man sich das nur bei der Simulation, weil in dieser die 
Gleichzeitigkeit der Gültigkeit von Signalen und Variablen aufgelöst 
wird, weil die Simulationsreihenfolge ins Spiel kommt. Die kann man 
natürlich nutzen, um Signale einfacher zu manipulieren. Ob man es aber 
auch tun sollte oder doch lieber Zwischensignale mit eindeutigem Vorrang 
und Wirkungen benutzen sollte, wodurch explizit ablesbar wird, was 
passiert, sei dahingestellt.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Falk B. schrieb:
> Und die Synthese möchte, daß DU dich an bestehende Regeln hälst und
> gleich alles in einen Prozess schreibst. Der Rest der Welt kommt damit
> problemlos klar.

:-)

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.