Hallo zusammen,
ich habe mir mit Excel halbautomatisch den unten gezeigten Code für eine
Zuweisung in VHDL erzeugt.
Nun so etwas muss doch auch einfachen in VHDL gehen, mit wenigen Zeilen.
Aber wie?
Ich weiss, dass es for-Schleifen gibt, nur die gehören ja zu
sequenziellen Anweisungen und die Anweisung ist nicht sequentiell. Wie
mache ich dass denn richtig?
Vielen Dank vorab!
Oliver B. schrieb:> 0 to 63
Diese Ranges sind eher unüblich.
Standard ist MSB first, also 63 downto 0.
Machst du da mit dem Microblaze rum?
Das EDK macht auch diese to Ranges...
> spi_buff_s(48 to 559) <= spi_paket_s.Daten(0 to 63)
Wenn spi_paket_s.Daten sowieso nur 64 Bits hätte, ginge auch das:
spi_buff_s(48 to 48+spi_paket_s.Daten'len-1) <= spi_paket_s.Daten;
noips schrieb:> den unten gezeigten Code für eine Zuweisung in VHDL erzeugt.Oliver B. schrieb:> In deinem Fall vielleicht so:> spi_buff_s(48 to 559) <= spi_paket_s.Daten(0 to 63)
Da passt in beiden Fällen die Breite der Vektoren nicht...
> In deinem Fall vielleicht so:> spi_buff_s(48 to 559) <= spi_paket_s.Daten(0 to 63)
Das geht nicht. Ich hätte auch die Deklaration von den Signalen posten
sollen. Daten ist vom diesem Typ:
noips schrieb:> Darum können Sie nicht einfach so zugewiesen werden.
Richtig. Da passen ja nicht mal die Typen zueinander... :-/
Du wirst einen Prozess und eine Schleife brauchen, und dann das Ganze in
einzelne std_logic audröseln müssen...
Lothar Miller schrieb:> Du wirst einen Prozess und eine Schleife brauchen, und dann das Ganze in> einzelne std_logic audröseln müssen...
Was soll dieser Prozess in der Sensitivity list haben?
noips schrieb:> Was soll dieser Prozess in der Sensitivity list haben?
Alles, was für eine korrekte Simulation nötig ist:
die sich ändernden Eingangssignale rechts vom '<=' ...
Da habe ich jetz noch eine Frage dazu. Wenn ich es richtig verstehe, so
ist es bei Zuweisung im Code in meinem ersten Beitrag so, dass
spi_buff_s(48 to 559) und die zugewiesene Concatenation dieselben
Signale darstellen, weil die Zuweisung ja weder bedingt ist noch in
einem Prozess steht. In der synthetisierten Hardware ist das dann ein
und derselbe Register. Richtig?
Wie ist es aber im Falle einer Zuweisung wie von Lothar hier
Beitrag "Re: Eine Zuweisung mit Concatenation auch einfacher möglich?"
empfohlen. Sind die Signale spi_buff_s(48 to 559) und
spi_paket_s.Daten(0 to 63) zwei unterschiedliche Register oder einer?
Oder verstehe ich das ganz falsch?
> Das EDK macht auch diese to Ranges...
Weil sie die IP-Cores kompatibel zum PPC haben wollen und IBM mit der
Ka**e der umgedrehten Bitnummerierung angefangen hat. Ich will nicht
wissen, was das an Millionen $ an vergeudeter Arbeitszeit durch
Debugging und fehlerhaften Layouts gekostet hat.
noips schrieb:> ich habe mir mit Excel halbautomatisch den unten gezeigten Code für eine> Zuweisung in VHDL erzeugt.
kann du mir eine sagen wie du es mit Excel gemacht hast?
Besten Dank.
> kann du mir eine sagen wie du es mit Excel gemacht hast?
naja, genau gesagt habe ich es mit Excel und einem Texeditor gemacht.
Mit Exel die 1. Zeile eingetippt, den Rest durch Markieren und
Runterziehen kopiert, die aufsteigenden Zahlen macht Exel ja dabei
automatisch. Dann in eine Coma-Separated-Datei exportiert und die Datei
mit "Suchen u. Ersetzen"-Funktion eines Texteditors angepasst. Geht
schneller, als die aufwärtslaufenden Indezes von Hand zu tippen von 0
bis 63.
noips schrieb:> Sind die Signale spi_buff_s(48 to 559) und> spi_paket_s.Daten(0 to 63) zwei unterschiedliche Register oder einer?
Prinzipiell sind Signale erst mal einfach nur Verbindungen zwischen
hier und dort. Wenn dann aber ein Takt mit ins spiel kommt, muß der
Wert des Signals gespeichert werden. Und dann wird ein Register (aka.
Flipflop) nötig.
Auf jeden Fall ist es aber so, dass das hier eine eindeutige Richtung
angibt:
1
signala,b:std_logic;
2
:
3
a<=b;
Hier wird nicht einfach a mit b bidirektional verbunden. Ich kann also
nicht irgendwo a etwas zuweisen, und b bekommt "automatisch" den selben
Wert.
> In der synthetisierten Hardware ist das dann ein und derselbe Register.> Richtig?
Abgesehen, davon, dass es kein Register sein muss: wenn du nur b etwas
zuweist, dann ist a und b derselbe (allerdings nicht bidirektionale)
"Draht".
Wenn es aber ein Register ist:
1
signala,b:std_logic;
2
:
3
process(clk)begin
4
ifrising_edge(clk);
5
a<=b;
6
endif;
7
endprocess;
Dann ist a natürlich ungleich b!
Bzw: a ist der Wert, den b zum zeitpunkt des Taktes hatte.
signal a, b : std_logic;
:
process (clk) begin
if rising_edge(clk);
a <= b;
end if;
end process;
Es ist jedoch möglich das Signal a ausserhalb dieses Taktsynchron
Umfeld zu lesen,sodass es herausoptimiert wird;
nixwisser schrieb:> Es ist jedoch möglich das Signal a ausserhalb dieses Taktsynchron> Umfeld zu lesen,sodass es herausoptimiert wird;
Durch was wird es dann ersetzt?
Dieses a hier darf niemals ersetzt werden.
Das kann bestenfalls z.B. hier mit a bzw. c passieren:
Lothar Miller schrieb:> Durch was wird es dann ersetzt?
Man kann es auch mit einer nebenläufigen Zuweisung machen.
signal a, b, c : std_logic;
:
process (clk) begin
if rising_edge(clk);
a <= b;
end if;
end process;
c <= a;
Dann wird in c eine Kopie von a angelegt.a wiird von der Synthese
herausoptimiert und nicht als FF synthesiert,stattdessen das Signal c.
Lothar Miller schrieb:> Du wirst einen Prozess und eine Schleife brauchen, und dann das Ganze in> einzelne std_logic audröseln müssen...
ohne process sollte es auch gehen:
noips schrieb:> spi_buff_s(48 to 559) <=
(spi_paket_s.Daten(0)&spi_paket_s.Daten(1)&spi_paket_s.Daten(2)&spi_pake
t_s.Daten(3).....
Wie ist es mit dem "."?Ist das einen Punktoperator wie in C?
Ich habe es ehrlich gesagt nie in vhdl gesehen.Kann mir jemand sagen,
wie man es verwendet oder ein link dazu geben?
Danke.
Mus