Ich muss eine Schaltung entwerfen, um bis zu einer Zahl zu zählen und zu Null zurückzukehren. Es muss ein Übertragssignal (das ich a_o
in meiner Schaltung benannt habe) als Flag haben, um anzuzeigen, dass die maximale Anzahl des Zählers erreicht wurde. Die Schaltung funktioniert gut, aber sie schließt ein Flip-Flop im a_o
Signal, dass ich nicht dort sein möchte. Ich habe alle Gründe überprüft, warum ein unerwartetes Flip-Flop auftreten kann, aber ich kann das Problem immer noch nicht lösen.
Vielen Dank im Voraus
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity ej11 is
generic (N : positive := 4;
M : positive := 10);
port (
e_i : in std_logic;
nmr_i : in std_logic;
clk_i : in std_logic;
a_o : out std_logic;
q_o : out std_logic_vector (N-1 downto 0));
end entity ej11;
architecture Comportamiento of ej11 is
signal aux : unsigned (N-1 downto 0);
signal acarreo : std_logic;
begin
Cuenta:
process (clk_i, nmr_i)
begin
if nmr_i='0' then
aux <= (others => '0');
acarreo <= '0';
elsif rising_edge (clk_i) then
if e_i = '1' then
if aux < M-1 then
aux <= aux + 1;
else
aux <= (others => '0');
end if;
if aux = M-2 then
acarreo <= '1';
else
acarreo <= '0';
end if;
end if;
end if;
end process Cuenta;
q_o <= std_logic_vector (aux);
a_o <= acarreo;
end architecture Comportamiento;
Entfernen Sie den Übertrag aus dem Prozess (seine Deklaration ist ebenfalls nicht erforderlich, es sei denn, accarreo
er wird in einem anderen Prozess oder einer gleichzeitigen Anweisung gelesen):
architecture Comportamiento of ej11 is
signal aux : unsigned (N-1 downto 0);
-- signal acarreo : std_logic;
begin
Cuenta:
process (clk_i, nmr_i)
begin
if nmr_i='0' then
aux <= (others => '0');
-- acarreo <= '0';
elsif rising_edge (clk_i) then
if e_i = '1' then
if aux < M-1 then
aux <= aux + 1;
else
aux <= (others => '0');
end if;
-- if aux = M-2 then
-- acarreo <= '1';
-- else
-- acarreo <= '0';
-- end if;
end if;
end if;
end process Cuenta;
q_o <= std_logic_vector (aux);
-- a_o <= acarreo;
end architecture Comportamiento;
Fügen Sie entweder eine gleichzeitige Zuweisung oder einen neuen Prozess mit einer Zuweisung an hinzu a_o
(bedingte gleichzeitige Zuweisung angezeigt):
a_o <= '1' when aux = M-2 else
'0';
Das Einschließen der Zuweisung in accareo
die if-Anweisung leitet die sequentielle Logik vom Flip-Flop ab.
Ein Prozess würde in etwa so aussehen:
Acarreo:
process (aux)
begin
if aux = M-2 then
a_o <= '1';
else
a_o <= '0';
end if;
end process Acarreo;
Hilft es, wenn Sie else
der if e_i = '1' then
Zeile eine entsprechende Bedingung hinzufügen?
Es sieht so aus, als wären acarreo (und aux) nicht zugewiesen, wenn e_i
0 ist. Ich nehme an, dass das Flip-Flop mit a_0 verknüpft ist, weil es im Wesentlichen nur eine gepufferte Version von acarreo ist und sie möglicherweise auf ein einzelnes Signal optimiert sind.
cventu
cventu