Hallo Leute! Ich benutze die XILINX-Umgebung 7.1i. Ich habe eine Frage zu Prozessen, nämlich wann wie und warum Prozesse zu Beginn weglaufen. Bei folgendem Beispiel habe ich eine Empfindlichkeitsliste. Der Prozess wird also ausgeführt, wenn sich eine Änderung von clk oder dir ergibt. Laut meinen Tests läuft nach dem Flashen der Prozess sofort los, ohne zu warten bis sich das Signal ändert. Ist der Prozess das erste Mal durchlaufen wartet er brav bis zum nächsten Mal. Warum wird der Prozess nach einem Neustart durchlaufen? p1: process(clk,dir) begin ... ... end process Beim nächsten Beispiel habe ich einen Prozess ohne Empfindlichkeitsliste realisiert. p2: process begin wait until clk='1'; ... ... end process Wenn das Signal clk zu Beginn 0 ist, ist alles in Ordnung. Der Prozess läuft wirklich erst dann ab, wenn das Signal 1 wird. Das Problem ist aber, dass wenn das Signal zu Beginn 1 ist, der Prozess auch nicht wegläuft. Erst dann, wenn das Signal auf 0 schlägt und danach wieder zurück auf 1. Warum? Danke für eure Hilfe. Tschüss, Martin
Mit jedem Prozess beschreibt du die Funktion eines digitalen Schaltkreises, der, so wie du ihn beschrieben hast, mit logischen Zellen (oder wie sie auch genannt werden) realisiert wird. Nun musst du genau hinschauen und sich überlegen, ob die reale digitale Schaltung so funktionieren wird, wie du sie dir vorgestellt hast und ob deine Vorstellung mit dem übereinstimmt, was du in VHDL beschrieben hast.
Ja schon, aber im Buch steht, wenn man einen Prozess mit Empfindlichkeitsliste erstellt, also: p1: process(clk,dir) .. .. end process p1; ,dann wird der Prozess erst dann ausgeführt, wenn sich entweder clk oder dir ändert. Wenn jetzt aber während des Flashens und auch während des Programmstarts, die Signale (clk und dir) permanent stabil anliegen, warum wird bei einem neustart des FPGA-Boards dieser Prozess ausgeführt, obwohl keine Signaländerung besteht? Gruß, Martin
>dann wird der Prozess erst dann ausgeführt, wenn sich entweder >clk oder dir ändert. Das ist richtig. Die SIMU ist event basiert, d.h. zB nach clk'event. Das liegt in der Natur der Simu Programme. Das andere sind die Synthese Tools, umgangsprachlich compiler evtl. Diese benötigen keine Sensitivity liste oder waits! >während des Flashens und auch während des Programmstarts ... >warum wird bei einem neustart des FPGA-Boards dieser Prozess >ausgeführt, obwohl keine Signaländerung besteht? Was macht Dich so sicher, das bei einem Neustart genau dies passiert? Gemessen in Hardware/PCB oder aus der Simulation entnommen oder gar der Synthese (prinzipiell nicht möglich)? Unterscheide streng zwischen diesen 3 Dingen! Bei HDL wie Verilog/VHDL u.a. sind die Regeln andere als bei PC/uC Programmierung. Nimm Dir mal weitere/andere Bücher zu Gemüte und versuche erstmal das Prinzip zu verinnerlichen und den Sprachgebrauch, damit alle von der gleichen Sache reden. Viele Grüße Olaf
Wenn ich mich nicht täusche, gilt das nur für die Simulationsprogramme, d. h. der Prozess wird nur dann ausgeführt, wenn sich irgendwas in der Empfindlichkeitsliste ändert. In der Hardware hast du dann richtige Signale und richtige Gatter. Also wenn du schreibst "if (clk = '1' and clk'event)...", hast du in Hardware irgendwo einen getakteten Eingang und wenn du an diesem Eingang positive Flanke hast, dann werden z.B. die Daten übernommen. Schreibst du einfach "if (clk = '1')...", wird höchstwahrscheinlich ein und-Gatter realisiert, und wann ein und-Gatter aktiv wird und wann nicht, weisst du ja selber...
>Laut meinen Tests läuft nach dem Flashen der Prozess sofort los In einem FPGA "läuft" überhaupt kein Prozess! Ein "Prozess" ist in VHDL ein syntaktisches Mittel, um damit u.a. sequentielle Logik zu beschreiben! Ein Prozess ist kein Programm, dass auf Deinem FPGA "abläuft".
OK! Im Buch steht, ein Prozess kann aktiviert werden. Ich hab euch den Code reingestellt. Ich weiß, dass die Ifs etwas umständlich sind, aber für mich geht es am Anfang nur ums Verständnis. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity ifx is port(inx: in bit; yout: out bit_vector(3 downto 0)); end ifx; architecture Behavioral of ifx is signal y2: bit_vector(3 downto 0):="0000"; begin xx: process(inx) begin if inx='1' then y2(0)<='0'; else y2(0)<='1'; end if; if inx='0' then y2(1)<='0'; else y2(1)<='1'; end if; end process xx; yout<=y2; end Behavioral; Wenn ich nun ein Programming-File generiere und dieses auf die Zielhardware, also auf das FPGA-Board runterlade, dann wird dieser Prozess gleich zu Beginn aktiviert, egal ob sich der Eingangspin (inx) auf high oder low, aber im statischen Zustand befinden. Die Aktivierung des Prozesses kenne ich dadurch, dass die Bits(y2(0) und y2(1)) sich verändern. Diese Bits werden mit einer unbedingten Signalzuweisung auf das Ausgangssignal kopiert. Natürlich wurde von mir zu diesem Zweck auch ein Assign der Package-Pins durchgeführt. Ich habe auch ein Testbench-File geschrieben. Auch im Simulator ist es so, dass gleich zu Beginn der Prozess aktiviert wird. Leute, bitte nicht böse sein, aber ich bin halt noch stark am Lernen und bin froh, wenn ihr mir weiterhelft, da diese Denkweise noch ziemlich ungewohnt ist. Dadurch kommt es vor, dass ich ab und zu mal Begriffe durcheinanderschmeiße. Danke, Tschüss Martin
>Auch im Simulator ist es so, dass gleich zu Beginn der Prozess >aktiviert wird. Stimmt und so steht es auch im VHDL-Standard. Du hast einen Prozess mit Sensitivitätsliste mit dem Signal inx. Das bedeutet, daß Du ein implizite wait-Anweisung im Prozess hast, und zwar am Ende des Prozesses: process(inx) begin ..... wait on inx; end process; Das heisst, das dein Prozess (im Simulator) genau einmal durchlaufen wird, selbst wenn inx von Anfang an konstant ist und sich nicht ändert. Probier mal folgendes aus: Lösch die Sensitivitätsliste weg und schreibe "wait on inx;" vor dem restlichen Code. Ausserdem musst Du den Initialisierungswert von y2 weglöschen. Wenn du dann simulierst, hat y2 den Wert "UUUU" ("unititialized", nicht initialisiert). Wenn Du Deinen Code synthetisierst, ist die Sache noch einfacher, denn es gibt da den Wert 'U' überhaupt nicht. Ein Signal ist immer '0' oder '1'. Oder evtl. hochohmig ('Z'), falls es ein Treiber ist. Dein Prozess beschreibt ganz einfache kombinatorische Logik, und das geht übrigens auch ausserhalb von Prozessen, z.B. so: y2 <= "0001" when (inx = '0') else "0010";
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.