сдвиг влево вектора комплемента два VHDL - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь решить некоторые упражнения, мне нужно сдвинуть 8-битный вектор с именем A в 2A (A + A).

мое решение для этого: (A(7) and '1') & A(6 downto 0) & '0';

после этого я сделал два дополнения A таким образом:

entity complementare is
    port(a: in std_logic_vector(7 downto 0);
         b: out std_logic_vector(7 downto 0));
end complementare;

architecture C of complementare is
    signal mask, temp: std_logic_vector(7 downto 0);
    component ripplecarry8bit is
        port(a,b: std_logic_vector(7 downto 0);
             cin: in std_logic;
             cout: out std_logic;
             s: out std_logic_vector(7 downto 0));
    end component;
begin
    mask<="11111111";
    temp<=a nand mask;
    rc: ripplecarry8bit port map(temp, "00000001", '0', cout, b);
end C; 
--if you need I post ripplecarry code but consider it as a generic adder

Чтобы получить -2A (-A-A) Я думал сделать это:

signal compA: std_logic_vector(7 downto 0);
compA: complementar port map(A, compA);

--shifting
(compA(7) and '1') & compA(6 downto 0) & '0'; -- -A

Теперь, мое главное сомнениепримерно -A, после использования комплемента и после получения compA, я должен расширить 8-битный вектор в 9-битный вектор (потому что мой вывод должен быть 9-битным вектором), я думал сделать это, но у меня есть сомнения:

'1' & compA; --or should I just append compA to a '0' value?

1 Ответ

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

Простые знаковые арифметические решения для вашей задачи:


Для сигнала A, представляющего собой std_logic_vector размера C_SIZEOF_A

signal A : std_logic_vector(C_SIZEOF_A-1 downto 0);

Чтобы получить сигнал, равный -A (такого же размера):

Дополните значение сигнала и добавьте единицу к этому результату:

signal minus_A : std_logic_vector(C_SIZEOF_A-1 downto 0);

minus_A <= (not A) + 1; -- Warning here !!!

Предупреждение: оператор '+' не определен для std_logic_vector.Вы делаете дополнение с решением, которое вы предпочитаете.Я намеренно не хочу давать здесь решение, потому что самое простое - использовать сигналы signed, но вы сказали, что не можете.


Чтобы умножить сигнал на 2 (со знаком или без знака)

Добавить нулевой бит как LSB:

signal 2A : std_logic_vector(C_SIZEOF_A downto 0);

2A <= A & '0';

Для расширения сигнала на 1 бит (со знаком):

MSB является знаковым битом.Расширить только этот бит:

signal A_extended : std_logic_vector(C_SIZEOF_A downto 0);

A_extended <= A(C_SIZEOF_A-1) & A;

Расширить сигнал на 1 бит (без знака):

Здесь нет знакового битапросто добавьте «0»:

signal A_extended : std_logic_vector(C_SIZEOF_A downto 0);

A_extended <= '0' & A;
...