Разработайте модель VHDL функционального блока, называемого блоком расширения знака, используемого в некоторых процессорах. Ввод этого устройства - 4-битное двоичное число со знаком, а на выходе - 8-битное двоичное число со знаком. Единица сохраняет величину и знак числа.

Вот мой код, и он не работает. Я новичок. Пожалуйста, помогите и объясните. Большое спасибо.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity sign_extender is
    port
    (   
        a: in std_logic_vector (3 downto 0);
        q: out std_logic_vector (7 downto 0);
    );
end sign_extender;

architecture sign_extender_arch of sign_extender is
begin -- architecture
    q <= a;
end sign_extender_arch;
0
Marcus 4 Мар 2015 в 20:47

2 ответа

Лучший ответ
q <= std_logic_vector(resize(signed(a), q'length));

std_logic_vector не представляет собой целочисленное значение, а представляет собой массив std_logic, поэтому сначала вы делаете его signed, используя signed из ieee.numeric_std.signed.

Функция resize также определена в ieee.numeric_std для signed и unsigned, и она применяется к значению signed с желаемой длиной, задаваемой q'length, и он возвращает signed для аргумента signed и т. Д.

Наконец, значение signed преобразуется обратно в std_logic_vector, как требуется для выходного порта.

4
Morten Zilmer 4 Мар 2015 в 20:48

«Мортен Зилмер» представил хорошую идею. Другой способ - расширить его вручную без дополнительных функций, таких как следующий код:

q <= ( 7 downto 4 => a(3) ) & a;
2
Amir 4 Мар 2015 в 18:34