Forum: FPGA, VHDL & Co. vhdl ( 0 to.) in Hex?


von Olpo O. (olpo)


Lesenswert?

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
entity Beispiel
2
  port( Data : out std_logic_vector(0 to 7) );
3
end entity;
4
5
architecture example of Bespiel is
6
7
  signal data_i : std_logic_vector( 7 downto 0);
8
9
begin
10
11
  for index in 0 to 7 loop
12
    Data(index) <= data_i(7-index);
13
  end loop;
14
15
process
16
begin
17
  data_i <= x"AF";
18
end process;
19
end architecture;

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?

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


Lesenswert?

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:
1
entity Beispiel
2
  port( Data : out std_logic_vector(0 to 7) );
3
end entity;
4
5
architecture example of Bespiel is
6
  signal data_i : std_logic_vector( 7 downto 0);
7
begin
8
    Data <= data_i;
9
    data_i <= x"AF";
10
end architecture;
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

von Olpo O. (olpo)


Lesenswert?

naja gut. Dann hat sich die erste Frage erübrigt.

von Olpo O. (olpo)


Lesenswert?

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:
1
output_i <= Output(0 to 7);

???

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


Lesenswert?

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

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

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

von Georg A. (georga)


Lesenswert?

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

von Olpo O. (olpo)


Lesenswert?

Lothar Miller schrieb:
>
> Dein Beispiel könntest du auch einfach so schreiben:
>
1
> entity Beispiel
2
>   port( Data : out std_logic_vector(0 to 7) );
3
> end entity;
4
> 
5
> architecture example of Bespiel is
6
>   signal data_i : std_logic_vector( 7 downto 0);
7
> begin
8
>     Data <= data_i;
9
>     data_i <= x"AF";
10
> end architecture;
11
>
> 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(0 to 7);
2
signal data_i : std_logic_vector(7 downto 0);
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.

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


Lesenswert?

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?

von Olpo O. (olpo)


Lesenswert?

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

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


Lesenswert?

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
   for index in data_i'range loop -- so. Gleiche Wirkung, aber generischer... ;-)
4
      Data(index) <= data_i(index);
5
   end loop;
6
end process;
Dann sollte das gehen...

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


Angehängte Dateien:

Lesenswert?

Bei mir klappt das sowohl mit einer sequentiellen (Process) loop wie 
auch mit einem nebenläufigen (Concurrent) generate...
1
   signal A : unsigned (0 to 7);
2
   signal Z : unsigned (7 downto 0);
3
   signal Y : unsigned (7 downto 0);
4
5
   assignAtoZ: process (A) begin
6
      for i in A'range loop 
7
         Z(i) <= A(i);
8
      end loop;
9
   end process;
10
 
11
   assignAtoY: for i in A'range generate
12
      Y(i) <= A(i);
13
   end generate;

von berndl (Gast)


Lesenswert?

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.

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.