blackandpink schrieb:
> Könnte mir jemand vllt einen Tipp geben?
Ich habe mir mal die ersten paar Zeilen des kombinatorischen Prozesses
angesehen und komme zum Schluss: du progammierst normalerweise Software,
wo eine Zeile nach der anderen "abgearbeitet" wird. Das ist in Hardware
vollkommen anders: da passiert alles gleichzeitig. Der
kombinatorische Prozess wird theoretisch in der Zeit 0 ausgeführt, in
der Praxis braucht die Kombinatorik ein paar ns bis sie sich beruhigt
hat. Letztlich hast du also grundlegend die falsche Denkweise.
Mit einer HDL beschreibst du Hardware. Du brauchst also ein Bild oder
eine Vorstellung, wie die Hardware letztlich aussehen soll. Dann kannst
du Syntaxelemente der Beschreibungssprache nehmen, um dieses Verhalten
oder diese Struktur zu beschreiben.
Ich pflücke mal 3 Zeilen aus dem Code:
1 | for i in 0 to 2 loop -- delay signal convertion to get phaseshift
|
2 | output_clk <= out_tmp;
|
3 | end loop;
|
Eine Schleife in VHDL vervielfacht Hardware! Da steht also nach dem
Ausrollen der Schleife:
1 | output_clk <= out_tmp;
|
2 | output_clk <= out_tmp;
|
3 | output_clk <= out_tmp;
|
Und weil in einem Prozess die letzte Zuweisung an ein Signal gewinnt,
steht da letztendlich unabhängig von der Schleifenlänge immer:
Und das mit dem "Ausrollen" und "letzte Zuweisung gewinnt" gilt
natürlich durch den gesamten Prozess, so dass da dann z.B. sowas steht:
1 | :
|
2 | :
|
3 | begin
|
4 | process(phase_shift)
|
5 | begin
|
6 | case phase_shift is
|
7 | :
|
8 | :
|
9 | -- 135° --------------------------------
|
10 | when "011" =>
|
11 | out_tmp <= not input_clk;
|
12 | output_clk <= out_tmp; -- erste Schleife ausgerollt und optimiert
|
13 | -- end loop;
|
14 | output_clk <= out_tmp; -- innere Schleife ausgerollt und optimiert
|
15 | out_tmp <= not out_tmp; -- äußere Schleife ausgerollt und optimiert
|
16 | :
|
17 | :
|
18 | end case;
|
19 | end process;
|
20 | end architecture behavioral;
|
Ja richtig, das bleibt letztlich übrig...
Und jetzt hagelt es dich raus, denn das hier ist eine gut versteckte
kombinatorische Schleife:
1 | out_tmp <= not out_tmp;
|
Siehe
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html
Das hätte die Simulation (hast du das Design denn überhaupt simuliert?
mit welchem Ergebnis?) sicher mit einer Überschreitung der
Iterationsanzahl quittiert, wenn denn die Sensitivliste des Prozesses
vollständig wäre. Aber leider fehlen dort input_clk und out_tmp...
> Wenn ich die Zeilen 119-125 auskommentiere fällt der Fehler weg.
Das Design wird wegen der kombinatorischen Schleife trotzdem nicht
laufen. Der Fehler fällt nur deshalb weg, weil dann dise Schleife
gegatet (und somit noch besser versteckt) wird.
> Ich frage mich auch warum output_clk_c einen Fehler verursacht.
Das ist lediglich ein Folgefehler durch die fehlerhafte Erzeugung eines
Taktes.
> Im angehängten code versuche ich einen Phaseshift abhängig einer Eingabe
> zu erzeugen.
Welche Zielplattform? Welche Taktfrequenz? Woher kommt das
Eingangssignal? Was wird mit dem erzeugten Signal angesteuert?