VHDL loop no está actualizando la salida

0

¿Por qué no cambia el valor de la salida? ¿Se ha cronometrado y el bucle interno debería actualizarse? En la simulación, el valor de la salida siempre es 9. Por favor, ayúdenme a faltar. Me gustaría que el código actualice la salida cuando se actualice el bucle interno.

 library ieee;
    use ieee.std_logic_1164.ALL;
    use ieee.numeric_std.ALL;

entity test is
    port(
        clk : in std_logic;
        output : out integer
    );
end entity;

architecture behave of test is
begin
process(clk)
begin
if (clk'event and clk = '1') then
for x in 0 to 9 loop
   for y in 0 to 9 loop
       output <= y;
   end loop;
end loop;
end if;
end process;
end behave;

Me gustaría usar valores de bucle interno y externo. Podría ser usado como contador para mi sistema.

La forma de onda deseada sería así.

Me gustaría usar el valor de y yx si es posible /

    
pregunta Main

2 respuestas

3

Su proceso experimenta las siguientes etapas:

  1. Se observa un evento en clk .
  2. clk tiene un valor de '1' , por lo que la ejecución continúa en sus bucles
  3. Tu bucle intenta asignar varios valores a y . Solo se programará el valor último asignado, esta ejecución de un proceso con una lista de sensibilidades se realiza en tiempo cero.
  4. El proceso termina.

No verás el valor de y contando a través de diferentes valores, porque todos los 'cambios' suceden en tiempo cero. Solo observarás el valor final, que es 9.

Su explicación de lo que quiere que haga el código realmente no tiene sentido. ¿Está intentando implementar su código en un dispositivo FPGA real? En este caso, ¿qué significaría para un contador hacer un ciclo a través de los valores 0-9 en un borde de reloj ascendente? Es posible que necesite ampliar su descripción; ¿Por qué quieres que la salida haga esto?

Si solo quiere que un contador cuente a través de los valores 0..9, podría usar algo como esto:

signal counter_s : integer range 0 to 9 := 0;  -- Initial value of zero

...

process (clk)
begin
  if (rising_edge(clk)) then -- Better to use 'rising_edge' function
    if (counter_s = 9) then
      -- The counter should loop back round to zero
      counter_s <= 0;
    else
      counter_s <= counter_s + 1;
    end if;
  end if;
end process;

counter <= counter_s;

Necesita una señal intermedia counter_s , porque no se puede leer un puerto de modo out .

    
respondido por el scary_jeff
0
begin
process
begin
for x in 0 to 9 loop
   for y in 0 to 9 loop
       wait until (rising_edge(clk));
       output <= y;
   end loop;
end loop;
end process;
end behave;

El funcionamiento interno del código está conectado a la forma en que VHDL ejecuta los procesos. Todas las líneas de proceso se ejecutan secuencialmente y en tiempo cero. Para sincronizar el proceso con un reloj, una forma de lograrlo es forzar el proceso para que se detenga y esperar un flanco ascendente en la señal del reloj. Este código es solo para simulación / bancos de prueba, no para síntesis.

    
respondido por el Claudio Avi Chami

Lea otras preguntas en las etiquetas