www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Cast 16Bit zu 2x 8Bit


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: andreas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo

ich stehe gerade dabei an ein 16Bit Array in ein doppelt so großes 8Bit 
Array zu kopieren. Ich habe schon einige casts die ich hier gefunden hab 
probiert, doch irgendwie gehen die nicht in meinem Fall. Da ich hier in 
einer For-Schleife arbeite...
  -- Daten array
  type Daten is array (1 to 10) of integer range 0 to 65535;
  signal Ram : Daten;  
  type arByte is array (1 to 20) of integer range 0 to 255;
  signal ByteArray : arByte;
---- ********************************************
----  State 10   [Ende]
----    Zwischenspeichern für die RS232 Übertragung
---- ********************************************
----  Description:        
        when S10 =>
          
          rs_cnt := 2;
          for i in 1 to 10 loop
            Bytearray(rs_cnt - 1) <= (7 downto 0) Ram(i);  -- LowByte
            Bytearray(rs_cnt) <= (15 downto 8) Ram(i);     -- HighByte
            rs_cnt := rs_cnt + 2;
          end loop;
          
          sCur <= S0;

Vielleicht könnt ihr ja helfen.
Danke

Autor: hjk (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
irgentwie so sollte es gehen:

for i in 1 to 10 loop
   Bytearray((i*2) - 1) <= Ram(i)(7 downto 0) ;  -- LowByte
   Bytearray(i*2)       <= Ram(i)(15 downto 8);  -- HighByte
end loop;


Die Frage ist ob es sinnvoll ist in einem Schritt zu wandeln. Gerade 
wenn ich da sehe rs232, dann brauchst du warscheinlich nur 1 byte alle 
Jubeljahre...

Autor: andreas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi

Genau das habe ich auch schon versucht, nur leider kommt dann die 
Fehlermeldung:
Line 210. Wrong slice type for Ram.
Line 210. Ram is not an array slice prefix.


Auch wenn ich meine RS232 Komponente umschreibe, dass ich ihr eine 16b 
array übergebe, bin ich in der selben Situation. Irgendwo muss ich von 
16b auf 8b kommen, weil ich ja nur byteweise übertragen kann.. denke ich 
jetzt mal..

Beim Schreiben des vorherigen Threads ist mir eingefallen, dass ich eine 
Subcomponente schreiben könnte, der ich dann den indezierten 16b Wert 
übergebe und als Rückgabewert zwei Bytes deklariere.

Die Frage ist: Ginge es, wenn ich den Komponentenaufruf in der Schleife 
durchführe und dann die Werte in das ByteArray schreibe?

Muss ich mal testen..

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
andreas schrieb:
> doch irgendwie gehen die nicht in meinem Fall.
Ich habe dein Problem gefunden:
> Da ich hier in einer For-Schleife arbeite...
Dir ist der grundlegende Unterschied zwischen einer 
Hardwarebeschreibungssprache und einer Programmiersprache bekannt?
Dass, auch wenn sie ähnliche syntaktische Elemente haben, diese evtl. 
was komplett anderes machen?
Ganz krass uind oft sehr überraschend ist übrigens gerade das Verhalten 
von FOR-(und anderen)Schleifen in VHDL...

Poste doch einfach mal deine VHDL-Datei als Dateianhang.

EDIT:
andreas schrieb:
> Line 210. Wrong slice type for Ram.
> Line 210. Ram is not an array slice prefix.
Welches FPGA?
Welche Entwicklungsumgebung?
Wer bringt die Meldung (Synthese/Mapper/P&R)?

Autor: andreas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi,

ich habe die RS232 Komponente noch nicht in diesem aktuellen Projekt 
implementiert da ich sie zuerst in einem Versuchsprojekt aufgebaut 
hatte. Ich füge alles zusammen und dann poste ich die Datein..

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Du kannst das ja über einen bus-matching FIFO machen, den haben ja alle 
FPGA-Anbieter als Core im Programm. Oder wenn du es unbedingt manuell 
als RAM haben willst, mit der generischen RAM-Beschreibung und die 
Adress-Leitungen entsprechend verdrahten, dass eine 8Bit-16Bit Wandlung 
herauskommt. Für den RS232 Fall würd ich allerdings der Einfachheit 
halber den FIFO generieren lassen. So wie du das geschrieben hast, wird 
das ni sinnvolles, eine For-Schleife wird in VHDL parallel abgebildet

Autor: berndl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
andreas schrieb:
> Bytearray(rs_cnt - 1) <= (7 downto 0) Ram(i);  -- LowByte
> Bytearray(rs_cnt) <= (15 downto 8) Ram(i);     -- HighByte

was soll das denn fuer eine Syntax sein?
Und warum wieder eine Variable fuer rs_cnt?

Wer bringt euch so 'nen SCH#(SS bei?

Autor: user (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ram ist vom typ array of integer und da kannst du nicht mit

(i)(7 downto 0) indizieren
sondern musst es vorher umwandeln, zb mit

Bytearray((i*2) - 1) <= conv_std_logic_vector(Ram(i),16)(7 downto 0);

Autor: andreas (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

vielen dank,
ich habe es nun mit der oben beschriebenen Methode versucht,
lässt sich einwandfrei Synthetisieren und Generieren, laut Simulator 
dürften die Daten auch richtig umgewandelt werden. Testen kann ich das 
erst morgen, da ich den Lesekopf nicht da habe.
---- ********************************************
----  State 10   [Ende]
----    zwischenspeichern für die RS232 Übertragung
---- ********************************************
----  Description:        
        when S10 =>
          
          for i in 1 to 10 loop
            ByteArray((i*2) - 1) <= conv_std_logic_vector(myData(i),16)(15 downto 8);  -- HighByte
            ByteArray(i*2)     <= conv_std_logic_vector(myData(i),16)( 7 downto 0);  -- LowByte
          end loop;
          
          sCur <= S0;

Anbei noch die Componenten.
Datenverabeitung.vhd list 10 Datenpulse ein und speichert die Länge des 
Pulses in ein 16Bit breites Arrayfeld. Wenn dies geschehen ist werden 
sie im letzten Schritt in ein Bytearray geschrieben und der 
RS232_Ausgabe.vhd Componente übergeben.
Ich bin mir sicher da ist noch einiges an Verbesserungspotential,
daher bin ich für alle Verbesserungsvorschläge dankbar.

Setup:
Xilinx: ISE 13.2 Web-Pack
Digilent Nexus 2

mfg
andreas

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
andreas schrieb:
> lässt sich einwandfrei Synthetisieren und Generieren
Bekommst du auch wirklich ein RAM, oder nur einen Haufen Flipflops? 
Denn das, was da steht, ist ein massiv paralleler Zugriff auf das "RAM". 
Üblich und ressourcenschonend ist das nicht...

Autor: berndl (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Bekommst du auch wirklich ein RAM, oder nur einen Haufen Flipflops?

Damit gibt es sicher einen Sack voll FFs...

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Naja, 10 x 16 Bit also 160 FF, wenn ich das richtig sehe. Sind 40 Slices 
auf dem Spartan 3, das ist sicher verkraftbar. Trotzdem wenig sinnvoll.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Christian R. schrieb:
> Naja, 10 x 16 Bit also 160 FF, wenn ich das richtig sehe.
> Sind 40 Slices auf dem Spartan 3, das ist sicher verkraftbar.
Aber wenn man einmal diesen hardwareunfreundlichen Beschreibungsstil 
hat, tut man das immer wieder...
> Trotzdem wenig sinnvoll.
Insbesondere die Namensgebung "RAM". Ein RAM ist gemeinhin ein Bauteil 
mit Adress-, Daten- und Steuerbus. Das, was hier so provokant als "RAM" 
übergeben wird, hat eigentlich nichts davon:
entity Datenverarbeitung is
  port ( ...
         ByteArray  : out RAM);  -- 22 Byte Array = type RAM is array (1 to 22) of std_logic_vector(7 downto 0); 
                                 -- = definiert in Package Array_Datentyp.vhd        

architecture Behavioral of Datenverarbeitung is
  -- Daten array
  type Daten is array (1 to 10) of integer range 0 to 65535;
  signal myData : Daten;
:
:    
    if rst='1' then
      sCur<=S0;
      for i in 1 to 10 loop                 -- es gibt en einem üblichen RAM keinen "Reset-Pin"
        myData(i) <= 0;  --x"0000";
      end loop;
      for i in 1 to 20 loop
        ByteArray(i) <= x"00";
      end loop;
    else
:
:


Holla, ein Softie, der VHDL macht:
  -- **************************
  --     Globale Variablen
  -- **************************  
    signal ZeitF_Sig: std_logic;

  -- **************************
  --     UProgrammaufrufe
  -- **************************
COMPONENT FlankenErkennung
"Globale Variablen"
Signale sind 1. keine Variablen, sondern Verdrahtungshilfen bzw. 
Speicher und 2. nicht global, sondern nur in der entsprechenden 
Architecture bekannt.
"Unterprogrammaufrufe"
In VHDL wird auf diese Art nichts "aufgerufen", sondern instatiiert. 
Also quasi auf die Platine gesteckt, festgelötet und später verdrahtet.


Hier nochmal in kompakter Kurzform:
Hardwarebeschreibung (VHDL) /= Programmierung (C, Basic, Pascal...)
Das betrifft hauptsächlich die Denkweise, weniger die Syntaxelemente 
der Sprache(n)...

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Hardwarebeschreibung (VHDL) /= Programmierung (C, Basic, Pascal...)

Für solche Umsteiger eher erst mal
Hardwarebeschreibung (VHDL) != Programmierung (C, Basic, Pascal...)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Christian R. schrieb:
> Für solche Umsteiger eher erst mal ...  !=  ...
:-D

Autor: andreas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi Leute,

na bravo, da hab ich ja noch allerhand zu verbessern,
aber ganz so schlecht finde ich mein Design trotzdem nicht.
Da es mein zweites Projekt überhaupt ist und im ersten habe ich ein 
Lauflicht mit den LEDs am Board realisiert.

Ich habe mir jetzt eure Ideen mittels FIFO oder RAM angeschaut, wie ich 
die Daten von 16Bit zu 2x8Bit mit einem FIFO umwandeln kann, ist mir 
trotdem noch schleierhaft. Denn Ansatz mittels Ram würde ich jetzt mal 
mittels CoreGenerator erstellen ist das so richtig?

Und ja, wie ihr schon richtig mitbekommen habt, schreibe
ich normalerweise nicht mit VHDL  ;)
Aber ich finde trotdem kein Grund abfällig zu werden
> Holla, ein Softie, der VHDL macht:

Das ein FPGA kein Mikrocontroller ist, war mir bewusst.


mfg

Autor: Christian R. (supachris)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Naja, dein Design mag zwar in diesem simplen Minimal-Fall funktionieren, 
aber das ändert nicht daran, dass deine Denkweise noch völlig verkehrt 
ist. Für VHDL muss man komplett in FlipFlops und Logik-Gattern denken, 
und man muss ich zunächst mal von jeglichen Schleifen lösen. Eine For 
Schleife macht in VHDL was grundsätzlich anderes als in jeder 
Programmiersprache.
Ausfällig ist niemand geworden, das war ja nur eine Feststellung. Du 
musst da noch viel umdenken.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite Flattr this
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
andreas schrieb:
> Aber ich finde trotdem kein Grund abfällig zu werden
>> Holla, ein Softie, der VHDL macht:
Was ist daran abfällig? Es ist keine Schande, ein Softie zu sein...

> Denn Ansatz mittels Ram würde ich jetzt mal
> mittels CoreGenerator erstellen ist das so richtig?
Lies den XST-Users-Guide und du kannst RAMs generisch beschreiben.
http://www.lothar-miller.de/s9y/archives/20-RAM.ht...

Autor: andreas (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Leute,

anbei möchte ich euch ein Foto zeigen, dass die vom FPGA eingelesene 
Signale visualisiert. Leider gibt es immer wieder Probleme mit dem 
einlesen der Daten, da manche Datenpulse verloren gehen. Es wird sein, 
dass dies vom holprigen Design kommt, daher werde ich es mit 2 
Distributed RAM-Bausteinen  versuchen. In einem speichere ich die 
aktuellen Daten jedes Einlesezykluses, und in dem anderen übergebe ich 
die Daten sobald die RS232 übertragung beendet ist. Wenn diese fertig 
ist bekommt sie wieder die Daten des aktuellen einlesezyklus und sendet 
sie wieder.
Die RS232-übertragung dient als debugging-hilfe.
Würdet ihr das genauso machen?

Noch ein Paar details zu den Signalen:
Der Sinus den das Programm anzeigt, wird vom Lesekopf als 
10.Puls/Pausenverhältnisse beschrieben die in einem Zyklus von 380us 
ausgegeben werden. Die Länge des Pulses beschreibt den darüberliegenden 
Amplitudenwert.

Die Pulse sind auf der X-Achse und deren dazugehörige länge auf der 
Y-Achse aufgetragen. Die Beschriftung der Y-Achse stimmt noch nicht, da 
hier noch die zähldurchgänge des FPGAs angezeigt werden.

mfg

Autor: Duke Scarring (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
andreas schrieb:
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
> use work.Array_Datentyp.ALL;  -- Fürs 20 Byte Array
[...]
> conv_std_logic_vector

Lies Dir mal dies durch: Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Duke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net