Hallo, ich bin ziemlich neu in allem, sowohl FPGAs, VHDL als auch Foren^^ Hoffe ich stelle meine Frage richtig, aber ich komme einfach nicht mehr weiter und wäre über jede Hilfe echt dankbar! Im angehängten code versuche ich einen Phaseshift abhängig einer Eingabe zu erzeugen. Aber ich bekomme die folgende Fehlermeldung. ERROR - BN126 :"c:\users\...\phaseshifter.vhd":8:7:8:18|Net output_clk_c (in view: work.phaseshifter(behavioral)) is missing a driver. Wenn ich die Zeilen 119-125 auskommentiere fällt der Fehler weg. Dabei ist dieser Block (also der Fall "111") bloß eine Kopie von den anderen Fällen bis auf die Anzahl der Loops. Es funktioniert auch nicht, wenn ich "111" durch "others" ersetze, oder "when others => irgendein default wert" hinter den Block packe. Könnte mir jemand vllt einen Tipp geben? Ich frage mich auch warum output_clk_c einen Fehler verursacht. Dieses Signal kommt in meinem Code gar nicht vor?! Liebe Grüße
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:
1 | output_clk <= out_tmp; |
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?
:
Bearbeitet durch Moderator
Oi, erst mal vielen Dank für die schnelle und ausführliche Antwort! Sie haben mich da sehr gut durchschaut! Bei Hardwarebschreibungssprachen bin ich blutie Anfängerin. Ich habe gelesen, dass Statements in Prozessen sequentiell abgearbeitet werden und for loops synthetisierbar sind und da hab ich sie mal zusammengepackt^^ Simuliert habe ich noch nicht. Werde ich aber gleich heute Abend nachholen. Ich hätte wohl mehr erklären sollen: Ich bekomme von meinem Board (MachXO3LF)eine Clock von 12.09MHz. Diese führe ich durch eine PLL und generiere mit ihr eine Clock von 54.24MHz (13.56Mhz * 4). Diese teile ich dann wieder durch 4, aber mit einem Versatz, so dass ich am Ende 13.56Mhz, aber mit Phaseshift, habe. Im Moment wird damit noch nichts angesteuert. Ich probiere immer noch einfach nur ein Signal zubekommen. Dh also ich kann schon die Fallunterscheidungen behalten, sollte aber das Zählen anhand von meiner Eingangsclock machen? Und muss die Sensitivity List immer alle Signale enthalten die im Prozess auftauchen? Es würde mir genügen dass der Prozess beginnt wenn ein Signal zur Phasenverschiebung gegeben wird. Liebe Grüße
blackandpink schrieb: > Und muss die Sensitivity List immer alle Signale enthalten die im > Prozess auftauchen? Es müssen alle signale rein, die eine Auswirkung auf andere Signale haben und eine Neuberechnung des Prozesses nötig machen. > Es würde mir genügen dass der Prozess beginnt wenn > ein Signal zur Phasenverschiebung gegeben wird. Man kann über die Sensitivliste nicht das Verhalten des Synthesizers steuern. Man kann damit lediglich das Verhalten des Simulators steuern. Blöd nur, dass dann die Simulation nicht mehr zur Realität passt... blackandpink schrieb: > Ich hätte wohl mehr erklären sollen: Ich bekomme von meinem Board > (MachXO3LF)eine Clock von 12.09MHz. Diese führe ich durch eine PLL und > generiere mit ihr eine Clock von 54.24MHz (13.56Mhz * 4). Soweit , so gut. Klappt das schon? Kommt diese Frequenz heraus? > Diese teile ich dann wieder durch 4, aber mit einem Versatz, so dass > ich am Ende 13.56Mhz, aber mit Phaseshift, habe. Und hier würde ich was anderes machen: ein mit "1111" initialisierte Schieberegister, das mit der 4-fachen Frequenz getaktet wird, ein Inverter dahinter, dazu ein Multiplexer und die Welt gehört mir:
1 | clk_out |
2 | ^ |
3 | | |
4 | __________________|___________________ |
5 | phase_sel >-------/______________________________________\ |
6 | | | | | |
7 | .---------+----------|----------|----------+------. |
8 | | .----. | .----. | .----. | .----. | | |
9 | '-| |--o--| |--o--| |--o--| |--o--|>o-' |
10 | .--|> | .-|> | .-|> | .-|> | |
11 | | '----' | '----' | '----' | '----' |
12 | 54MHz >---o-----------o----------o----------' |
13 | |
14 | Bit 3 2 1 0 |
Das sieht dann in der Praxis ganz ohne Prozess so aus:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | entity phaseshifter is |
6 | port( input_clk : in std_logic; |
7 | phase_shift : in bit_vector(2 downto 0); |
8 | output_clk : out std_logic); |
9 | end phaseshifter; |
10 | |
11 | architecture behavioral of phaseshifter is |
12 | signal sr : std_logic_vector (3 downto 0) := "1111"; |
13 | begin
|
14 | |
15 | sr <= not sr(0) & sr(3 downto 1) when rising_edge(input_clk); |
16 | |
17 | clk_out <= sr(3) when phase_shift="001" or phase_shift="011" else |
18 | sr(2) when phase_shift="011" else |
19 | sr(1) when phase_shift="101" or phase_shift="111" else |
20 | sr(0); |
21 | |
22 | end behavioral; |
Der Multiplexer muss natürlich noch richtig angepasst werden. Das war mir jetzt doch zu viel Aufwand, die Denkweise nachzuvollziehen... > Im Moment wird damit noch nichts angesteuert. Das ist auch eine sehr unsaubere Art, für einen FPGA einen Takt zu erzeugen. Wenn du diese Takte aussen verwenden willst solltest du auf jeden Fall Jitter und Skew ansehen...
:
Bearbeitet durch Moderator
Ok, das muss ich jetzt alles erst mal nacharbeiten und verstehen^^° Vielen Dank für Ihre Hilfe! Ich werde mal komplett umdenken dann wird es bestimmt was! Und ich merke gerade, dass ich auch schon ganz viel auf Ihrer Seite nachgelesen habe. Aber wohl nicht aufmerksam genug... Also auch Danke für diese Hilfe! Liebe Grüße
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.