Eine Zuweisung mit Concatenation auch einfacher möglich?

Gast #2178982
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));
Moderator (Firma: Titel) Persönliche Seite #2179058
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...
Gast #2179077
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.
Gast #2259969
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?
Gast #2260015
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.
Gast #2260056
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.
Moderator (Firma: Titel) Persönliche Seite #2260177
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.
Gast #2260206
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?
Gast #2260251
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;
Moderator (Firma: Titel) Persönliche Seite #2260261
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;
Gast #2260301
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.
Gast #2262244
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren