Сдвиг вправо и сдвиг влево (SLL / SRL) - PullRequest
2 голосов
/ 22 июня 2011

Итак, я разрабатываю ALU для архитектуры MIPS и пытаюсь сделать сдвиг влево и вправо, чтобы ALU мог сдвигать любое количество битов.

Идея, которая у меня была, заключается в том,преобразовать значение сдвига в целое число и выбрать часть записи, которая будет в результате (целое число хранится в X), но Quartus не принимает значение переменной, только константы.

ЧтоМогу ли я сделать это?(Случаи в строках "WHEN" 1000 "=> ..." и "WHEN" 1001 "=> ...")

Спасибо.

PROCESS ( ALU_ctl, Ainput, Binput, X )
BEGIN
                -- Select ALU operation
    --ALU_output_mux <= X"00000000"; --padrao   
CASE ALU_ctl IS
    WHEN "1000" =>  ALU_output_mux(31 DOWNTO X) <= (Ainput( 31-X DOWNTO 0 ));
    WHEN "1001" =>  ALU_output_mux(31-X DOWNTO 0) <= (Ainput( 31 DOWNTO X ));
    WHEN OTHERS =>  ALU_output_mux  <= X"00000000";
END CASE;
END PROCESS;

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Если Quartus это не нравится, у вас есть два варианта:

  1. Напишите это так, как это делает Quartus - вы пытаетесь сделать вывод о бочкообразном, так что вы могли бы написать один от рукиа затем создать экземпляр этого.Потенциально дорого по времени
  2. Получите другой синтезатор, который его примет.Потенциально дорого в деньгах.
0 голосов
/ 12 июля 2011

Вы можете обойти это, используя generate или for для создания каждого уровня сдвига / поворота, или вы можете использовать стандартные функции ({shift, rotate} _ {left, right} ) для перемещения и вращения.

0 голосов
/ 22 июня 2011

У меня также были проблемы с этим в Quartus, хотя у вашего кода также есть некоторые неявные защелки (вы не назначаете все биты вывода в двух случаях смены).

Обходное решение, которое я использую, - определить промежуточный массив со всеми возможными результатами, а затем выбрать один из этих результатов, используя ваш селектор. В вашем случае что-то вроде следующего:

subtype DWORD_T         is std_logic_vector( 31 downto 0);
type    DWORD_A         is array (natural range <>) of DWORD_T;
signal  shift_L         : DWORD_A(31 downto 0);
signal  shift_R         : DWORD_A(31 downto 0);
signal  zero            : DWORD_T;

...

zero <= (others=>'0');

process (Ainput)
begin    
    for index in Ainput'range loop
        shift_L(index) <= Ainput(31 - index downto 0) & zero(index - 1 downto 0);
        shift_R(index) <= zero(index - 1 downto 0) & Ainput(31 downto index);
    end loop;
end process;

ALR_output_mux <= shift_L(to_integer(X)) when ALU_ctl="1000", 
                  shift_R(to_integer(X)) when ALU_ctl="1001",
                  (others=>'0') when others;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...