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
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?
Funktion <is_x> testet Vektorelemente auf 'U','X','Z','W'.
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.
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
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.
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
Lothar M. schrieb: > Okay, also soll ich sobald ich die Can-Nachricht empfangen habe die Nachricht speichern und DLC?
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.