Problema al sintetizar

1

Estoy tratando de implementar implementación estructural de contador de anillo. Me sale este error:

  

ERROR: Xst: 528 - Fuente múltiple en la unidad < ringcounter > en la señal < count < 3 > & gt ;; esta señal está conectada a varios controladores.

Podría 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?

edit

Hice los cambios como se sugirió, pero al simular, la salida no se está actualizando para la salida del contador de timbre, ¡aunque especifico el reloj! ¡La salida aún no está definida!

debajo está 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é reinicio. En ese momento solo establecerá el valor en cero y no se producirá ninguna transición, lo que se ve muy obviamente cuando intenté insertar un flip flop con entrada preestablecida que bombeará un valor de 1 al anillo de flipflops. Simplemente lo estoy simulando. ¿Cómo hago el valor para cambiar después de restablecer / preajustar? ¿Me falta algún procedimiento? ...

SO el problema ahora es ¿Cómo inicializo todos los flip-flops y empiezo a cambiar después, en secuencia utilizando el simulador ?? ...

He intentado usar el modelo de comportamiento que no usa DFF. A continuación se muestra el código para el mismo.

la 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));

end ringCounter_BehaviorModel;

arquitectura del comportamiento de ringCounter_BehaviorModel es

comienza

proceso (CLK, CLR)

comienza           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 final;

end Behavioral;

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 falta algún punto en el procedimiento o debo modificar el código o la observación realizada está bien en caso de simulación?

Por lo tanto, el resumen del problema sigue siendo el mismo y es solo eso para inicializar el contador de timbres y comenzar a girar alrededor del sistema.

    
pregunta user40295

3 respuestas

3

Dentro del contador de llamadas, q3 se asigna por la asignación concurrente q3 < = '1' y DFF4. No puedes tener ambos al mismo tiempo.

    
respondido por el apalopohapa
1

Estás haciendo un trabajo innecesario. No deberías tener que crear una primitiva DFF. El sintetizador es lo suficientemente inteligente como para convertir un std_logic_vector que está "sincronizado" por así decirlo (es decir, rodeado por un bloque de proceso con clk en la lista de sensibilidad), en una colección de DFF.

Deshazte de la primitiva DFF, haz un std_logic_vector en su lugar, y luego en ringcounter, realiza un proceso que al reiniciar (tu reinicio es asíncrono, BTW, en caso de que eso te haga diferente) carga tu std_logic_vector con el valor predeterminado valor que desee (por ejemplo, "1000"). Y luego, en un flanco ascendente del reloj, gira todos los elementos del anillo contra la izquierda.

Si tiene problemas para hacer esto, puedo verificar más tarde y mostrarle cómo se hace. Pero primero prefiero que intentes resolverlo por tu cuenta.

    
respondido por el ajs410
0

Como indica la respuesta de apalopohapa, su problema son varios controladores en la misma señal. La instrucción q3 <= '1' está siempre activa, no es solo una inicialización. Ya que estás usando std_logic y no std_ulogic , esto no es técnicamente un error, y el simulador lo ejecutará bien (posiblemente con resultados no deseados, aunque a veces el problema será enmascarado porque sucede que se resuelve en algo que funciona).

Si desea que su contador comience en "1000" después de restablecer y rotar cada reloj (lo que parece que hace), una forma sería modificar DFF para que se pueda predeterminar opcionalmente Q a '1' en lugar de restablecerlo siempre a '0' . Puede hacer esto agregando una entrada preset o un genérico o algo que establezca su valor de inicialización. Hay otros enfoques que también funcionarían.

    
respondido por el fru1tbat

Lea otras preguntas en las etiquetas