Forum: FPGA, VHDL & Co. Ueberpruefen ob ein std_logic_vector undefiniert ist


von Molaka (Gast)


Lesenswert?

Hi,


ich bin ziemlich neu in VHDL und hätte da mal eine Frage.


Nehmen wir mal an ich habe folgendes SIGNAL:

SIGNAL temp : std_logic_vector(63 downto 0);


Ich habe mein temp SIGNAL in Bytes aufgeteilt so das ich 8*8 Signale 
habe:

SIGNAL byte0 : st_logic_vector(7 downto 0);
SIGNAL byte1 : st_logic_vector(7 downto 0);
...
SIGNAL byte7 : st_logic_vector(7 downto 0);

Nun möchte ich überprüfen ob eins dieser Bytes (egal an welcher Stelle) 
undefiniert ist.


z.b.:
byte0 hat folgenden Wert: "00000000" => gueltig
byte1 hat folgenden Wert: "10010101" => gueltig
byte2 hat folgenden Wert: "1001X101" => ungueltig
byte3 hat folgenden Wert: "X0010101" => ungueltig
byte3 hat folgenden Wert: "0000X000" => ungueltig

Wie kann ich das umsetzten?

Lg

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


Lesenswert?

Molaka schrieb:
> Nun möchte ich überprüfen ob eins dieser Bytes (egal an welcher Stelle)
> undefiniert ist.
X bedeutet nicht undefiniert, sondern es zeigt eine Kollision an: 
zwei Treiber treiben unterschiedliche dominante Pegel auf das Signal.

Ich hoffe, dir ist klar, dass 7 der Werte von STD_LOGIC in der realen 
Hardware nicht abgefragt werden können. Dort gibt es nur '0' und '1'.

> Wie kann ich das umsetzten?
Für die Simulation oder fürs echte Leben?
Woher könnte dieser undefinierte Wert kommen?

von Sigi (Gast)


Lesenswert?

Funktion <is_x> testet Vektorelemente auf 'U','X','Z','W'.

von S. R. (svenska)


Lesenswert?

Du hast also einen 64 Bit-Vektor und möchtest wissen, ob ein Bit darin 
undefiniert ist. Was genau meinst du mit "undefiniert"? In std_logic 
gibt es mehrere passende Zustände, z.B. 'U' (unbestimmt), 'X' 
(widersprüchlich) oder 'Z' (floating)?

Im FPGA gibt es solche Zustände übrigens eher nicht, da hast du immer 
'0' oder '1'. Es geht also nur um die Simulation. Da würde vermutlich 
eine Funktion ausreichen, die alle Bits deines Vektors durchgeht.
1
if temp(0) = 'U' or temp(1) = 'U' or ... or temp(63) = 'U' then
2
  -- whatever
3
end if

Das kann man aber sicher auch als Loop formulieren, habe aber die Syntax 
spontan nicht im Kopf. Synthetisierbar ist die Lösung aber nicht.

von Molaka (Gast)


Lesenswert?

Okay, verstehe.

Ich habe auf meinem FPGA ein Datentyp definiert:

type mailbox is array (7 downto 0) of std_logic_vector(7 downto 0);



und mit:

signal m0: mailbox := (others => (ohters => '0'));
signal m1: mailbox := (others => (ohters => '0'));
signal m2: mailbox := (others => (ohters => '0'));

Ich empfange nun Can-Nachrichten und Speicher die in meine m0 ... m2.


Eine Can-Nachricht kann bis zu 8*8 Bytes an Nutzdaten haben.
Woher soll ich wissen, bis wo meine Can-Nachricht geht?
Es koennte ja auch sein das ich 4*8 Bytes in meine Mailbox speichere.

Ich möchte die Nutzdaten weiterverarbeiten.
Macht es sinn zu jeder meiner Mailbox vllt noch ein "int" zu speichern 
der angibt wieviele Bytes an Nutzdaten wirklich gespeichert sind... ?


