Forum: FPGA, VHDL & Co. "This signal is connected to multiple drivers"


von vhtl (Gast)


Lesenswert?

Hallo,

ich habe (sinngemäß) den folgenden VHDL-Schnipsel für ein CPLD:
1
P1: process(S1)
2
begin
3
  if falling_edge(S1) then
4
    if V = '0' then
5
      Q <= ...
6
    end if;
7
  end if;
8
end process;
9
  
10
P2: process(S2)
11
begin
12
  if rising_edge(S2) then
13
    if V = '1' then
14
      Q <= ...
15
    end if;
16
  end if;
17
end process;

ISE meldet bei der Synthese

ERROR:Xst:528 - Multi-source in Unit <test> on signal <Q>; this signal 
is connected to multiple drivers.
Drivers are:
   Output signal of FDCE instance <Q>
   Output signal of FDCE instance <Q_ren>

Den entsprechenden Schaltplan könnte ich vermutlich aufmalen. Aber wie 
sage ich es in VHDL?

Den Beitrag #130895 hier kenne ich, aber die Lösung steht noch aus.

von vhtl (Gast)


Lesenswert?

Und ich vergaß zu erwähnen: Ich will für diese Schaltung keinen 
externen Master-Takt verwenden. :-)

von vhtl (Gast)


Lesenswert?

Zeit für Selbstgespräche: Was mir einfällt ist
1
S <= not S1 when V = '0' else S2;
2
P: process(S)
3
begin
4
  if rising_edge(S) then
5
    if V = '0' then
6
      Q <= ...
7
    else
8
      Q <= ...
9
    end if;
10
  end if;
11
end process;

Ist das "die" Lösung, oder wie macht man das am besten (ohne externen 
Takt)?

von K. L. (Gast)


Lesenswert?

Mit dem Takt hat das wenig zu tun. Zwei dürfen und können eh nicht auf 
ein Signal arbeiten.

Schreibe mal für jedes Signal einen Prozess, so, dass es nur dort vorkom
mt.

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


Lesenswert?

vhtl schrieb:
> Den entsprechenden Schaltplan könnte ich vermutlich aufmalen.
Zeichne doch mal das Flipflop mit 2 Takteingängen und gib einen TTL 
Baustein an, der das kann. Denn auf Q werden mit 2 unabhängigen Takten 
Daten geschrieben. Ich kenne ein solches Bauteil nicht. Und schon gar 
nicht innerhalb eines CPLDs...

vhtl schrieb:
> Was mir einfällt...
Das hat mit der ursprünglichen Beschreibung aber nicht mehr viel zu tun.

Was sind denn die Signale? Woher kommen die Takte und was hat das V 
damit zu tun?

von Fpgakuechle K. (Gast)


Lesenswert?

vhtl schrieb:
1
 P1: process(S1)
2
 begin
3
   if falling_edge(S1) then
4
     if V = '0' then
5
       Q <= ...
6
     end if;
7
   end if;
8
 end process;
9
 
10
 P2: process(S2)
11
 begin
12
   if rising_edge(S2) then
13
     if V = '1' then
14
       Q <= ...
15
     end if;
16
  end if;
17
 end process;

> ISE meldet bei der Synthese
>
> ERROR:Xst:528 - Multi-source in Unit <test> on signal <Q>; this signal
> is connected to multiple drivers.

Das ist mehreres falsch in dem Code:

Das signal Q wird in mehreren processen gesetzt, jeder process wird 
sinngemäß nach der Synthese zu einem Signaltreiber (driver). der eingang 
des FF ist also mit mehrere treibern (mulitiple driver) beschaltet, das 
ist illegal. Das selbe szenario hättest du wenn du zwei Ouput-pins eines 
µC kurzschliesst.


Auf weitere Fehler wurde bereits im thread hingewiesen.

von vhtl (Gast)


Lesenswert?

Lothar M. schrieb:
> vhtl schrieb:
>> Den entsprechenden Schaltplan könnte ich vermutlich aufmalen.
> Zeichne doch mal das Flipflop mit 2 Takteingängen und gib einen TTL
> Baustein an, der das kann.

Ja, meine Vermutung war falsch. :-) Beim Nachdenken bin ich aber auf die 
Version 2 gestoßen.

>> Was mir einfällt...
> Das hat mit der ursprünglichen Beschreibung aber nicht mehr viel zu tun.

