2016-03-15 3 views
1

Я делаю компонент, который принимает входные 32 бит и управляющий вход 7 бит. Что этот компонент делает то, что он смотрит на последние 2 бита S и'sra' не работает в VHDL

  • S = 00, это логический сдвиг влево на вх
  • S = 01, он делает логический сдвиг вправо на вх
  • S = 10, он делает арифметический сдвиг вправо на INP
  • S = 11, он делает повернуть право на INP

количество/число смен решает первые 5 битов S. Например, если S=0001001 , тогда вход должен быть логически shifte d справа на 2 места. Ниже мой код. Проблема приходит в «SRA», где следующая ошибка показывает вверх:

нашел определения «0» оператора «SRA», не может определить точный перегруженное определение соответствия для «SRA» Моего кода:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

entity barrelshifter is 
port(
clk : in std_logic; 
    inp : in unsigned (31 downto 0):= (others => '0'); 
    s : in unsigned (6 downto 0); 
    outp : out unsigned (31 downto 0) 
    ); 
end barrelshifter; 

architecture Behavioral of barrelshifter is 
    signal samt : unsigned (4 downto 0); 
    signal stype : unsigned (1 downto 0); 
    signal inp1 : unsigned (31 downto 0); 
begin 
    samt <= s(6 downto 2); 
    stype <= s(1 downto 0); 
    inp1 <= inp; 

    process(clk) 
    begin 
    if stype = "00" then 
     outp <= inp sll to_integer(samt); 
    end if; 
    if stype = "01" then 
     outp <= inp srl to_integer(samt); 
    end if; 
    if stype = "10" then 
     outp <= inp sra to_integer(samt); 
    end if; 
    if stype = "11" then 
     outp <= inp ror to_integer(samt); 
    end if; 
    end process; 
end Behavioral; 
+0

sll работает нормально. Тем не менее, если я помещаю этот код, он показывает синтаксическую ошибку. –

ответ

4

Ваш код может использоваться как «как есть» в VHDL.

sra не определен в пакете IEEE numeric_std до -2008. Ваш код будет анализировать без ошибок с внедрением в -2008 совместимого VHDL

В противном случае для предыдущей версии совместимых реализаций:

outp <= unsigned (to_stdlogicvector(to_bitvector(std_logic_vector(inp)) sra to_integer(samt))); 

Поскольку sra предопределен для типа bit_vector и samt это тип без знака (с эквивалентным двоичным значением, что имеет естественный диапазон).

Вам также не хватает синтезируемого RTL описания последовательной логики - немеченого процесса, имеющего clk в его списке чувствительности.

Изменение что и показывая некоторые исправления в предварительной реализации -2008 совместимого VHDL:

library ieee; 
use ieee.std_logic_1164.all; 

use ieee.numeric_std.all; 

entity barrelshifter is 
    port (
     clk: in std_logic; 
     inp: in unsigned (31 downto 0):= (others => '0'); 
     s: in unsigned (6 downto 0); 
     outp: out unsigned (31 downto 0) 
    ); 
end entity barrelshifter; 

architecture behavioral of barrelshifter is 
    signal samt: unsigned (4 downto 0); 
    signal stype: unsigned (1 downto 0); 
    signal inp1: unsigned (31 downto 0); 
begin 
    samt <= s(6 downto 2); 
    stype <= s(1 downto 0); 
    inp1 <= inp; 

UNLABELLED:  
    process(clk) 
    begin 
     if rising_edge(clk) then 
      if stype = "00" then 
       outp <= inp sll to_integer(samt); 
      end if; 
      if stype = "01" then 
       outp <= inp srl to_integer(samt); 
      end if; 
      if stype = "10" then 
       outp <= unsigned (to_stdlogicvector(to_bitvector(std_logic_vector(inp)) sra to_integer(samt))); 
      end if; 
      if stype = "11" then 
       outp <= inp ror to_integer(samt); 
      end if; 
     end if; 
    end process; 
