Умножение VHDL для std_logic_vector - PullRequest
       45

Умножение VHDL для std_logic_vector

0 голосов
/ 28 октября 2018

При моделировании я получаю ошибку времени выполнения, поэтому я пытаюсь запустить анализ RTL в Vivado, чтобы посмотреть, можно ли хотя бы создать схему компонента.Мой код следующий:

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

entity multiplicator_test is
    generic(
            WORD_SIZE: natural := 8;
            EXP_SIZE: natural := 3
        );
        port(
            input_1: in std_logic_vector(WORD_SIZE-1 downto 0);
            input_2: in std_logic_vector(WORD_SIZE-1 downto 0);
            result: out std_logic_vector(WORD_SIZE-1 downto 0)
        );
end entity multiplicator_test;

architecture multiplicator_test_arch of multiplicator_test is
    constant SIGNIFICAND_SIZE: natural := WORD_SIZE - EXP_SIZE - 1;

    signal significand: std_logic_vector(SIGNIFICAND_SIZE-1 downto 0) := (others => '0');
    signal exponent: std_logic_vector(EXP_SIZE-1 downto 0) := (others => '0');
    signal sign: std_logic := '0';
    signal aux: std_logic_vector((2*SIGNIFICAND_SIZE)-1 downto 0) := (others => '0');
begin
        aux <= std_logic_vector(signed(input_1(SIGNIFICAND_SIZE-1 downto 0))*signed(input_2(SIGNIFICAND_SIZE - 1 downto 0)));
        significand <= aux(SIGNIFICAND_SIZE - 1 downto 0);
        exponent <= std_logic_vector(unsigned(input_1(WORD_SIZE-2 downto WORD_SIZE-EXP_SIZE-2))+unsigned(input_2(WORD_SIZE-2 downto WORD_SIZE-EXP_SIZE-2)));
        sign <= input_1(WORD_SIZE-1) or input_2(WORD_SIZE-1);
        result <= sign & exponent & significand;
end architecture multiplicator_test_arch;

При запуске анализа я получаю:

ОШИБКА: [Synth 8-690] несоответствие ширины в назначении;цель имеет 3 бита, источник имеет 4 бита [(...) / multiplicador.vhd: 27]

Строка с ошибкой 27:

aux <= std_logic_vector(signed(input_1(SIGNIFICAND_SIZE-1 downto 0))*signed(input_2(SIGNIFICAND_SIZE - 1 downto 0)));

Видимо,target (aux) составляет 3 бита, но на самом деле это должно быть 8.

1 Ответ

0 голосов
/ 28 октября 2018

Отправленная вами строка не является строкой 27, строка 27 выглядит следующим образом:

exponent <= std_logic_vector(unsigned(input_1(WORD_SIZE-2 downto WORD_SIZE-EXP_SIZE-2))+unsigned(input_2(WORD_SIZE-2 downto WORD_SIZE-EXP_SIZE-2)));

Как видите, показатель степени имеет только 3 бита:

Exponent

Для добавления без знака потребуется дополнительный бит для выполнения.По сути, есть проблема, которую вы могли бы переполнить при умножении.

Один из способов решения этой проблемы - сделать ваш результат и показатель на один бит шире:

result: out std_logic_vector(WORD_SIZE downto 0)
signal exponent: std_logic_vector(EXP_SIZE downto 0) := (others => '0');

Выход: Schematic

...