Error al simular el código vhdl para el contador de 4 bits en vivado 2015.2

0

Señor,

Cada vez que simulo mi código vhdl de 4 bits en Xilinx vivado 2015.2, aparece el siguiente mensaje de error.

  

ERROR: [VRFC 10-724] encontró '0' definiciones de operador "+", no se puede determinar la definición coincidente sobrecargada exacta para "+"

Mi código vhdl es

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity my_count is
Port ( clk : in STD_LOGIC;
       clr : in STD_LOGIC;
       y : out STD_LOGIC_VECTOR (3 downto 0));
end my_count;

architecture Behavioral of my_count is
begin
    process(clk,clr)
    variable temp: std_logic_vector(3 downto 0):="0000";
    begin
        if(clr='1') then
            temp := "0000";
        elsif(clk='1' and clk'event) then
            temp := temp + 1;
        end if;
        y <= temp;
    end process;
end Behavioral;

banco de pruebas es

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;

entity my_count_tb is
    --  Port ( );
end my_count_tb;

architecture Behavioral of my_count_tb is
component my_count
    port(clk,clr: in std_logic;
         y: out std_logic_vector(3 downto 0));
end component;

signal clr,clk: std_logic;
signal y: std_logic_vector(3 downto 0);
begin
    process
    begin
        clk <=not clk after 5ns;
    end process;
end Behavioral;

por favor, ayúdame a resolver este error

    
pregunta Varun

3 respuestas

4

Usa el sistema de tipos en lugar de combatirlo.

Cada vez que vea una conversión de tipo doble incómoda, especialmente a otro tipo y vuelva inmediatamente, como

temp := std_logic_vector(unsigned(temp) + 1);

que está combatiendo el sistema de tipos, y probablemente apunta a un error más o menos serio en el diseño.

En su lugar, piensa en esto:

Desea contar, por lo que sus datos son una forma de número, no solo una bolsa de bits.

¿Qué rango quieres contar? De su pregunta no queda claro, así que supongo que de 0 a 15, eliminando números negativos, que cubren los 4 bits de datos de salida.

Hay 2 opciones obvias:

variable temp: natural range 0 to 15 := 0; 
variable temp: unsigned(3 downto 0) := "0000"; 

Ya estás utilizando la biblioteca numeric_std correcta para esta última.

Ahora habrá un operador "+" adecuado visible.

Lo que falta hasta ahora es una conexión al puerto de salida y .

Si se ve obligado por estándares de codificación ridículos o un gran proyecto existente para mantener todos los puertos std_logic_vector , necesitará una conversión de tipo.

y <= std_logic_vector(temp); -- for unsigned temp
y <= std_logic_vector(to_unsigned(temp,y'range)); -- for natural temp

Si se le permite arreglar un diseño roto, considere lo que significa y en el contexto más amplio: si es un número sin signo, como una dirección de memoria, use el tipo correcto en la declaración del puerto, entonces el y <= temp; más simple Es el enfoque correcto.

    
respondido por el Brian Drummond
1

Vea aquí . @ A-Kieffer dice

  

En VHDL no puedes usar operadores aritméticos con std_logic_vector .

    
respondido por el Anonymous
0

Como se indica aquí .

"No puedes incrementar std_logic directamente, necesitas convertirlo a unsigned y el resultado vuelve a std_logic_vector usando el paquete numeric_std".

@apalopohapa también lo mencionó en su comentario:

"temp: = std_logic_vector (unsigned (temp) + 1);"

architecture Behavioral of my_count is

begin
    process(clk,clr)
    variable temp: std_logic_vector(3 downto 0) := "0000"; 
    begin
        if(clr='1') then
            temp := "0000";
        elsif(clk='1' and clk'event) then
            temp := std_logic_vector(unsigned(temp) + 1);
        end if;
        y <= temp;
    end process;
end Behavioral;
    
respondido por el Doodle

Lea otras preguntas en las etiquetas