VHDL aumentar disminuir valor entero

1

He creado un proyecto que tiene un contador "contador" = entero. Necesito aumentar / disminuir un valor entero presionando los botones. El progreso tiene 2 entidades, la entidad 1 debería aumentar. el valor y la entidad 2 deberían disminuir el valor, ¿no puedo hacerlo con el componente cómo hacerlo?

-- component 1 -------------------------------
entity MyCounter is
 port(
    clock: in std_logic;
    KEY: in std_logic;
    counter: in integer range 0 to 15;
    clk_out: out std_logic
  );
end MyCounter; 

architecture arch of MyCounter is

component decrease
    port(

    clock: in std_logic;
    KEY: in std_logic;
    counter: in integer range 0 to 15;
    clk_out: out std_logic

        );
end component;

begin
    p1: process(clock, KEY)
     variable counter : integer;
       begin
         if KEY = '1' then
          counter <= counter + 1;
         end if;
end process; 

end arch;


-- component 2 -------------------------------
entity decrease is
 port(
    clock: in std_logic;
    KEY: in std_logic;
    counter: in integer range 0 to 15;
    clk_out: out std_logic
  );
end decrease ; 

architecture arch of decrease is
begin

    p1: process(clock, KEY)
     begin
      if KEY = '1' then
        counter <= counter - 1;
    end if;
end process; 

end arch;
    
pregunta Power-Mosfet

2 respuestas

6

Su código no se compila, no puede usar <= para asignar a una variable. Tampoco se puede asignar a una entrada (que counter se define como ...)

Tampoco puede tener dos procesos separados que escriben en la misma señal (cuando es de un tipo no resuelto, como integer ). ¿Es este un ejercicio académico? ¿Por qué no tener un solo proceso que tenga:

if rising_edge(clk) then
  if up = '1' then
     count <= count + 1;
  elsif down = '1' then 
     count <= count - 1;
  end if;
end if;

Como tiene un contador de rango limitado, tendrá que ser explícito acerca de hacer que se ajuste (o saturar) cuando intente incrementarlo o disminuirlo más allá del rango aceptable. El simulador morirá de lo contrario. La herramienta de síntesis puede o no hacer lo que necesite, dependiendo, pero es mejor ser explícito con ese tipo de comportamiento.

También, elimine std_logic_arith : si desea que los vectores se traten como números, use ieee.numeric_std.all en su lugar

    
respondido por el Martin Thompson
1

Las variables son procesos internos locales, por lo que no puede usar variables en este caso. Usa la señal en su lugar.

Tampoco use std_logic_arith. Use numeric_std en su lugar.

    
respondido por el Socrates

Lea otras preguntas en las etiquetas