Ich finde, das ist zumindest von der Intention her equivalent.

> Was sind denn die Signale? Woher kommen die Takte und was hat das V
> damit zu tun?

Die Takte sind eigentlich nur Signale, vglb. einem "Output Enable". Da 
jedoch ein Zähler involviert ist, benötige ich die Flanken. Über V wird 
gesteuert, welches OE-Signal Priorität hat.

Ich könnte auch zwei getrennte Zähler verwenden (Q1 und Q2), dann gäbe 
es das Problem nicht - ich muß aber FFs sparen.

Da sonst niergendwo ein Takt ist, will ich hierfür nicht extra einen 
einführen... Wir reden ja von einem kleinen CPLD.

von Duke Scarring (Gast)


Lesenswert?

vhtl schrieb:
> benötige ich die Flanken
Man baut sich üblicherweise eine Flankenerkennung und zählt dann.

> Wir reden ja von einem kleinen CPLD
In diesem Fall muß man tatsächlich mit FF geizen...

Duke

von Noro S. (Firma: Home) (schmidt)


Lesenswert?

1
P1: process(S1)
2
 begin
3
   if falling_edge(S1) then
4
     if V = '0' then
5
       Q1 <= ...
6
     end if;
7
   end if;
8
 end process;
9
 
10
 P2: process(S2)
11
 begin
12
   if rising_edge(S2) then
13
     if V = '1' then
14
       Q2 <= ...
15
     end if;
16
  end if;
17
 end process;
18
19
  Q <= Q1 or Q2;

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Packt die Lösung mal gleich wieder weg, bevor sie einer kopiert!

Das ist das Schlechteste, was man bauen kann, weil so das finale Q 
gleich gegenüber zwei Prozessen ansynchron ist.

Das Gebastel geht mehr in Richtung Analogdesign und hat mit synchronem 
Schaltungsentwurf nichts zu tun.

von vhtl (Gast)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #4779334:
> Packt die Lösung mal gleich wieder weg, bevor sie einer kopiert!

Welche denn? Oder beide?

@Noro: Finde ich viel besser, danke!

> Das ist das Schlechteste, was man bauen kann, weil so das finale Q
> gleich gegenüber zwei Prozessen ansynchron ist.

Genau, das soll asynchron sein. Ein Gewurschtel aus 74s ist ja auch 
nicht synchron.

> Das Gebastel geht mehr in Richtung Analogdesign und hat mit synchronem
> Schaltungsentwurf nichts zu tun.

Nun, der zweite Teilsatz ist richtig. :-) Aber nix für ungut, ich habe 
schon verstanden, das ein FPGA genau einen Takt hat, von dem alles 
abhängt.

von dfIas (Gast)


Lesenswert?

Noro S. schrieb:
>
1
> P1: process(S1)
2
>  begin
3
>    if falling_edge(S1) then
4
>      if V = '0' then
5
>        Q1 <= ...
6
>      end if;
7
>    end if;
8
>  end process;
9
> 
10
>  P2: process(S2)
11
>  begin
12
>    if rising_edge(S2) then
13
>      if V = '1' then
14
>        Q2 <= ...
15
>      end if;
16
>   end if;
17
>  end process;
18
> 
19
>   Q <= Q1 or Q2;
20
>
Das wissen wir ja nicht, ob es so gemeint ist. Vielleicht eher so?
1
...
2
Q <= Q1 when V = '0' else Q2;
Sieht mir nämlich eher danach aus, als ob V darüber entscheidet, wie 
sich Q verhält. 'or' wäre dann genauso falsch wie 'and' oder 'xor'.

von vhtl (Gast)


Lesenswert?

dfIas schrieb:
> Das wissen wir ja nicht, ob es so gemeint ist. Vielleicht eher so?...
> Q <= Q1 when V = '0' else Q2;
> Sieht mir nämlich eher danach aus, als ob V darüber entscheidet, wie
> sich Q verhält. 'or' wäre dann genauso falsch wie 'and' oder 'xor'.

Ja, Du hast Recht, so war das gemeint. Ich habe mir in dem Noro-Beispiel 
noch je einen else-Zweig
1
  else
2
    Qx <= (others => 'Z');
3
  end if;

hinzugedacht, dann wäre es doch gleich, oder?

Wobei noch zu prüfen wäre, ob es überhaupt synthetisiert werden kann und 
ob sich die Anzahl der FFs nicht wieder verdoppelt.

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.