Forum: FPGA, VHDL & Co. VHDL eichte arithmetik schwierigkeiten


von Christian G (Gast)


Lesenswert?

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.

von Bitwurschtler (Gast)


Lesenswert?

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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Christian G (Gast)


Lesenswert?

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

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


Lesenswert?

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

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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!

von Christian G (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.