end architecture behavioral; 

Поскольку если заявления с условиями, зависящих от stype являются взаимоисключающими, если вы могли бы заменить внутреннюю отчетность с сазом или один оператор if с альтернативными условиями. Это позволило бы условия после первого совпадающего значения stype.

Это будет выглядеть следующим образом:

architecture with_elsif of barrelshifter is 
    signal samt: unsigned (4 downto 0); 
    signal stype: unsigned (1 downto 0); 
    signal inp1: unsigned (31 downto 0); 
begin 
    samt <= s(6 downto 2); 
    stype <= s(1 downto 0); 
    inp1 <= inp; 

UNLABELLED:  
    process(clk) 
    begin 
     if rising_edge(clk) then 
      if stype = "00" then 
       outp <= inp sll to_integer(samt); 
      -- end if; 
      elsif stype = "01" then 
       outp <= inp srl to_integer(samt); 
      -- end if; 
      elsif stype = "10" then 
       outp <= unsigned (to_stdlogicvector(to_bitvector(std_logic_vector(inp)) sra to_integer(samt))); 
       -- end if; 
      elsif stype = "11" then 
       outp <= inp ror to_integer(samt); 
      end if; 
     end if; 
    end process; 
end architecture with_elsif; 

или это:

architecture with_case of barrelshifter is 
    signal samt: unsigned (4 downto 0); 
    signal stype: unsigned (1 downto 0); 
    signal inp1: unsigned (31 downto 0); 
begin 
    samt <= s(6 downto 2); 
    stype <= s(1 downto 0); 
    inp1 <= inp; 

UNLABELLED:  
    process(clk) 
    begin 
     if rising_edge(clk) then 
      case stype is 
       when "00" => 
        outp <= inp sll to_integer(samt); 
       when "01" => 
        outp <= inp srl to_integer(samt); 
       when "10" => 
        outp <= unsigned (to_stdlogicvector(to_bitvector(std_logic_vector(inp)) sra to_integer(samt))); 
       when "11" => 
        outp <= inp ror to_integer(samt); 
       when others => 
      end case; 
     end if; 
    end process; 
end architecture with_case; 

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

В общем, вы должны использовать shift_right, shift_left, поворачивать вправо и поворачивать левые функции, определенные в пакете numeric_std, в виде заметок PlayDough.

4

Во-первых, я рекомендую вам использовать shift_left(), shift_right(), rotate_left() и rotate_right() функции вместо. Известны проблемы и проблемы переносимости с операторами сдвига между VHDL'87 и VHDL'08 (см. here).

Оператор «sra» не определен для всех типов в numeric_std. Вы должны сделать некоторые кастинга, чтобы получить то, что вы хотите. Но лучше использовать функции shift_left и shift_right и быть явным.

Обратите внимание, что значение sra такое же, как srl для ввода unsigned. Почему даже определить операцию sra в этом случае? Возможно, вам нужны подписанные входные данные?

Если входы signed, могут выбирать между srl и sra выполнив:

outp <= signed(shift_right(unsigned(inp), to_integer(samt))); -- srl 
outp <= shift_right(inp, to_integer(samt)); --sra 

(Edit:. Вы также отсутствует свой rising_edge() чек в вашем процессе, который делает сдвиг)

(Редактирование 2: вам, вероятно, лучше использовать оператор case для выбора операции переключения. Цепочка if, в то время как взаимоисключающая, не является типичным стилем кодирования. Либо используйте if/elsif/else или case.)

+0

Спасибо, что указали, что sra такой же, как srl для ввода без знака. Но на данный момент, если я буду рассматривать unsigned как подписанный, то какое кастинг я могу попробовать? –

+0

Как 'signed', так и' unsigned' связаны как массивы 'std_logic' (такие же, как' std_logic_vector'), поэтому они могут быть переданы друг другу. Итак, допустим, у вас есть «подписанные» входы. Я отредактировал ответ, чтобы показать пример. – PlayDough

Смежные вопросы