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.