Hallo Welt,
mich verwirrt mal wieder die "niederwertiges Bit vorne"-Geschichte.
Angenommen ich habe signal s :std_logic_vector(0 to 7);
Und nun möchte ich dec=hex 3 reinschreiben.
Ist das dann a) x"30" oder b) x"C0" ?
Und noch eine Frage:
Kann ich Ports mit Hilfe eines Signals umdrehen, oder verzögert sich das
dann wieder um einen Takt?
1
entityBeispiel
2
port(Data:outstd_logic_vector(0to7));
3
endentity;
4
5
architectureexampleofBespielis
6
7
signaldata_i:std_logic_vector(7downto0);
8
9
begin
10
11
forindexin0to7loop
12
Data(index)<=data_i(7-index);
13
endloop;
14
15
process
16
begin
17
data_i<=x"AF";
18
endprocess;
19
endarchitecture;
Dauert es jetzt ein oder zwei Takte, bis x"AF" an Data anliegt?
Oder kann man den Compiler sonstwie überlisten, so daß er das
kreuzverdrahtet, ohne Register dazwischen zu schieben?
PS: in Verilog kann ich das mit wire und reg beeinflussen, oder?
olpo olpo schrieb:> Kann ich Ports mit Hilfe eines Signals umdrehen, oder verzögert sich das> dann wieder um einen Takt?
Ich sehe da weit&breit keinen Takt...
Das, was du da geschrieben hast, ist ein ordinäres "Umverdrahten" im
FPGA (und nicht mal das, die Signale bekommen eigentlich nur neue Namen
[und nicht mal das, weil x"AF" eine Konstante ist])....
> ohne Register dazwischen zu schieben?
Ein Takt in VHDL hat was mit rising_edge() oder falling_edge() oder
'event zu tun. Und ohne Takt: kein Register.
Dein Beispiel könntest du auch einfach so schreiben:
Ich habe noch eine Frage: Und zwar in der Verbindung mit einem
Microblaze.
Der ist ja Big-Endian.
dh. wenn Microblaze auf einem Output(0 to 7) eine 3 darstellen möche,
dann sieht das doch so aus, oder: "0000 0011" ?
Möchte ich mit output nun in "Menschenlogik" arbeiten, also output_i(7
downto 0) müsste ich ja so einen Shift machen:
1
output_i(7)<=Output(0);
2
output_i(6)<=Output(1);
3
output_i(5)<=Output(2);
4
etc.
oder?
Kann ich das ganze auch abkürzen, indem ich schreibe:
olpo olpo schrieb:> dh. wenn Microblaze auf einem Output(0 to 7) eine 3 darstellen möche,> dann sieht das doch so aus, oder: "0000 0011" ?
Das linke Bit ist das höchstwertige (obwohl es den niedrigsten Index
hat)...
olpo olpo schrieb:> Und zwar in der Verbindung mit einem Microblaze.> Der ist ja Big-Endian.
Der ist schiefgegangen. Keine Ahnung, wie man auf 0 to irgendwas
kommt, wenn der ganze Rest der Welt mit downto arbeitet.
Big-Endian bezieht sich traditionellerweise nur auf die Reihenfolge der
Bytes im Speicher. Dass das höherwertigste Bit den niedrigsten Index
bekommt kann nur als kurios bezeichnet werden...
olpo olpo schrieb:> Kann ich das ganze auch abkürzen, indem ich schreibe:> output_i <= Output(0 to 7);
Du kannst das abkürzen, indem du schreibst:
output_i <= Output;
Abe ich meine, das schon mal erwähnt zu haben...
olpo olpo schrieb:> Ich habe noch eine Frage: Und zwar in der Verbindung mit einem> Microblaze.> Der ist ja Big-Endian.
Pass auf, wie Lothar schon schreibt: Das eine bezieht sich auf die
Byte-Order, das andere auf die Bit-Order.
> Kann ich das ganze auch abkürzen, indem ich schreibe:output_i <= Output(0 to 7);
Ich meine da schonmal Funktionen gesehen zu haben, die die Bit-Order
rumdrehen. Aber offensichtlich scheint das heutzutage auch ohne zu
gehen.
Lothar Miller schrieb:> Der ist schiefgegangen. Keine Ahnung, wie man auf 0 to irgendwas> kommt, wenn der ganze Rest der Welt mit downto arbeitet.
Das kommt irgenwie von IBM, das ist beim PowerPC auch so (schlecht).
Vielleicht kam der Verantwortliche damals aus einem Kulturkreis, wo so
gezählt wurde...
Duke
> Das kommt irgenwie von IBM, das ist beim PowerPC auch so (schlecht).
Das EDK gabs zuerst ja bei den Virtexen mit PPC, daher musste das für
den MB auch so übernommen werden. Sonst wäre die ganze schöne
Tool/IPcore-Sammlung nutzlos geworden.
Ich will nicht wissen, wieviel Arbeitszeit das schon verschwendet hat,
insb. bei der Anbindung an "normale" Chips... Hab irgendwo mal ein
Posting gelesen, wo derjenige fast Amok gelaufen ist, weil beim DDR-RAM
A10 eine Sonderbedeutung hat und das mit der IBM-Reihenfolge auf A1 oder
so aus dem Controller-Core rauskam.
> Denn dann wird automatisch das linke Bit von data_i an Data zugewiesen,> dann das nächste und so fort. Diese "elegante" Bitdreherei mache ich> auch dort: http://www.lothar-miller.de/s9y/archives/60-RS232-IO.html
Zumindest in ModelSim scheint das nicht zu funktionieren.
1
Data:std_logic_vector(0to7);
2
signaldata_i:std_logic_vector(7downto0);
3
4
Data<=data_i;
5
data_i<=x"80";
Jetzt ist:
data_i(7) == 1
data_i(0) == 0
Data(7) == 0
Data(0) == 1
Irgendwo haben wir uns missverstanden.
olpo olpo schrieb:> Jetzt ist:>> data_i(7) == 1> data_i(0) == 0> Data(7) == 0> Data(0) == 1
Passt doch. Die Bits sind getauscht, obwohl/weil die Vektoren geradeaus
aufeinander gelegt wurden:
data_i(7) == Data(0)
data_i(0) == Data(7)
Das ist doch genau das, was deine Funktion (vom ersten Post) auch macht:
>>> for index in 0 to 7 loop>>> Data(index) <= data_i(7-index);>>> end loop;> Irgendwo haben wir uns missverstanden.
Mag sein, nur wo?
oh ja, meine Funktion ist dümmlich ! ^^
Es sollte natürlich so heißen
for index in 0 to 7 loop
Data(index) <= data_i(index);
end loop;
Leider frisst das ModelSim nicht ohne getakteten Prozess.
Kann man das noch kürzer schreiben, ungetaktet(!), als jedes Bit einzeln
zu schieben?
Data(7) <= data_i(7);
Data(6) <= data_i(6);
...
olpo olpo schrieb:> Leider frisst das ModelSim nicht ohne getakteten Prozess.
Das würde mich aber sehr wundern! Welche Fehlermeldung bekommst du?
Sieht dein Prozess etwa so aus?
1
process(data_i)begin
2
-- for index in 7 downto 0 loop -- so, oder
3
forindexindata_i'rangeloop-- so. Gleiche Wirkung, aber generischer... ;-)
Duke Scarring schrieb:>> Der ist schiefgegangen. Keine Ahnung, wie man auf 0 to irgendwas>> kommt, wenn der ganze Rest der Welt mit downto arbeitet.> Das kommt irgenwie von IBM, das ist beim PowerPC auch so (schlecht).> Vielleicht kam der Verantwortliche damals aus einem Kulturkreis, wo so> gezählt wurde...
das ist viel aelter als POWER. Das kenne ich von IBM seit
/360.../370.../390 Grossrechnern, vermutlich haben die es von ihren
Vorgaengern uebernommen. Ist halt 'historisch' und deshalb in der
heutigen Zeit ungewoehnlich.