Forum: FPGA, VHDL & Co. Eine Zuweisung mit Concatenation auch einfacher möglich?


von noips (Gast)


Lesenswert?

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!
1
spi_buff_s(48 to 559)  <= (spi_paket_s.Daten(0)&spi_paket_s.Daten(1)&spi_paket_s.Daten(2)&spi_paket_s.Daten(3)&
2
              spi_paket_s.Daten(4)&spi_paket_s.Daten(5)&spi_paket_s.Daten(6)&spi_paket_s.Daten(7)&
3
              spi_paket_s.Daten(8)&spi_paket_s.Daten(9)&spi_paket_s.Daten(10)&spi_paket_s.Daten(11)&
4
              spi_paket_s.Daten(12)&spi_paket_s.Daten(13)&spi_paket_s.Daten(14)&spi_paket_s.Daten(15)&
5
              spi_paket_s.Daten(16)&spi_paket_s.Daten(17)&spi_paket_s.Daten(18)&spi_paket_s.Daten(19)&
6
              spi_paket_s.Daten(20)&spi_paket_s.Daten(21)&spi_paket_s.Daten(22)&spi_paket_s.Daten(23)&
7
              spi_paket_s.Daten(24)&spi_paket_s.Daten(25)&spi_paket_s.Daten(26)&spi_paket_s.Daten(27)&
8
              spi_paket_s.Daten(28)&spi_paket_s.Daten(29)&spi_paket_s.Daten(30)&spi_paket_s.Daten(31)&
9
              spi_paket_s.Daten(32)&spi_paket_s.Daten(33)&spi_paket_s.Daten(34)&spi_paket_s.Daten(35)&
10
              spi_paket_s.Daten(36)&spi_paket_s.Daten(37)&spi_paket_s.Daten(38)&spi_paket_s.Daten(39)&
11
              spi_paket_s.Daten(40)&spi_paket_s.Daten(41)&spi_paket_s.Daten(42)&spi_paket_s.Daten(43)&
12
              spi_paket_s.Daten(44)&spi_paket_s.Daten(45)&spi_paket_s.Daten(46)&spi_paket_s.Daten(47)&
13
              spi_paket_s.Daten(48)&spi_paket_s.Daten(49)&spi_paket_s.Daten(50)&spi_paket_s.Daten(51)&
14
              spi_paket_s.Daten(52)&spi_paket_s.Daten(53)&spi_paket_s.Daten(54)&spi_paket_s.Daten(55)&
15
              spi_paket_s.Daten(56)&spi_paket_s.Daten(57)&spi_paket_s.Daten(58)&spi_paket_s.Daten(59)&
16
              spi_paket_s.Daten(60)&spi_paket_s.Daten(61)&spi_paket_s.Daten(62)&spi_paket_s.Daten(63));

von Oliver B. (irq)


Lesenswert?

Hallo,

bin gerade erst dabei, VHDL zu lernen, aber könnte das so in etwa gehen:

>Just a slice of the first array can be specified:
>   TAB_A (4 downto 1) <= TAB_B (3 downto 0);

Quelle: 
http://www.xilinx.com/itp/xilinx6/books/data/docs/xst/xst0067_9.html

In deinem Fall vielleicht so:
1
spi_buff_s(48 to 559)  <= spi_paket_s.Daten(0 to 63)

Viele Grüße, Oliver.

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


Lesenswert?

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

von noips (Gast)


Lesenswert?

> 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:
1
type Data is array (0 to 63) of std_logic_vector(7 downto 0);

Dagegen ist spi_buff_s so deklariert:
1
signal spi_buff_s  : std_logic_vector(0 to 575);

Darum können Sie nicht einfach so zugewiesen werden.

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


Lesenswert?

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

von noips (Gast)


Lesenswert?

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?

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


Lesenswert?

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

von noips (Gast)


Lesenswert?

Besten Dank! Funktioniert einwandfrei!

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


Lesenswert?

noips schrieb:
> Besten Dank!
De nada.
> Funktioniert einwandfrei!
War zu erwarten... ;-)

von noips (Gast)


Lesenswert?

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?

von Georg A. (Gast)


Lesenswert?

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

von nixwisser (Gast)


Lesenswert?

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.

von noips (Gast)


Lesenswert?

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

von noips (Gast)


Angehängte Dateien:

Lesenswert?

Noch ein Screen-Shot, wie der Anfang in Exel aussieht...

von nixwisser (Gast)


Lesenswert?

Besten Dank.

von noips (Gast)


Lesenswert?

Zurück zu meiner Frage! Weiß jemand Rat?

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


Lesenswert?

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
  signal a, 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
  signal a, b : std_logic;
2
  :
3
  process (clk) begin
4
    if rising_edge(clk);
5
      a <= b;
6
    end if;
7
  end process;
Dann ist a natürlich ungleich b!
Bzw: a ist der Wert, den b zum zeitpunkt des Taktes hatte.

von noips (Gast)


Lesenswert?

Danke für die Antwort!

Wenn der Prozess aber so aussieht, also ohne Takt:
1
signal a, b : std_logic;
2
  :
3
  process (b) begin
4
      a <= b;
5
  end process;

dann ist es gleichwertig mit:
1
signal a, b : std_logic;
2
  :
3
  a <= b;

Stimmt es?

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


Lesenswert?

noips schrieb:
> Stimmt es?
Ja.

von nixwisser (Gast)


Lesenswert?

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;

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


Lesenswert?

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:
1
signal a, b, c : std_logic;
2
  :
3
  process (clk) begin
4
    if rising_edge(clk);
5
      a <= b;
6
    end if;
7
  end process;
8
9
  process (clk) begin
10
    if rising_edge(clk);
11
      c <= b;
12
    end if;
13
  end process;

von nixwisser (Gast)


Lesenswert?

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.

von berndl (Gast)


Lesenswert?

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:
1
label: for i in 0 to xxx generate
2
   ...
3
end generate;

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


Lesenswert?

berndl schrieb:
> ohne process sollte es auch gehen:
Richtig. Aber das sieht nicht unbedingt einfacher aus... ;-)

von noips (Gast)


Lesenswert?

Schön zu erfahren, dass es auch mit generate geht. Hab gedacht, generate 
wäre nur zur wiederholten Instanzierung von components gedacht. Danke!

von berndl (Gast)


Lesenswert?

was loop fuer process ist generate fuer concurrent :o)

von Mustafa (Gast)


Lesenswert?

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

von Georg A. (Gast)


Lesenswert?

Das sind records, sowie die structs in C. Sehr bequem, um ganze Busse 
inkl. Steuersignale über einen Port zu bekommen..

von Mustafa (Gast)


Lesenswert?

Verstanden.
Hilft beim Umgang mit Elementen verschiedener Datentypen.
Besten Dank
Mus

von noips (Gast)


Lesenswert?


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.