двоичный комплемент VHDL - PullRequest
0 голосов
/ 16 мая 2018

Я должен передать двоичное число от A до -A в VHDL.У меня есть несколько вопросов о двоичной записи.Например, если у меня есть A(8 bit) = 5, в двоичном 0000 0101.Из онлайн-источников я понял, что для перевода его в отрицательную форму дополнения до двух мне нужно инвертировать все биты, добавив 1 в конце:

0000 0101 --> 1111 1010 + 0000 0001 = 1111 1011, и это означает -A=-5;

MyТеперь сомнения в этой окончательной двоичной форме, которая может представлять -5 и 251, как я могу распознать, если это -5 или 251?

Кстати, этот метод не так простбыть описанным в VHDL.Вы знаете, есть ли какой-нибудь более простой метод?

1 Ответ

0 голосов
/ 17 мая 2018

Интуитивно понятно, что я рассуждаю так: вы используете дополнение до двух, представляющее собой числовое представление со знаком, поэтому существуют отрицательные значения. Если существуют отрицательные значения, вам нужен бит знака. Это оставит 7-битную величину: следовательно, вы можете представить значение только между -128 и 127. Значение 251 не находится в этом диапазоне: его нельзя представить с помощью 8-битной двоичной нотации дополнения. Таким образом, допустимо только -5.

Самый простой способ реализовать инверсию знака дополнения до двух в VHDL - использовать пакет numeric_bit.

library ieee;
entity bit_inv is
    generic(width : positive);
    port(
        A     : in  bit_vector(width-1 downto 0);
        A_inv : out bit_vector(width-1 downto 0));
end entity;

architecture rtl of bit_inv is
    use ieee.numeric_bit.all;
begin
    A_inv <= bit_vector(-signed(A));
end architecture;

entity bit_inv_tb is end entity;

library ieee;
architecture beh of bit_inv_tb is
    use ieee.numeric_bit.all;
    constant width : positive := 8;
    signal A, A_inv : bit_vector(width-1 downto 0);
begin
    DUT : entity work.bit_inv
        generic map(width => width)
        port map(A=>A, A_inv =>A_inv);

    test: process begin
        A <= bit_vector(to_signed(5,width));
        wait for 1 ns;
        assert to_integer(signed(A_inv)) = -5 report "A_inv is not equal to -5" severity failure;
        wait;
    end process;
end architecture;
...