Tengo que diseñar un circuito para contar hasta un número y volver a cero. Debe tener una señal de acarreo (que nombré a_o
en mi circuito) como bandera para mostrar que se ha alcanzado el número máximo del contador. El circuito funciona bien, pero está infiriendo un Flip-Flop en la a_o
señal de que no quiero estar allí. He comprobado todas las razones por las que puede aparecer un flip-flop inesperado pero sigo sin solucionar el problema.
Muchas gracias de antemano
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;
Elimine el acarreo del proceso (su declaración tampoco es necesaria a menos que accarreo
se lea en otro proceso o declaración concurrente):
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;
Agregue una asignación concurrente o un nuevo proceso con una asignación a a_o
(se muestra una asignación concurrente condicional):
a_o <= '1' when aux = M-2 else
'0';
Incluir la asignación al accareo
interior de la declaración if es inferir lógica secuencial inferir el flip flop.
Un proceso sería algo como:
Acarreo:
process (aux)
begin
if aux = M-2 then
a_o <= '1';
else
a_o <= '0';
end if;
end process Acarreo;
¿Ayuda si agrega una else
condición correspondiente a la if e_i = '1' then
línea?
Parece que acarreo (y aux) no están asignados si e_i
es 0. Supongo que el flip-flop está asociado con a_0 porque es esencialmente solo una versión amortiguada de acarreo y pueden optimizarse a una sola señal.
cventu
cventu