У меня есть 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
любая помощь будет оценена
Я не ясно, на ошибки, которые вы имеете, вы можете быть более конкретным? Вы знаете, что этот код не синтезируется правильно? Кроме того, есть встроенная функция в пакете numeric_std, которая преобразует std_logic_vectors в целые числа для вас. Вам не нужно писать свою собственную функцию. – Russell
@ Russell: что делает его несинтезируемым? задержки не будут реализованы, просто игнорируются. –
Возможно, вы могли бы показать фактические сообщения об ошибках синтеза? VHDL не требует дозорных значений, единственное место, где у вас есть цикл for, находится в функции to_integer, и по умолчанию входы являются постоянными. – user1155120