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


von andreas (Gast)


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...
1
  -- Daten array
2
  type Daten is array (1 to 10) of integer range 0 to 65535;
3
  signal Ram : Daten;  
4
  type arByte is array (1 to 20) of integer range 0 to 255;
5
  signal ByteArray : arByte;
1
---- ********************************************
2
----  State 10   [Ende]
3
----    Zwischenspeichern für die RS232 Übertragung
4
---- ********************************************
5
----  Description:        
6
        when S10 =>
7
          
8
          rs_cnt := 2;
9
          for i in 1 to 10 loop
10
            Bytearray(rs_cnt - 1) <= (7 downto 0) Ram(i);  -- LowByte
11
            Bytearray(rs_cnt) <= (15 downto 8) Ram(i);     -- HighByte
12
            rs_cnt := rs_cnt + 2;
13
          end loop;
14
          
15
          sCur <= S0;

Vielleicht könnt ihr ja helfen.
Danke

von hjk (Gast)


Lesenswert?

irgentwie so sollte es gehen:
1
for i in 1 to 10 loop
2
   Bytearray((i*2) - 1) <= Ram(i)(7 downto 0) ;  -- LowByte
3
   Bytearray(i*2)       <= Ram(i)(15 downto 8);  -- HighByte
4
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...

von andreas (Gast)


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..

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


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)?

von andreas (Gast)


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..

von Christian R. (supachris)


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

von berndl (Gast)


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?

von user (Gast)


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);

von andreas (Gast)


Angehängte Dateien:

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.
1
---- ********************************************
2
----  State 10   [Ende]
3
----    zwischenspeichern für die RS232 Übertragung
4
---- ********************************************
5
----  Description:        
6
        when S10 =>
7
          
8
          for i in 1 to 10 loop
9
            ByteArray((i*2) - 1) <= conv_std_logic_vector(myData(i),16)(15 downto 8);  -- HighByte
10
            ByteArray(i*2)     <= conv_std_logic_vector(myData(i),16)( 7 downto 0);  -- LowByte
11
          end loop;
12
          
13
          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

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


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...

von berndl (Gast)


Lesenswert?

Lothar Miller schrieb:
> Bekommst du auch wirklich ein RAM, oder nur einen Haufen Flipflops?

Damit gibt es sicher einen Sack voll FFs...

von Christian R. (supachris)


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.

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


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:
1
entity Datenverarbeitung is
2
  port ( ...
3
         ByteArray  : out RAM);  -- 22 Byte Array = type RAM is array (1 to 22) of std_logic_vector(7 downto 0); 
4
                                 -- = definiert in Package Array_Datentyp.vhd        
5
6
architecture Behavioral of Datenverarbeitung is
7
  -- Daten array
8
  type Daten is array (1 to 10) of integer range 0 to 65535;
9
  signal myData : Daten;
10
:
11
:    
12
    if rst='1' then
13
      sCur<=S0;
14
      for i in 1 to 10 loop                 -- es gibt en einem üblichen RAM keinen "Reset-Pin"
15
        myData(i) <= 0;  --x"0000";
16
      end loop;
17
      for i in 1 to 20 loop
18
        ByteArray(i) <= x"00";
19
      end loop;
20
    else
21
:
22
:


Holla, ein Softie, der VHDL macht:
1
  -- **************************
2
  --     Globale Variablen
3
  -- **************************  
4
    signal ZeitF_Sig: std_logic;
5
6
  -- **************************
7
  --     UProgrammaufrufe
8
  -- **************************
9
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:
1
Hardwarebeschreibung (VHDL) /= Programmierung (C, Basic, Pascal...)
Das betrifft hauptsächlich die Denkweise, weniger die Syntaxelemente 
der Sprache(n)...

von Christian R. (supachris)


Lesenswert?

Lothar Miller schrieb:
> Hardwarebeschreibung (VHDL) /= Programmierung (C, Basic, Pascal...)

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

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


Lesenswert?

Christian R. schrieb:
> Für solche Umsteiger eher erst mal ...  !=  ...
:-D

von andreas (Gast)


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

von Christian R. (supachris)


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.

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


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.html#extended

von andreas (Gast)


Angehängte Dateien:

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

von Duke Scarring (Gast)


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

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.