es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

LUT con selección de VHDL 10^x

Tengo que escribir un código VHDL que calcule la función 10^x para valores enteros de x entre cero y nueve (incluyendo cero y nueve). La entidad debe tener una entrada de tipo entero sin signo de 4 bits (stdlogicvector) y una salida de tipo entero sin signo de 32 bits (stdlogicvector). Un ancho de 32 bits es suficiente para 10^9. Debo utilizar la lógica de la tabla de búsqueda (LUT) para la solución. Para hacer esto, debo usar la asignación de señal y la estructura with-select en el bloque de la arquitectura sin utilizar en absoluto el proceso. Utilizando with-select, determinaré con una asignación fija cuál será la salida (LUT) para cada valor de x.

Error al iniciar la síntesis:
Error de ancho en la asignación; el destino tiene 32 bits, la fuente tiene 1 bit

biblioteca IEEE;
utilizar IEEE.STD_LOGIC_1164.ALL;

entidad principal es
Puerto (
entrada : in std_logic_vector(3 downto 0);
salida: out std_logic_vector(31 downto 0)
);
fin principal;

arquitectura conductual de principal es

principio

con entrada seleccionar
salida <= “00000000000000000000000000000001” cuando “0000”, –10^0
“00000000000000000000000000001010” cuando “0001”, –10^1
“00000000000000000000000001100100” cuando “0010”, –10^2
“00000000000000000000001111101000” cuando “0011”, –10^3
“00000000000000000010011100010000” cuando “0100”, –10^4
“00000000000000011000011010100000” cuando “0101”, –10^5
“00000000000011110100001001000000” cuando “0110”, –10^6
“00000000100110001001011010000000” cuando “0111”, –10^7
“00000101111101011110000100000000” cuando “1000”, –10^8
“00111011100110101100101000000000” cuando “1001”, –10^9
“0” cuando otros;
fin conductual;

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece haber un error con el código que proporcionaste. El mensaje de error indica que hay una discrepancia de anchura en la asignación. Esto puede deberse a una discrepancia de tipo o a un tamaño incorrecto de la señal de salida.

    Suponiendo que la señal de entrada es un entero sin signo de 4 bits y la señal de salida es un entero sin signo de 32 bits, el código debe modificarse para reflejar estos tipos de datos. Además, el código debe utilizar un bucle para generar las entradas de la tabla de búsqueda (LUT) para cada valor de x de 0 a 9.

    Aquí tienes una versión actualizada del código que debería funcionar:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    entity main is
        Port (input: in std_logic_vector(3 downto 0);
              output: out std_logic_vector(31 downto 0));
    end main;
    
    architecture Behavioral of main is
        signal lut: std_logic_vector(31 downto 0);
    begin
        lut <= "00000000000000000000000000000001"; --10^0
        for i in 1 to 9 loop
            lut <= lut & (lut(lut'left) << 1); --multiplicar por 10
        end loop;
    
        with input select
            output <= lut(0 to 31) when "0000",
                      lut(0 to 31) when "0001",
                      lut(0 to 31) when "0010",
                      lut(0 to 31) when "0011",
                      lut(0 to 31) when "0100",
                      lut(0 to 31) when "0101",
                      lut(0 to 31) when "0110",
                      lut(0 to 31) when "0111",
                      lut(0 to 31) when "1000",
                      lut(0 to 31) when "1001",
                      "00000000000000000000000000000000" when others;
    end Behavioral;
    

    En este código, se utiliza una señal llamada lut para almacenar las entradas de la tabla de búsqueda (LUT). El bucle genera las entradas para cada valor de x multiplicando la entrada anterior por 10.

    La estructura with-select se utiliza para seleccionar la entrada adecuada de la LUT en función del valor de entrada de x. La señal lut se corta según el tamaño de la señal de salida.

    Este código debería ser sintetizable sin errores.

Comments are closed.