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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.