mikrocontroller.net

Forum: FPGA, VHDL & Co. geschachtelte FOR Schleife


Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe mal eine frage zu FOR Schleifen (unterer Code). Ich weiß das 
diese parallele Hardware erzeugen. Nehmen wie mal an ina wäre hex"11" 
und die innere Schleife ist NICHT vorhanden, dann ist mit steigender 
Taktflanke user_array(1) bis (7) = hex"11", dass ist mir klar. Nimmt man 
jetzt die innere Schleife dazu, wurde ich vermuten das die erste '1' 
durch das erste Arrayelement duchgeschoben wird, also 
user_array(0)=b"00010001", dann b"00010011", dann b"00010111" ... und so 
weiter bis alles eins ist. Das geschieht mit jedem Element und am end, 
also mit der ersten steigenden Taktflanke sind mein Arrayelemente alle 
'1'.
Dies ist aber nicht der Fall laut Simulation ist im ersten Takt 
user_array(0) = b"00000001" im zweiten b"00000011" und so weiter, bis 
nach acht takten alles eins ist. Wieso finde ich in der Simulation bei 
diesem konstrukt einen Takt wieder? Und warum ist im ersten Takt 
user_array b"00000001" und nicht wenigstens b"00010001"? Das zeigt mir 
das ich die Abläufe noch nicht ganz verstanden hab, vielleicht könnt ihr 
mir ja etwas auf die Sprünge helfen was da genau abläuft.

type array_size is array (0 to 7) of std_logic_vector(7 downto 0);
sgnal user_array : array_size := (others => (others => '0'));

begin

 process
 begin
  wait until rising_edge(clk);
  if (rst = '1') then
   user_array <= (others => (others => '0'));
  else

   for i in 0 to 7 loop
    user_array(i) <= ina;
    for j in 0 to 6 loop
     user_array(i)(j+1) <= user_array(i)(j);
    end loop;
   end loop;

  end if;
 end process;

Gruß,
matzunami

Autor: Grobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for j in 0 to 6 loop
     user_array(i)(j+1) <= user_array(i)(j);
    end loop;

ist das selbe als hättest du geschrieben:

     user_array(i)(7 downto 1) <= user_array(i)(6 downto 0);

Bit 0 bekommt schonmal gar keinen neuen Wert zugewiesen (behält also 
seinen alten Wert). Ansonsten ist es ein Schieberegister. Die 
Parallelität liegt dadrin, das ja auch jedes der 7 Bits seinen neuen 
Wert gleichzeitig zugewiesen bekommt.

Grobi

Autor: Thomas Reinemann (Firma: abaxor engineering) (abaxor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
matzunami schrieb:

>Wieso finde ich in der Simulation bei diesem konstrukt einen Takt wieder?
Weil die erste Anweisung in deinem Prozess
  wait until rising_edge(clk);

ist.

Mit jeder steigenden Flanke von clk, werden alle Zuweisungen in deinem 
ProZess gleichzeitig (vor dem Hintergrund der Simulationszeit) 
ausgeführt.

> for i in 0 to 7 loop
>     user_array(i) <= ina;
>     for j in 0 to 6 loop
>      user_array(i)(j+1) <= user_array(i)(j);
>     end loop;
>    end loop;


Dementsprechend finden die beiden Zuweisungen

user_array(i) <= ina;
user_array(i)(j+1) <= user_array(i)(j);

im selben Moment statt.

user_array (0) (1) würde sowohl mit ina (1) als auch mit 
user_array(0)(0) beschrieben werden. VHDL legt in dem Fall (zwei 
Ausgänge an einen Eingang innerhalb eines Prozesses) fest, dass die 
letzte Anweisung Vorrang hat.
Damit werden die Bits 7..1 auf den Reset/Initial-Wert "0000000" gesetzt. 
Von der ersten Zuweisung bleibt nur das LSB von hex"11" über.


Tom

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha schönen dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.