Forum: FPGA, VHDL & Co. Eigene Auflösungsfunktion für Tri-state


von Stev (Gast)


Lesenswert?

Ich würde gerne eine Auflösungsfunktion schreiben.
Dazu habe ich einen eigenen Sub-Datentyp tribus_r.
Er soll mir bei einem Eingang 'Z' eine schwache 1, also quasi Pull-up 
verhalten geben. Ansonsten soll der Eingang auf den Ausgang 
weitergegeben werden.
Ich wollte mir dazu ein Package machen.
Leider funktioniert das so nicht.
Folgende Fehlermeldung bekomme ich:

"Error: K:/resolve.vhd(9): Type ieee.std_logic_1164.STD_ULOGIC of formal 
"bus_signal" for resolution function "aufloesen" is not an array type."

Kann mir jemand zeigen wie es Funktioniert?
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
4
PACKAGE resolve IS
5
6
  FUNCTION aufloesen(bus_signal : STD_ULOGIC) RETURN STD_ULOGIC;
7
  SUBTYPE tribus_r IS aufloesen STD_ULOGIC;
8
9
END resolve;
10
11
12
PACKAGE BODY resolve IS
13
14
  FUNCTION aufloesen(bus_signal : STD_ULOGIC) RETURN STD_ULOGIC IS
15
    BEGIN
16
      IF bus_signal = 'Z' THEN RETURN 'H';
17
      ELSE RETURN bus_signal;
18
      END IF;
19
  END aufloesen;
20
21
END resolve;

von Klaus (Gast)


Lesenswert?

Stev schrieb:
> "Error: K:/resolve.vhd(9): Type ieee.std_logic_1164.STD_ULOGIC of formal
> "bus_signal" for resolution function "aufloesen" is not an array type."


Eine Auflösungsfunktion ist ja dazu da, den resultierenden Signalwert zu 
bestimmen, wenn es mehrere Quellen für ein Signal gibt. Also muss der 
Funktion die Werte jeder Quelle übergeben werden, damit sie daraus den 
richtigen Wert für das Signal bestimmen kann. Die einzelnen Werte der 
Signaltreiber werden als Vektor übergeben. Du musst also aus bus_signal 
einen vector machen. Und in der Funktion dann die einzelnen Werte dieses 
Vektors durchgehen.

von Johannes (Gast)


Lesenswert?

Ah, danke für den Tip.

Zur vollständigkeit und für alle die danach Suchen hier mal meine 
Funktionierende Lösung.
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
4
5
PACKAGE resolve IS
6
7
FUNCTION aufloesen(bus_signal : STD_ULOGIC_VECTOR) RETURN STD_ULOGIC;
8
SUBTYPE tribus_r IS aufloesen STD_ULOGIC;
9
10
END resolve;
11
12
PACKAGE BODY resolve IS
13
 
14
   FUNCTION aufloesen(bus_signal : STD_ULOGIC_VECTOR) RETURN STD_ULOGIC IS
15
     BEGIN
16
      FOR i IN bus_signal'RANGE LOOP
17
        IF bus_signal(i) = 'Z' THEN RETURN 'H';
18
        ELSE RETURN bus_signal(i);
19
        END IF;
20
      END LOOP;
21
   END aufloesen;
22
23
END resolve;

von Uwe (Gast)


Lesenswert?

>Er soll mir bei einem Eingang 'Z' eine schwache 1, also quasi Pull-up
>verhalten geben. Ansonsten soll der Eingang auf den Ausgang
>weitergegeben werden.

Der Eingang kann kein 'Z' erkennen. Dafür müßte er den Widerstand 
messen.
Der kann nur '0' und '1'. Tristates können 'Z' als zusätzlichen 
Ausgangszustand und damit als OpenCollector oder Eingang agieren. Ein 
'Z' einzulesen ist nicht möglich. Er wäre entweder '0' oder '1' je 
nachdem was sonst noch an dem PIN dran ist. Auch ein 'X' kann man nicht 
einlesen ein Eingang ist entweder '0' oder '1' und nichts anderes 
(zumindest in der Digitaltechnik). Ein 'X' als Ausgang ist übrigens auch 
nur '0' oder '1' (oder 'Z' falls er ein Tristate ist und dann ist er 
auch wieder '0' oder '1' je nach was sonst noch dran ist)

