2014-10-24 2 views
2

У меня есть 32-битный баррель с использованием архитектуры поведения. Теперь мне нужно преобразовать его в n-разрядный сдвиг. Проблема, с которой я сталкиваюсь, заключается в том, что существует некоторый вид ограничения для цикла for, который я должен поместить константу в качестве контрольного значения.VHDL n-bit barrel shifter

Ниже мой код

library IEEE; 
use IEEE.std_logic_1164.all; 

Entity bshift is -- barrel shifter 
     port (left : in std_logic; -- '1' for left, '0' for right 
      logical : in std_logic; -- '1' for logical, '0' for arithmetic 
      shift : in std_logic_vector(4 downto 0); -- shift count 
      input : in std_logic_vector (31 downto 0); 
      output : out std_logic_vector (31 downto 0)); 
end entity bshift; 


architecture behavior of bshift is 
    function to_integer(sig : std_logic_vector) return integer is 
    variable num : integer := 0; -- descending sig as integer 
    begin 
    for i in sig'range loop 
     if sig(i)='1' then 
     num := num*2+1; 
     else 
     num := num*2; 
     end if; 
    end loop; -- i 
    return num; 
    end function to_integer; 

begin -- behavior 
    shft32: process(left, logical, input, shift) 
      variable shft : integer; 
      variable out_right_arithmetic : std_logic_vector(31 downto 0); 
      variable out_right_logical : std_logic_vector(31 downto 0); 
      variable out_left_logical  : std_logic_vector(31 downto 0); 
      begin 
      shft := to_integer(shift); 
      if logical = '0' then 
       out_right_arithmetic := (31 downto 32-shft => input(31)) & 
             input(31 downto shft); 
       output <= out_right_arithmetic after 250 ps; 
      else 
       if left = '1' then 
       out_left_logical := input(31-shft downto 0) & 
            (shft-1 downto 0 => '0'); 
       output <= out_left_logical after 250 ps; 
       else 
       out_right_logical := (31 downto 32-shft => '0') & 
            input(31 downto shft); 
       output <= out_right_logical after 250 ps; 
       end if; 
      end if; 
      end process shft32; 
end architecture behavior; -- of bshift 

любая помощь будет оценена

+0

Я не ясно, на ошибки, которые вы имеете, вы можете быть более конкретным? Вы знаете, что этот код не синтезируется правильно? Кроме того, есть встроенная функция в пакете numeric_std, которая преобразует std_logic_vectors в целые числа для вас. Вам не нужно писать свою собственную функцию. – Russell

+0

@ Russell: что делает его несинтезируемым? задержки не будут реализованы, просто игнорируются. –

+0

Возможно, вы могли бы показать фактические сообщения об ошибках синтеза? VHDL не требует дозорных значений, единственное место, где у вас есть цикл for, находится в функции to_integer, и по умолчанию входы являются постоянными. – user1155120

ответ

4

Ваш код не является реализация бочонок оборотень, поскольку смещение ствола является Мультиплексор дерево. enter image description here

Если у вас есть 32 битный модуль с BarrelShifter, вам потребуется 5 бит Shift вход, в котором каждый бит положение i позволяет 2^я смещаться операцию.

Так, например, shift = 5d -> 00101b позволяет переключать мультиплексор на этапе 1 на 1 бит и мультиплексор на этапе 3 сдвигать 4 бита. Все остальные ступени мультиплексора должны пройти через (shift(i) = 0).

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

  • арифметика и логика отличается только в сдвиговом в значении
  • сдвиг вправо может быть сделано путем преобразования => shiftright = обратное (shiftleft (обратный (вход), п)

реализация с открытым исходным кодом можно найти здесь:
https://github.com/VLSI-EDA/PoC/blob/master/src/arith/arith_shifter_barrel.vhdl