Простые знаковые арифметические решения для вашей задачи:
Для сигнала 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;