von Johannes (Gast)


Lesenswert?

Uwe schrieb:
> Der Eingang kann kein 'Z' erkennen. Dafür müßte er den Widerstand
> messen.

Es geht hier nicht um ein FPGA sondern rein um VHDL und da geht das sehr 
wohl.

von Johannes (Gast)


Lesenswert?

Der Autor (Stev) bin übrigens ich. Der war vorhin bloß noch von einem 
anderen Nutzer des PCs eingetragen und ich hatte das übersehen

Stev = Johannes

von Uwe (Gast)


Lesenswert?

Nur aus neugier wozu braucht man "sowas" ? Läßt sich das Synthetisieren 
?
Rein theoretisch könnte man die Funktion von soetwas schon machen.
Wenn ich z.B. ein Bussystem (parallel) habe auf das mehrere Teilnehmer 
zugreifen und ich würde die einzelnen Enables der Tristates der 
einzelnen Datenpins der Teilnehmer verknüpfen und wenn alle Tristates 
dieses Datenbits Nicht Enabled sind dann gebe ich auf einem Ausgang 
eines Open Collector IOB ein High (auf dem entsprechenden Bit) aus. Aber 
wozu als trafic Anzeige für einzelne Busleitungen.

von Johannes (Gast)


Lesenswert?

Nein das ist nicht Synthetisierbar, aber das muss es ja auch nicht.
VHDL ist ja nicht nur für Synthese.
Für Testbenches ist sowas zu gebrauchen, denn damit kann man 
"Hardwareverbindungen" zwischen einzelnen Modulen darstellen, oder was 
einem noch so einfällt.

Hätte man zwar auch einacher lösen können, aber für mich als Student war 
das glecihzeitig eine gute Fingerübung ;-)

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


Angehängte Dateien:

Lesenswert?

Johannes schrieb:
> Es geht hier nicht um ein FPGA sondern rein um VHDL und da geht das sehr
> wohl.
LOL. Hört sich ein wenig nach abstraker Betrachtungsweise an...

Dann machs doch einfach so, dass du STD_LOGIC verwendest und immmer 'H' 
auf alle Busleitungen treibst. Hier mal ein Beispiel:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
entity Bustreiber is
5
    Port ( Din  : in  STD_LOGIC;
6
           Dout : out STD_LOGIC);
7
end Bustreiber;
8
9
architecture Behavioral of Bustreiber is
10
begin
11
   Dout <= 'H'; -- Default
12
   Dout <= Din; -- Din auflösen
13
end Behavioral;

Damit wird ein Bus, auf den gleichzeitig 'Z' getrieben wird, automatisch 
auf 'H' gesetzt. Dazu diese Testbench:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
4
ENTITY tb_BT_vhd IS
5
END tb_BT_vhd;
6
7
ARCHITECTURE behavior OF tb_BT_vhd IS 
8
   COMPONENT Bustreiber
9
   PORT( Din : IN std_logic;          
10
         Dout : OUT std_logic);
11
   END COMPONENT;
12
   SIGNAL Din :  std_logic := '0';
13
   SIGNAL Dout :  std_logic;
14
BEGIN
15
   uut: Bustreiber PORT MAP(
16
    Din => Din,
17
    Dout => Dout
18
   );
19
20
   tb : PROCESS
21
   BEGIN
22
      for i in 0 to 8 loop
23
         Din <= std_logic'val(i);
24
         wait for 10 ns;
25
      end loop;
26
   END PROCESS;
Gibt die Waveform aus dem Anhang. Die Zustände von Din im Screenshot 
sind: U X 0 1 Z W L H -
Und man sieht schön, dass da dann bei Z ein H draus wird. Denn bei 
deiner Auflösungsfunktion gibt es zumindest bei den schwachen W und L 
dann eklatante Definitionsprobleme...

