Contador U/D de 4 bits en VHDL

Intento codificar en VHDL un contador de 4 bits que cuenta de "0000" a "1111" o de "1111" a "0000", según el valor de mi variable UD (si UD = '1' debe hacer una cuenta atrás y si es = '0' arriba). También hay una señal RCO_L que obtiene el valor = '0' cuando mi contador llega a uno de los lados del contador (0 o 15). Por último, hay una señal ENP_L que inhibe mi contador cuando se establece en 1.

Me resulta difícil codificar ya que soy nuevo en VHDL y estoy recibiendo muchos errores. Si alguien pudiera ayudarme, realmente lo apreciaría.

Esto es lo que he hecho hasta ahora:

*entity contador is
    Port ( A : in  STD_LOGIC_VECTOR(3 downto 0);
           CLK : in  STD_LOGIC;
           LOAD_L : in  STD_LOGIC;
           UD : in  STD_LOGIC;
           ENP_L : in  STD_LOGIC;
              Q : out  STD_LOGIC (3 downto 0);
           RCO_L : out  STD_LOGIC);
end contador;
architecture Behavioral_contador of contador is
signal contador : STD_LOGIC_VECTOR(3 downto 0);
begin
process (CLK,UD,LOAD_L,ENP_L)
    begin
    if (CLK'event AND LOAD_L='0') then
        Q <= A;
    elsif (CLK'event AND LOAD_L='1') then
        if (UD='0') then
            contador <= contador + 1;
        elsif (UD='1') then
            contador <= contador - 1;
        end if;
        if (contador="0000" and ENP_L='0') then
            RCO_L='0';
            if (UD='0') then
                contador="0001";
            elsif (UD='1') then
                contador="1111";
            end if;
        else
        RCO='1';
        end if;
    end if;
end process;
Q <= contador;
end Behavioral_contador;*

PD si ayuda esto son los resultados de la consola de error:

*ERROR:HDLCompiler:535 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 40: Index constraint prefix std_logic should be an array type
ERROR:HDLCompiler:854 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 34: Unit  ignored due to previous errors.
ERROR:HDLCompiler:374 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 44: Entity  is not yet compiled.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 46:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 53:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 56:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 58:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 57:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 55:  is not declared.
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 61: Syntax error near "=".
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 63: Syntax error near "=".
ERROR:HDLCompiler:837 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 63: Type  void does not match with a string literal
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 65: Syntax error near "=".
ERROR:HDLCompiler:837 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 65: Type  void does not match with a string literal
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 64:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 62:  is not declared.
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 68: Syntax error near "=".
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 60:  is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 54:  is not declared.*
0

2 Respuestas

Primero, su variable de conteo debe ser de tipo unsigned not std_logic_vector . Si desea que un vector represente un número, elija el tipo correcto .

En segundo lugar, solo tiene una sola línea clk'event . De hecho, la expresión en estos días es usar la función rising_edge (clk) en su lugar. No necesita todas esas señales en su lista de sensibilidad, solo el reloj.

Luego tenga toda su lógica de control dentro del if rising_edge (clk) luego .

Una vez que haya solucionado todos los errores de sintaxis (use el compilador o obtenga un editor como Sigasi , luego cree un banco de pruebas lo que creará el reloj y otras señales de entrada para que pueda ver si está funcionando. Para obtener crédito adicional, haga que el banco de pruebas realmente compruebe que las salidas hacen lo que usted desea, en lugar de mirar las formas de onda usted mismo, ¡eso se torna muy rápido!

Además, consejos para el futuro: si hace preguntas aquí, publique el código que es

  • sangría correctamente (de nuevo, use Sigasi, es gratis para código pequeño y simplemente hace el trabajo)
  • sin errores de sintaxis.

Es poco probable que las preguntas mal hechas obtengan muchas respuestas, ¡lo siento!

0
agregado

Most of them are syntax errors. For example Q should be std_logic_vector. Also when you need to write something at output, you mention like this: output <= input instead of RCO_L='0'; . Signal contador is of std_logic_vector and you can not increment/decrement 1 in std_logic_vector in this way. First you have to convert them to unsigned values, just mentioned here

0
agregado
Para obtener más información, consulte el Xilinx XST manual.
agregado el autor Digeek, fuente