vhdl - convierte una señal a entero

0

Miré a mi alrededor en SE, pero no pude encontrar nada que funcionara correctamente para mí.

Estoy buscando una forma de convertir un signal_vector de 4 bits en un entero. Sin embargo también hago cálculos sobre señales. Esto significa que necesito la biblioteca llamada

use IEEE.std_logic_arith.all

Esto es (la versión condensada de) lo que tengo hasta ahora:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
USE ieee.numeric_std.ALL;
use IEEE.std_logic_unsigned.all;

    signal counter: std_logic_vector(3 downto 0);

    counter<=counter + "0001";
                ...

       if ((to_integer(counter)) < (to_integer("0100"))) then

      -- do something

      end if;

esto me da el siguiente error: el identificador "unsigned" no está visible directamente.

    

1 respuesta

4

No utilice la biblioteca ieee.std_logic_arith . Está desactualizado y crea problemas al combinarlo con otros.

Puedes convertir tu señal de la siguiente manera:

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

signal counter: std_logic_vector(4 downto 0);

counter<=std_logic_vector(unsigned(counter) + 1);
            ...

   if (unsigned(counter) < to_unsigned(4, counter'length)) then

  -- do something

  end if;

Si planea usar una señal como un número la mayor parte del tiempo, intente usar el tipo sin signo o firmado, si es posible. Siempre puede convertirlo en un std_logic_vector si es necesario.

Fuente: enlace

EDITAR:

Hice una muestra de código completa que compila y simula en Vivado (también debería funcionar en modelsim):

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


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

architecture Behavioral of test is
   signal counter: std_logic_vector(4 downto 0) := (others => '0');
   signal bigger: std_logic;
   signal clk: std_logic;
begin

make_clk: process
begin
    clk <= '0';
    wait for 2 ns;
    clk <= '1';
    wait for 2 ns;
end process;

test: process(clk)
begin
    if rising_edge(clk) then
        counter<=std_logic_vector(unsigned(counter) + 1);
        if (unsigned(counter) < to_unsigned(4, counter'length)) then
            --do something
            bigger <= '0';
        else
            bigger <= '1';
        end if;
    end if;
end process test;
end Behavioral;
    
respondido por el Botnic

Lea otras preguntas en las etiquetas