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.
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?
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.
pscheidler
Alter Furz
Kuroro
Kuroro
user_1818839
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. "pscheidler