von Johannes (Gast)


Lesenswert?

Lothar Miller schrieb:
> LOL. Hört sich ein wenig nach abstraker Betrachtungsweise an...

Das hat nichts mit "abstrakter Betrachtungsweise" zu tun, sondern eher 
damit das VHDL viel mehr ist als FPGA-Designs zu entwickeln.
Ich studiere E-Technik und wir lernen dort den Entwurf, die Simulation, 
Verifikation und Synthese von Integrierten Schaltungen mittels VHDL. 
Stichwort ASIC / Semi Custom Design.
Da war bis jetzt übrigens noch kein FPGA im spiel :D

>Dann machs doch einfach so, dass du STD_LOGIC verwendest und immmer 'H'
>auf alle Busleitungen treibst. Hier mal ein Beispiel:

Das wollte ich ja eben NICHT, sondern ich wollte einen Datentyp mit 
eigener Auflösungsfunktion. Wie es funktioniert habe ich ja bereits 
rausgefunden und oben gepostet.

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


Lesenswert?

Johannes schrieb:
> Das wollte ich ja eben NICHT, sondern ich wollte einen Datentyp mit
> eigener Auflösungsfunktion. Wie es funktioniert habe ich ja bereits
> rausgefunden und oben gepostet.
Nein. Das ist keine Auflösungsfunktion. Insbesondere deshalb, weil deine 
Auflösungsfunktion mit einem 'L' nicht mehr funktioniert. Und das ist 
noch keine sehr abwegige Aufgabe...

> einen Datentyp mit eigener Auflösungsfunktion.
Eine richtige Auflösung sieht z.B. bei STD_LOGIC ganz anders aus. Da 
sind die Operatoren überladen, damit man z.B. einfach
 Z <= A;
 Z <= not B;
schreiben kann, und das dann automatisch aufgelöst wird, und nicht 
erst mit dem expliziten Aufruf einer Funktion.

Und das hat rein gar nichts mit einer praktischen Umsetzung auf FPGAs zu 
tun, wie du selbst ja auch anmerkst:
Johannes schrieb:
> Das hat nichts mit "abstrakter Betrachtungsweise" zu tun, sondern eher
> damit das VHDL viel mehr ist als FPGA-Designs zu entwickeln.
Ich hatte den Begriff FPGA übrigens überhaupt nicht verwendet... :-/

> Ich studiere E-Technik und wir lernen dort den Entwurf, die Simulation,
> Verifikation und Synthese von Integrierten Schaltungen mittels VHDL.
Das habe ich und meine Kommilitonen vor geraumer Zeit auch schon getan. 
Und keiner davon hat je ein ASIC gebastelt. Aber einige machen mit FPGAs 
rum....

von Johannes (Gast)


Lesenswert?

Lothar Miller schrieb:
> und nicht
> erst mit dem expliziten Aufruf einer Funktion.

Ich muss diese Funktion auch nicht explizit aufrufen.
Ich binde das Package ein, deklariere meinen Ausgang bus_out als 
tribus_r, meinen Eingang bus_in als STD_ULOGIC.

Wenn ich nun eine Zuweisung

bus_out <= bus_in;

mache und in meinem Stimuli die Werte von bus_in ändere bekomme ich zum 
Beispiel folgendes Verhalten:

bus_in | bus_out
----------------
   0   |   0
   1   |   1
   Z   |   H
   L   |   L
   H   |   H
   U   |   U

>Das habe ich und meine Kommilitonen vor geraumer Zeit auch schon getan.
>Und keiner davon hat je ein ASIC gebastelt. Aber einige machen mit FPGAs
>rum...

1. Lege ich nicht den Vorlesungsstoff fest, sonder der Professor und der 
hält das nunmal für Relevant

2. Mittlerweile hat sich das wohl geändert, weil vorallem viele der 
Masterarbeiten bei uns mit ASICs zu tun haben.

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.