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...
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...
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..
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)?
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..
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 VHDLparallel abgebildet
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?
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);
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.
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
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...
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
entityDatenverarbeitungis
2
port(...
3
ByteArray:outRAM);-- 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
architectureBehavioralofDatenverarbeitungis
7
-- Daten array
8
typeDatenisarray(1to10)ofintegerrange0to65535;
9
signalmyData:Daten;
10
:
11
:
12
ifrst='1'then
13
sCur<=S0;
14
foriin1to10loop-- es gibt en einem üblichen RAM keinen "Reset-Pin"
"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:
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
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.
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
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
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