Forum: FPGA, VHDL & Co. geschachtelte FOR Schleife


von matzunami (Gast)


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

von Grobi (Gast)


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

von Thomas R. (Firma: abaxor engineering) (abaxor)


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

von matzunami (Gast)


Lesenswert?

aha schönen dank

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.