"This signal is connected to multiple drivers"

Gast #4778319
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.
Gast #4778336
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)?
Moderator (Firma: Titel) Persönliche Seite #4778522
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?
Gast #4778654
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.
Gast #4779020
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.
(Firma: Home) #4779109
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;
Gast #4779334
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.
Gast #4783185
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.
Gast #4783272
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'.
Gast #4784726
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren