Datum:
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
Datum:
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...
Datum:
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..
Datum:
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)?
Datum:
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..
Datum:
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
Datum:
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?
Datum:
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);
Datum:
Angehängte Dateien: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
Datum:
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...
Datum:
Lothar Miller schrieb: > Bekommst du auch wirklich ein RAM, oder nur einen Haufen Flipflops? Damit gibt es sicher einen Sack voll FFs...
Datum:
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.
Datum:
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)...
Datum:
Lothar Miller schrieb: > Hardwarebeschreibung (VHDL) /= Programmierung (C, Basic, Pascal...) Für solche Umsteiger eher erst mal
Hardwarebeschreibung (VHDL) != Programmierung (C, Basic, Pascal...) |
Datum:
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
Datum:
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.
Datum:
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...
Datum:
Angehängte Dateien: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
Datum:
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

