Hi, ich bekomme grade folgendes eigentlich sehr simples Problem nicht gelöst, ich möchte zwei 16 bit std_log_vector zu einem 32 bit std_logic_vector kombinieren, also im Prinzip : v32 = (v16_0 shiftleft 16 bits) + v16_1 bis jetzt habe ich mir das zusammen gewerkelt (blutiger Anfänger mit VHDL etc.) : block1.memory((i + 1) / 2) := std_logic_vector((unsigned(bufferMemory(i-1)) sll 16) + unsigned(bufferMemory(i))); block1.memory ist ein array of std_logic_vector(31 downto 0) bufferMemory ist ein array of std_logic_vector(15 downto 0) also er durchläuft eine loop über die Länge bufferMemory array und bei jedem 2. item soll er aus dem aktuellem und dem vorherigem den entsprechenden 32 bit std_logic_vector im block1.memory array bilden aber der compiler meckert mit : expression has 16 elements but must have 32 elements. Ich habe auch echt schon zig varianten der obigen Zeile mit to_unsigned(..,32) etc versucht aber es mag einfach nicht klappen.... und was mich am meisten dabei nervt, es ist eigentlich so eine simple Aufgabe und ich habe auch schon an anderer Stelle erolgreich "rechnen" können in VHDL aber ausgerechnet DAS will nicht gelingen. Kann da jemand helfen? VG Christian G.
Christian G schrieb: > Hi, > > ich bekomme grade folgendes eigentlich sehr simples Problem nicht > gelöst, ich möchte zwei 16 bit std_log_vector zu einem 32 bit > std_logic_vector kombinieren, also im Prinzip Eine Sprache lernen heisst die Lexik wenigstens einmal komplett gehört zu haben. Bei VHDL hat dir noch keiner das Wort '&' gezeigt, den concatination Operator: http://vhdlguru.blogspot.de/2010/03/concatenation-operator-in-vhdl.html
Christian G schrieb: > v32 = (v16_0 shiftleft 16 bits) + v16_1 Das geht viiiieeel einfacher:
1 | v32 <= v16_0 & v16_1; |
Du solltest unbedingt ein Buch über VHDL einigermaßen vollständig durcharbeiten, um die allereinfachsten Grundlagen zu erlernen.
Bitwurschtler schrieb: > Bei VHDL hat dir noch keiner das Wort '&' gezeigt, den > concatination Operator: > http://vhdlguru.blogspot.de/2010/03/concatenation-operator-in-vhdl.html Vielen Dank! Den kannte ich echt noch nicht. wo ich grad schon mal dabei bin, die loop die ich oben erwähnt habe sieht dann so aus:
1 | for i in 0 to 31 loop |
2 | if ((i + 1) mod 2 = 0) then |
3 | cacheSets(currentSetIndex).block0.memory((i - 1) / 2) := bufferMemory(i-1) & bufferMemory(i); |
4 | end if; |
5 | end loop; |
geht sowas nicht auch eleganter bzw. effizienter? dachte schon ansowas wie if (i and 1 = 0) then aber da meckert direkt der compiler das i nix mit boolean zu tun haben soll etc. werde wohl doch noch ein paar Bücher wälzen müssen...
Christian G schrieb: > dachte schon ansowas wie if (i and 1 = 0) then Ein C-Softwerker... > aber da meckert direkt der compiler das i nix mit boolean zu tun haben > soll etc. Da hat er Recht. Wenn du einen Vektor auf das unterste Bit abfragen willst, dann wandle den Integer in einen Vektor und frag einfach das unterste Bit ab... Oder mach es einfach nicht mit "Auslassen", sondern mit "Gar nicht erst Anfassen":
1 | for i in 0 to 15 loop |
2 | cacheSets(currentSetIndex).block0.memory(i) := bufferMemory(i*2) & bufferMemory(i*2+1); |
3 | end loop; |
(Die Indices musst du noch kontrollieren, mir erscheint das Ganze plausibel) BTW: das Ganze wird ein gigantischer Giga-Monstermultiplexer. Das wird sicher ein hübsch langsames Design. Mehr als 10-20 MHz gebe ich dem nicht...
Christian G schrieb: > werde wohl doch noch ein paar Bücher wälzen müssen... Vor allem solltest Du dir wirklich verdeutlichen, dass Du *Hardware beschreibst* und keinen sequentiellen Ablauf wie in der Softwareentwicklung üblich definierst. Das ist ein riesiger Unterschied!
Andreas S. schrieb: > Vor allem solltest Du dir wirklich verdeutlichen, dass Du *Hardware > beschreibst* und keinen sequentiellen Ablauf wie in der > Softwareentwicklung üblich definierst. Das ist ein riesiger Unterschied! Ja da hast du absolut recht, ich bin ziemlich blauäugig an die Sache heran gegagen, nach dem Motto: ach wird schon passen. Aber muss doch immer mehr feststellen das man das nicht mal eben so macht! Die Quittung gabs auch direkt als ich festgestellt habe das nach dem ich alle fiesen Fehler im source code bereinigt hatte und er sich dann auch compilieren ließ, passte das design nicht mehr ins device und es wurde gemeckert das nicht alle Register in RAM gewandelt werden können weil zu wenige vorhanden oder ähnliches... ...von daher passt : Lothar M. schrieb: > BTW: das Ganze wird ein gigantischer Giga-Monstermultiplexer. Das wird > sicher ein hübsch langsames Design. Mehr als 10-20 MHz gebe ich dem > nicht... schon sehr gut und ich werde es wohl nochmal umbauen und auf internen arrays und verschachtelungen etc. als Speicher verzichten und static RAM IPs stattdessen verweden. Die Statemachine an sich habe ich schon überarbeitet, die loops sind schon rausgeflogen...
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.