Estoy tratando de implementar la implementación estructural del contador de anillos. me sale este error:
ERROR:Xst:528 - Fuente múltiple en la unidad <ringcounter> en la señal <count<3>>; esta señal está conectada a varios controladores.
Pude simularlo con éxito. ¡Este módulo es parte del proyecto que estoy implementando!..
Aquí está mi código VHDL:
entity DFF is
Port (
reset : in STD_LOGIC;
clk : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end DFF;
architecture Behavioral of DFF is
begin
process(clk,reset)
begin
if reset = '1' then
Q <= '0'; -- clear register
elsif (clk'event and clk = '1') then
Q<=D; --positive edge of clock is used
end if;
end process;
end Behavioral;
--Code for ring counter
entity ringcounter is
Port ( reset : in STD_LOGIC;
clk : in STD_LOGIC;
count : out STD_LOGIC_VECTOR (3 downto 0));
end ringcounter;
architecture Behavioral of ringcounter is
signal q0,q1,q2,q3 : STD_LOGIC : = '0'; ---initialising the signals
--signal temp :STD_LOGIC : = '1'; --not using it as of now.
component DFF is
Port ( reset : in STD_LOGIC;
clk : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end component;
begin
q3<= '1';
DFF1: DFF port map(reset,clk,q3,q0);
DFF2: DFF port map(reset,clk,q0,q1);
DFF3: DFF port map(reset,clk,q1,q2);
DFF4: DFF port map(reset,clk,q2,q3);
count <= q3&q2&q1&q0;
end Behavioral;
¿Qué va mal?
editar
Hice los cambios como se sugirió, pero durante la simulación, la salida no se actualiza para la salida del contador de anillo, ¡aunque especifico el reloj! ¡La salida aún no está definida!
a continuación se muestra el código modificado
entity DFF is
Port ( reset : in STD_LOGIC;
clk : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end DFF;
architecture Behavioral of DFF is
begin
process(clk,reset)
begin
if reset='1' then
Q <= '0'; -- clear register
elsif (clk'event and clk='1') then
Q<=D; --positive edge of clock is used
end if;
end process;
end Behavioral;
------------CODE OF RING COUNTER-----------------------
entity ringcounter is
Port ( reset : in STD_LOGIC;
clk : in STD_LOGIC;
count : out STD_LOGIC_VECTOR (3 downto 0));
end ringcounter;
architecture Behavioral of ringcounter is
signal q0,q1,q2 : STD_LOGIC := '0'; ---initialising the signals
signal q3 :STD_LOGIC := '1';
component DFF is
Port ( reset : in STD_LOGIC;
clk : in STD_LOGIC;
D : in STD_LOGIC;
Q : out STD_LOGIC);
end component;
begin
DFF1: DFF port map(reset,clk,q3,q0);
DFF2: DFF port map(reset,clk,q0,q1);
DFF3: DFF port map(reset,clk,q1,q2);
DFF4: DFF port map(reset,clk,q2,q3);
count <= q3&q2&q1&q0;
end Behavioral;
sí, especifiqué restablecer. En ese momento, solo establecerá el valor en cero y no ocurrirá ninguna transición, lo que se ve muy obviamente cuando intenté insertar un flip flop con una entrada preestablecida que bombeará un valor de 1 al anillo de los flipflops. ¡Solo lo estoy simulando! ¿Cómo hago que el valor cambie después de restablecer/preestablecer? ¿Me estoy perdiendo algún procedimiento?...
Entonces, el problema ahora es ¿Cómo inicializo todos los flip-flops y empiezo a cambiar después, en secuencia usando el simulador?...
He intentado usar el modelo de comportamiento sin usar DFF. A continuación se muestra el código para el mismo.
entidad ringCounter_BehaviorModel es
Port ( CLK : in STD_LOGIC;
CLR : in STD_LOGIC;
Q : inout STD_LOGIC_VECTOR (3 downto 0);
NQ : inout STD_LOGIC_VECTOR (3 downto 0));
fin ringCounter_BehaviorModel;
El comportamiento de la arquitectura de ringCounter_BehaviorModel es
comenzar
proceso (CLK, CLR)
comenzar si (CLR = '0') entonces
Q<= "1000";
elsif (CLR ='1') then
si CLK'event y CLK='1' entonces
Q(0) <= Q(3);
for i in 0 to 2 loop
Q(i+1) <= Q(i);
end loop;
end if;
end if;
proceso finalizado;
terminar Conductual;
Mi pregunta es cuando lo simulo, fuerzo el valor de clr a 0 para inicializar el contador a 1000 y le doy una señal de reloj a la entrada del reloj. Después de hacer clic en ejecutar, pude ver los valores de Q como 1000, pero los valores siguen siendo los mismos incluso cuando observo que el pulso del reloj varía entre 0 y 1.
cuando vuelvo a ejecutar todos los valores se pierden y tengo que forzar los valores de nuevo.
En el caso de clr = '1', la inicialización no ocurre y no hay esperanza de cambiar los valores deseados. ¿Me estoy perdiendo algún punto en el procedimiento o debo modificar el código o la observación realizada estará bien en caso de simulación?
Entonces, el resumen del problema sigue siendo el mismo y es solo eso para inicializar el contador de anillo y comenzar a girar alrededor del sistema.
Dentro del contador de llamadas, q3 está siendo asignado tanto por la asignación concurrente q3<='1' como por DFF4. No puedes tener ambos al mismo tiempo.
ringcounter
el reinicio sin agregar un segundo controlador?Estás haciendo un trabajo innecesario. No debería tener que crear una primitiva DFF. El sintetizador es lo suficientemente inteligente como para convertir un std_logic_vector que está "cronometrado" por así decirlo (es decir, rodeado por un bloque de proceso con clk en la lista de sensibilidad), en una colección de DFF.
Deshágase de la primitiva DFF, haga un std_logic_vector en su lugar, y luego en ringcounter, haga un proceso que al reiniciar (su reinicio es asíncrono, por cierto, en caso de que le haga una diferencia) cargue su std_logic_vector con el valor predeterminado que usted quiere (por ejemplo, "1000"). Y luego, en un flanco ascendente del reloj, gira cada elemento del contador del anillo hacia la izquierda.
Si tiene problemas para hacer esto, puedo volver a consultar más tarde y mostrarle cómo se hace. Pero prefiero dejar que trates de resolverlo por tu cuenta, primero.
Como indica la respuesta de apalopohapa, su problema son varios controladores en la misma señal. La declaración siempreq3 <= '1'
está activa, no es solo una inicialización. Dado que está usando y no , esto no es técnicamente un error, y el simulador lo ejecutará bien (posiblemente con resultados no deseados, aunque a veces el problema se enmascarará porque sucede que se resuelve en algo que funciona).std_logic
std_ulogic
Si desea que su contador comience "1000"
después del reinicio y gire cada reloj (que parece que lo hace), una forma sería modificarlo DFF
para que pueda preestablecerse opcionalmente Q
en '1'
lugar de restablecerlo siempre a '0'
. Puede hacer esto agregando una preset
entrada o un genérico o algo que establezca su valor de inicialización. Hay otros enfoques que también funcionarían.
Decano
frut1tbat
q3
señal en la declaración no hará nada por la simulación, ya que está impulsada por unaDFF
instancia.ajs410