Ошибка: «выражение не является постоянным» с единицей сдвига - PullRequest
0 голосов
/ 15 апреля 2019

Я написал код ниже, чтобы сдвинуть двоичное число, я попытался скомпилировать его для устройства cyclonII - EP2C20F484C7, но получил эту ошибку:

Error (10779): VHDL error at shiftNbits.vhd(30): expression is not constant

Error (10658): VHDL Operator error at shiftNbits.vhd(30): failed to evaluate call to operator ""&""

VHD (30) это строка:

resultTemp  <= A( N-1-numberOfShifts downto 0) & (numberOfShifts-1 downto 0 => '0');

Я видел, что некоторые люди спрашивали об этом, и они получили ответ, что компилятору не нравится идея, что N-1-numberOfShifts или numberOfShifts-1 отрицательны. Дело в том, что я гарантирую, что numberOfShifts

if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');

И я даже пытался добавить диапазон к numberOfShifts определениям:

variable numberOfShifts: integer range 1 to N-1;

Чтобы убедиться, что numberOfShifts-1 не является отрицательным.

Кстати, когда я надеваю A(0 downto 0), я получаю фактически один битовый вектор, Как я могу определить NULL вектор, если A( -1 downto 0) не допустимо?

library ieee;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
entity shiftNbits is
  generic(N: integer := 8);
  port (
    typeOfShift :    in std_logic_vector (1 downto 0);
    enable : in std_logic;
    A :      in std_logic_vector(N-1 downto 0);
    B :      in std_logic_vector (N-1 downto 0);
    result : out std_logic_vector(N-1 downto 0)
    );
end shiftNbits;

architecture shiftNbitsGate of shiftNbits is
    signal resultTemp: std_logic_vector(N-1 downto 0);
    begin
        process (typeOfShift, enable, A, B)
        variable numberOfShifts: integer;
        begin
        numberOfShifts:=  to_integer(unsigned(B)); 
        if enable= '1' then
            case typeOfShift is
                when "00" => --RLA
                    if  numberOfShifts>=N then
                        resultTemp  <= (N-1 downto 0 => '0');
                    else
                        resultTemp  <= A( N-1-numberOfShifts downto 0) & (numberOfShifts-1 downto 0 => '0');
                    end if;
                when "01" => --RLC
                    numberOfShifts := numberOfShifts mod N;
                    resultTemp <=  A( N-1-numberOfShifts downto 0) & A( N-1 downto N-numberOfShifts);
                when "10" => --RRA
                    if  numberOfShifts>=N then
                        resultTemp  <= (N-1 downto 0 => A(N-1));
                    else    
                        resultTemp <=  (N-1 downto N-numberOfShifts => A(N-1)) & A( N-1 downto numberOfShifts);
                    end if;                             
                when "11" => --RRC
                    numberOfShifts := numberOfShifts mod N;
                    resultTemp  <=  A( numberOfShifts-1 downto 0) & A( N-1 downto numberOfShifts);
                when others => null;
            end case;
        else
        resultTemp <= A; --what we should insert here?
        end if;
        end process;
        result <= resultTemp;
    end shiftNbitsGate;

1 Ответ

1 голос
/ 15 апреля 2019

resultTemp <= A( N-1-numberOfShifts downto 0) & (numberOfShifts-1 downto 0 => '0'); не может быть реализовано в одной «строке» (один набор вентилей / одно логическое уравнение) в аппаратных средствах, поскольку это может соответствовать многим различным случаям (по одному на количество смен).
В VHDLвам необходимо расширить все эти возможности с помощью if then else или выбора регистра.
Если бы значение сдвига было постоянным, код действительно мог быть синтезирован, отсюда и сообщение об ошибке!

...