Problema al sintetizar

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.

¿Podría ser más específico sobre el origen del error? ¿Qué herramienta está utilizando Xilinx ISE o Altera Quartus o similar?
en su edición, ¿ha especificado un reinicio? Inicializar la q3señal en la declaración no hará nada por la simulación, ya que está impulsada por una DFFinstancia.
1) ¿Está configurando clr en 1 después del pulso de reloj inicial durante su prueba? si permanece en 1, el borde if clk nunca "gana" 2) No necesita el elsif CLR='1', está implícito porque de lo contrario tomaríamos la ruta if CLR='0' 3) En general, debe evitar inout excepto cuando se crean instancias de buses bidireccionales de nivel superior, use out en la declaración del puerto y use señales internamente, por ejemplo, señal q_int : std_logic_vector(3 downto 0); y en la parte inferior, Q <= q_int; 4) La mejor manera de manejar esta rotación sería q_int <= q_int(2 downto 0) & q_int(3) dentro del borde if clk.

Respuestas (3)

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.

No estoy seguro de que tenga el efecto deseado. Todos los DFF están encadenados en un anillo: ¿cómo se puede inicializar uno en ringcounterel 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.

He probado el método mencionado por usted. Donde uso una señal clara para iniciar el flip flop y en el borde ascendente del reloj para moverme por los datos.

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_logicstd_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 DFFpara que pueda preestablecerse opcionalmente Qen '1'lugar de restablecerlo siempre a '0'. Puede hacer esto agregando una presetentrada o un genérico o algo que establezca su valor de inicialización. Hay otros enfoques que también funcionarían.