Vhdl 错误:";表达式不是常数;带移位装置

Vhdl 错误:";表达式不是常数;带移位装置,vhdl,Vhdl,我编写了下面的代码,以便对二进制数进行移位,我尝试为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(

我编写了下面的代码,以便对二进制数进行移位,我尝试为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');
我甚至尝试将范围添加到
numberOfShifts
定义中:

if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
variable numberOfShifts: integer range 1 to N-1;
以确保
numberOfShifts-1
不是负值

if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
顺便问一下,当我使用
A(0到0)
时,我实际上得到了一位向量,如果
A(-1到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;
ieee库;
使用ieee.numeric_std.all;
使用ieee.std_logic_1164.all;
实体移位位为
泛型(N:整数=8);
港口(
移位类型:在标准逻辑向量中(1下降到0);
启用:在std_逻辑中;
A:在标准逻辑向量中(N-1向下至0);
B:标准逻辑向量(N-1到0);
结果:输出标准逻辑向量(N-1到0)
);
端位移位;
体系结构shiftNbits shiftNbits的状态为
信号结果temp:标准逻辑向量(N-1到0);
开始
过程(换档、启用、A、B类型)
可变移位数:整数;
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
开始 numberOfShifts:=到_整数(无符号(B));
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
如果enable='1',则 变速箱类型为 当“00”=>--RLA 如果NumberOfShift>=N,则
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
resultTemp“0”); 其他的 resultTemp“0”); 如果结束; 当“01”=>--RLC numberOfShifts:=numberOfShifts模块N;
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
resultTemp——RRA 如果NumberOfShift>=N,则
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
结果表A(N-1)); 其他的 结果图A(N-1)和图A(N-1向下至移位数);
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
如果结束; 当“11”=>--RRC numberOfShifts:=numberOfShifts模块N;
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');
resultTemp-null; 终例; 其他的 resultTemp
resultTemp'0')
不能在硬件的一条“线”(一组门/一个逻辑方程)中实现,因为它可能对应于许多不同的情况(每移位一次)。
在VHDL中,您需要使用if-then-else或case-select扩展所有这些可能性。

如果移位值为常量,则代码确实可以合成,因此会显示错误消息

@user1155120我修复了语法错误(错误就在这里)。我不明白代码遗漏了什么?如果这意味着我正在使用的软件包,那么我添加它。不允许使用范围内的变量进行切片?我能做些什么呢?关于你说的最后一件事:我不明白缺少什么前缀?“'(ResultTemp“0”);”正在创建大小为N-1的向量。是。由于格式问题,我误读了你的代码。聚合中的范围必须是静态的。请参阅IEEE Std 1076-2008 9.3.3.3数组聚合“允许数组聚合的命名关联具有非本地静态的选项,…,前提是该聚合包含单个元素关联且该元素关联具有单个选项。”这里就是这种情况,它是合法的VHDL。这里的合成是不可接受的。有关您的无关问题,请参阅IEEE Std 1076-2008 5.3.2.2索引约束和离散范围“如果任何离散范围定义了空范围,则任何受约束的数组都是空数组,没有元素。”和5.2标量类型5.2.1“范围指定标量类型值的子集。如果指定的子集为空,则称范围为空范围。L到R的范围称为上升范围;如果L>R,则该范围为空范围。从L到R的范围称为下降范围;如果L将赋值语句括起来)。您可以搜索“桶形移位器”,包括页面
if  numberOfShifts>=N then
    resultTemp  <= (N-1 downto 0 => '0');