VHDL-Code und unbeabsichtigte Latches

Ich arbeite daran, einen Regsiter a1mit Eingangssignalen zu codieren b1,rst, und wra1das Register a1wird beim Zurücksetzen auf einen bestimmten Wert initialisiert. a1ändert seinen Wert nur dann, b1wenn wra1er 1sonst den alten Wert behält

process(clk,regrst)
begin
    if(regrst='1')then  
        a1 <= (others =>'0');
    elsif(clk'event and clk='1') then       
        if(wra1='1')then
            a1 <= b1;
        end if;
    end if;
end process;

In dieser Anweisung habe ich den Registerprozess geschrieben, um das benötigte wra1-Signal zu aktualisieren, aber ich bin verwirrt darüber, wie ich den alten Wert des Ausgangs beibehalten kann, falls dieses Schreibsignal 0 ist. Generiert dieses Konzept unbeabsichtigte Latches, um den vorherigen Wert zu speichern ? Wenn ja, was kann ich zu Beginn des Prozesses als Standardregisterzuweisung hinzufügen? und sollte ich die else-Anweisung mit einschließen

a1<=a1; 

Danke

Ihr Code generiert ein Register mit asynchroner Rücksetzung und Schreibfreigabe wie vorgesehen. Eine else-Anweisung ist nicht erforderlich. Dies funktioniert, weil Ihre Empfindlichkeitsliste nur asynchrone Signale enthält (Uhr- und Reset-Signal). Solange keine steigende Flanke vorhanden ist, kann es außer dem Zurücksetzen keine Änderungen geben. Das ist also ein echtes Flip-Flop-Verhalten, kein Latch-Verhalten :)

Antworten (1)

Wie Paebbels in seinem Kommentar erwähnt, funktioniert Ihr Prozess genau so, wie Sie es beabsichtigen.

Sie erhalten ein Flip-Flop und kein Latch, da clkin Ihrer if-Anweisung die Bedingung aktiviert ist, die angibt, dass dies a1nur zugewiesen wird, wenn clk steigt. clk'eventbedeutet gerade eine Änderung am clk, also clk'event and clk='1'clkgerade geändert und ist jetzt eins“, dh eine steigende Flanke.

Eine Default-Zuweisung wie von Ihnen vorgeschlagen ist nicht notwendig, da ein Signal seinen vorherigen Wert behält, wenn es nicht explizit zugewiesen wird. Dies vereinfacht sequentielle Prozesse wie den von Ihnen geposteten, ist aber auch die Quelle unerwünschter Latches in kombinatorischen Prozessen.

Das Folgende ist ein Riegel:

process(wra1, b1) begin
    if(wra1='1')then
        a1 <= b1;
    end if;
end process;

a1Beachten Sie, dass 1) dieser Prozess keine Uhr hat (d. h. keine steigende Flankenbedingung an einem Signal), genau wie ein Prozess, der kombinatorische Logik beschreibt, aber 2) wenn wra1nicht 1 ist, wird ihm kein Wert zugewiesen, was bedeutet, dass er seinen aktuellen Wert behält, bis es wra1ist 1 wieder, auch wenn b1Änderungen. Das ist die Semantik eines Riegels.