Universelles Schieberegister

Ich entwerfe ein universelles Schieberegister mit 4 Bit in VHDL.

Ich verwende auch die Xilinx-Software, um den VHDL-Code zu simulieren.

Ich habe es geschafft, den Code zu schreiben, der nach mehrmaliger Überprüfung fehlerfrei zu sein scheint (ich verstehe, dass der Code manchmal erfolgreich kompiliert werden kann, aber tatsächlich gibt es einige Probleme, die nicht so offensichtlich sind).

der Code:

entity USR is
Port ( clk : in  STD_LOGIC;
       rst : in  STD_LOGIC;
       sir : in  STD_LOGIC;
       sil : in  STD_LOGIC;
       d : in  STD_LOGIC_VECTOR (3 downto 0);
       q : out  STD_LOGIC_VECTOR (3 downto 0);
       s : in  STD_LOGIC_VECTOR (1 downto 0));
end USR;

architecture Behavioral of USR is
signal temp: std_logic_vector(3 downto 0);

begin
process(rst,clk,s,d,sir,sil)

    begin

    if rst='1' then
    temp<= "0000";
    q<= "0000";

    elsif (clk='1' and clk'event) then

        case s is
        -- PARALLEL LOAD 
        when "11" =>
        temp <= d;
        q <= temp;

        -- SHIFT LEFT       [0] [0] [0] [0]
        --                  [0] [0] [0] [sil]
        when "01" =>
        temp <= d;
        temp(3 downto 1) <= temp(2 downto 0);
        temp(0) <= sil;
        q <= temp;

        -- SHIFT RIGHT      [0] [0] [0] [0]
        --                [sir] [0] [0] [0]
        when "10" => 
        temp <= d;
        temp(2 downto 0) <= temp(3 downto 1);
        temp(3) <= sir;
        q <= temp;

        -- HOLD
        when "00" =>
        temp <= temp;
        q <= temp;

        when others => null;

        end case;
    end if;
end process;    

end Behavioral;

Ich habe versucht, dies auf dem Xilinx ISE-Simulator auszuführen, aber wenn ich die Wellenform simuliere, scheint es keine Änderungen an den Ausgängen zu geben.

https://puu.sh/yPBaF/619f0f8bd7.png

Wie das obige Bild zeigt, sollten die Ausgänge q bei s = "11" die gleichen sein wie die Eingänge d as

when "11" =>
temp <= d;
q <= temp;

Daher wird dem Eingang d das Signal temp und dann dem Ausgang q das Signal temp zugewiesen.

Theoretisch sollte so etwas zeigen, dass die Ausgaben q gleich der Eingabe d sind

Ich kann dafür keine Lösung finden oder tatsächlich zeigen alle Modi (s = 00, 01, 10, 11) keine Änderungen in der Ausgabe.

Gibt es etwas, das ich verpasst habe?

Wie viel Debugging hast du versucht? Können Sie im Reset-Bereich q = "1111" setzen, um sicherzustellen, dass das, was Sie sehen, verbunden ist? Es sind grundlegende Dinge, aber was Sie haben, sieht gut aus, also können Sie nichts vertrauen
Entschuldigung: Sie haben Recht, die q <= Temperaturänderung ist erforderlich, aber nicht grundlegend. Ich versuche jetzt Ihre Schaltung, aber ich ändere den Prozess (rst, clk, s, d, sir, sil) in Prozess (rst, clk).
Ich habe q = "1111" geändert, was bei einer Simulation keine Änderungen in den Ausgaben zeigte, also nahm ich an, dass irgendwo im Code ein Problem war.
Ich habe jetzt auch versucht, nur mit einem Betriebsmodus (s=11) zu arbeiten und andere auf null geändert, aber immer noch das gleiche Problem.
Eine Sache, die Sie im speziellen Fall "Parallellast" ( s = "11") vermissen, ist die Semantik der Signalzuweisung: Sie wollten schreiben: "Die Signaltemperatur wird dem Eingang d zugewiesen, und dann wird dem Ausgang q der vorherige Wert der Signaltemperatur zugewiesen. "
@Kuroro Deine Signale sind in der Simulation nicht richtig verbunden. Dies wird auch in der Antwort von oldfart gezeigt, und weil nichts, was Sie dabei tun, die Ausgaben zu beeinflussen scheint. Das Problem liegt nicht in Ihrem Prozess, sondern in Ihrer Simulation. Vielleicht treiben die Taktleitungen Ihre Entität nicht wirklich an, vielleicht schauen Sie nicht auf die Ausgänge. Das Problem benötigt weitere Informationen, um es zu lösen.

Antworten (2)

Habe gerade deinen Code UNCHANGED ausprobiert und bei mir funktioniert es.Geben Sie hier die Bildbeschreibung ein

Verwenden von Xilinx Vivado 2017.2.

Das ist großartig! Ich schätze die Hilfe, jetzt weiß ich zumindest, dass der Code, den ich geschrieben habe, solide ist und funktioniert, ich nehme an, das Xilinx-Paket, das ich verwende (das 10.1-Webpack - kostenlose Version für Studenten), könnte der Grund dafür sein, dass es jetzt funktioniert. Kann Xilinx Vivado 2017.2 kostenlos verwendet werden?
Ja, es ist kostenlos. Vergessen Sie nicht, die andere Änderung vorzunehmen, die ich empfohlen habe. Und es ist eine gute Praxis, die Punktzahl zu erhöhen, wenn eine Antwort nützlich ist.
Ja, ich lade gerade die WebPack-Version von Xilinx Vivado 2014.4 herunter, da ich damit die Version 2017.2 nicht herunterladen konnte. Ich habe bereits die Änderungen am Code vorgenommen, die Sie zuvor erwähnt haben. Ich weiß die Hilfe bisher sehr zu schätzen, wenn sich noch etwas ergibt, werde ich auf jeden Fall fragen. Danke.
Xilinx ISE 10.x ist sehr sehr alt. Selbst die neueste verfügbare ISE-Version 14.7 ist 4,5 Jahre alt.

Ich habe dies in Modelsim 6.5, 10.4 und iSim 14.7 überprüft. Es gab die erwarteten Wellenformen gemäß Ihrem Code. Es scheint also, als ob es sich hier um ein Simulatorproblem oder einen Fehler in der Art und Weise handelt, wie Sie dieses Design simuliert haben. Ihr Simulator tritt niemals in Ihren Uhrenblock ein. Prüfen Sie rise_edge(clk) anstelle von clk=1 clk'event. Es gibt bekannte Probleme zwischen diesen beiden Konstrukten in einigen Simulatoren. Versuchen Sie auch, andere Simulatoren zu verwenden.

Allerdings habe ich einige Vorschläge in Ihrem Code.

1) Der Prozess benötigt nur clk und rst in der sensiblen Liste, da der Rest synchrone Signale gemäß Ihrem Code sind.

2)

Temperatur <= d;

q <= Temperatur;

"Theoretisch sollte so etwas zeigen, dass die Ausgaben q mit der Eingabe d identisch sind."

Wenn das Ihre Absicht ist, dann NEIN . Dies ist nicht c/c++. In VHDL wird dies als Signalplanung bezeichnet. Wenn Sie dieses Stück Code schreiben, werden zwei Flip-Flops abgeleitet, die Rücken an Rücken verbunden sind. Einer für temp und der andere für Q. Wenn temp in einer Taktflanke mit dem Wert von D aktualisiert wird. DIESER WERT von temp wird NUR in der nächsten Flanke vom Flip-Flop für QIe erfasst, der Wert der temp wird Q nur in zugewiesen die nächste Taktflanke.

3)

Temp. <= Temp

Das ist unnötig und hat keine Bedeutung. Kannst du weglassen. Der Wert von Cz temp wird bereits vom Flip-Flop gehalten.

Vielen Dank Leute, jetzt habe ich es hinbekommen! Sehr geschätzt für alle Ratschläge.