it-swarm.com.de

Wann muss ein Signal in die Sensitivitätsliste eines Prozesses eingefügt werden

Ich bin verwirrt, wenn ein in einer Architektur deklariertes Signal in die Sensitivitätsliste eines Prozesses eingefügt werden muss. 

Gibt es ein allgemeines Gesetz, das in jeder Situation befolgt werden kann? 

Ich habe echte Schwierigkeiten zu verstehen, wenn ich ein Signal in eine Prozessempfindlichkeitsliste aufnehmen muss.

22
Mazzy

Das "allgemeine Gesetz" ist das 

alles, was Ihr Prozess über Änderungen von wissen muss, muss in der Sensitivitätsliste stehen.


Für ein typisches synthetisierbares Register mit synchronem Reset:

process (clk) is
begin
    if rising_Edge(clk) then
        if reset = '1' then
             -- do reset things
        else
             -- read some signals, assign some outputs
        end if;
    end if;
end process;

Nur die Uhr muss in der Liste stehen, da alles andere nur betrachtet wird wenn sich die Uhr ändert (aufgrund der if rising_Edge(clk)-Anweisung).


Wenn Sie ein asynchrones reset benötigen:

process (clk, reset) is
begin
    if reset = '1' then
        -- do reset things
    elsif rising_Edge(clk) then
        -- read some signals, assign some outputs
    end if;
end process;

das reset-Signal muss sich ebenfalls in der Sensitivitätsliste befinden, da Ihr Entwurf den Wert jedes Mal überprüfen muss, wenn er sich ändert, unabhängig davon, was die Uhr tut.


Bei der kombinatorischen Logik vermeide ich die Verwendung von Prozessen vollständig, da Probleme bestehen, die Empfindlichkeitsliste auf dem neuesten Stand zu halten, und dass sich das Potential für die Simulation dann anders als der synthetisierte Code verhält. Das all-Schlüsselwort in VHDL-2008 hat dies erleichtert, aber ich habe immer noch nicht die Absicht, lange komplizierte kombinatorische Logik so zu schreiben, dass ein Prozess helfen würde.

22
Martin Thompson

Befindet sich ein Signal in der Empfindlichkeitsliste eines Prozesses, wird der Prozess "aufgeweckt" und immer dann ausgewertet, wenn sich der Wert dieses Signals ändert. Wenn es nicht in der Empfindlichkeitsliste enthalten ist, kann sich ein Signal ändern. Ein Prozess wird jedoch nicht erneut bewertet, um zu bestimmen, wie die neuen Ausgänge aussehen sollen.

Für die kombinatorische Logik: Möglicherweise möchten Sie alle Eingangssignale in die Empfindlichkeitsliste aufnehmen. Wenn sie nicht in der Empfindlichkeitsliste enthalten sind, ändert sich Ihre Ausgabe auch dann nicht, wenn sich das Eingangssignal ändert. Dies ist ein häufiger Fehler (aufgrund von Nachlässigkeit). Beachten Sie, dass Sie in VHDL 2008 das Schlüsselwort "all" verwenden können, um alle erforderlichen Signale automatisch in Ihren Prozess einzufügen und das Erstellen von Latches zu vermeiden.

Für Synchronous Logic: Wahrscheinlich möchten Sie nur Ihr Taktsignal (und möglicherweise Ihr Reset) in der Empfindlichkeitsliste. Dies liegt daran, dass Sie sich nur mit dem Wert Ihrer Signale (außer der Uhr) befassen, wenn sich Ihre Systemuhr geändert hat. Dies ist darauf zurückzuführen, dass Sie normalerweise Register (bestehend aus Flip-Flops) beschreiben, die nur den Ausgangswert einer Clock-Flanke ändern können.

All dies kann bei der Verwendung von HDL für die Synthese verwirrend sein, da nur eine Teilmenge der in VHDL beschriebenen Schaltungen tatsächlich in einem FPGA implementiert werden kann. Beispielsweise können Sie kein primitives Speicherelement verwenden, das auf zwei unabhängige Taktflanken empfindlich reagiert, obwohl Sie eine solche Schaltung beschreiben könnten, indem Sie zwei Takte in eine Sensitivitätsliste aufnehmen.

14
Josh

Außerdem berücksichtigen die Synthesewerkzeuge (in diesem Fall Xilinx XST) nicht immer die Prozessempfindlichkeitsliste. Wenn Sie nicht alle Prozesse auflisten, deren Werte im Hauptteil des Prozesses ausgewertet werden, gibt das XST eine Warnung aus, die besagt, dass die Signale, deren Werte ausgewertet werden, in der Sensitivitätsliste stehen. Dies kann zu Unterschieden zwischen Verhaltenssimulationen und tatsächlicher Hardware führen. Denken Sie daran.

1

Achtung, die Sensitivitätsliste hat keinen Einfluss auf das Verhalten Ihres Designs, sobald es synthetisiert ist. Es wird nur während der Simulation verwendet. Daher ist es relativ einfach, durch Änderungen der Empfindlichkeitsliste einen Unterschied im Verhalten zwischen RTL und synthetisiertem Code einzuführen.

Die Regeln, die Josh gibt, sind gut, aber lesen Sie vor allem die Warnungen, die Ihnen Ihre Werkzeuge geben, und handeln Sie danach. Sie überprüfen normalerweise, ob die Sensitivitätsliste korrekt ist, und weisen auf Probleme hin. Der Emacs VHDL-Modus enthält auch einen Befehl zum Aktualisieren der Sensitivitätsliste, der normalerweise ziemlich gut ist.


Hmmmm, Ninja

0
Paul S