Lg

von Markus F. (mfro)


Lesenswert?

Molaka schrieb:
> Macht es sinn zu jeder meiner Mailbox vllt noch ein "int" zu speichern
> der angibt wieviele Bytes an Nutzdaten wirklich gespeichert sind... ?

Es könnte durchaus auch Sinn machen, statt der RAMs (darauf wird's ja 
wohl rauslaufen) FIFO's zu verwenden. Da kommt auf der anderen Seite nur 
so viel raus, wie Du auf der einen reingesteckt hast.

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


Lesenswert?

Molaka schrieb:
> Woher soll ich wissen, bis wo meine Can-Nachricht geht?
Recht einfach: für jede CAN Nachricht wird in den 4 Bits direkt vor den 
Daten im Protokoll eine Telegrammlänge mitübertragen, der DLC.
https://de.wikipedia.org/wiki/Controller_Area_Network
Und das merkst du dir einfach auch noch...

Molaka schrieb:
> is array (7 downto 0) of
Ein Vorschlag: mach wie der Rest der Welt Arrays aufsteigend. Nur, damit 
du oder dein Nachfolger nicht irgendwann drüber stolperst.
Dass Vektoren absteigend sind, hat seinen Grund in der Bitwertigkeit, 
die von links nach rechts im Vektor abnimmt.

: Bearbeitet durch Moderator
von Molaka (Gast)


Lesenswert?

Lothar M. schrieb:
>

Okay, also soll ich sobald ich die Can-Nachricht empfangen habe die 
Nachricht speichern und DLC?

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


Lesenswert?

Molaka schrieb:
> also soll ich sobald ich die Can-Nachricht empfangen habe die Nachricht
> speichern und DLC?
Hört sich nach einer Strategie an.

Allerdings frage ich mich, wofür du auf einem FPGA eine Mailbox 
brauchst. Du kannst die nötige Aktion doch nach dem Empfang eines 
Kommandos sofort ausführen. Oder etwa nicht?

von Molaka (Gast)


Lesenswert?

Lothar M. schrieb:
> Molaka schrieb:
>> also soll ich sobald ich die Can-Nachricht empfangen habe die Nachricht
>> speichern und DLC?
> Hört sich nach einer Strategie an.
>
> Allerdings frage ich mich, wofür du auf einem FPGA eine Mailbox
> brauchst. Du kannst die nötige Aktion doch nach dem Empfang eines
> Kommandos sofort ausführen. Oder etwa nicht?


Mein FPGA hat zwei Schnittstellen. Einmal für CAN und einmal für SPI.
SPI Nachrichten werden an CAN-Bus gesendet und CAN Nachrichten an SPI.

z.B Ich sende nun eine Can Nachricht an mein FPGA der dies über SPI 
weiterleitet. In der Can Nachricht wird festgelegt das ich ein Wer haben 
möchte. Somit muss SPI mit einer Nachricht antworten...

In der Zwischenzeit könnte es ja sein das ein weiterer Can-Teilnehmer 
eine Nachricht schickt... Die muss ja dann natürlich abgespeichert 
werden.

Lg

von S. R. (svenska)


Lesenswert?

Dafür sind FIFOs da. Du brauchst derer zwei, einmal für die 
CAN-SPI-Richtung, einmal für die SPI-CAN-Richtung.

Wenn also auf einer der Schnittstellen eine Nachricht reinkommt, tust du 
die in den entsprechenden FIFO. Parallel dazu entnimmst du aus dem FIFO 
jeweils eine Nachricht und triggerst damit einen Zustandsautomaten 
(FSM), arbeitest also die Nachrichten in den FIFOs ab.

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


Lesenswert?

Das ist aber nur nötig, wenn der SPI langsamer als der CAN ist. Man 
kann sich also (wie fast immmer) bei geeigneter Wahl der Datenraten 
einiges an Aufwand sparen...

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.