Vhdl 错误:";表达式不是常数;带移位装置
我编写了下面的代码,以便对二进制数进行移位,我尝试为cyclonII-EP2C20F484C7设备编译代码,但出现了以下错误: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(
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;
终例;
其他的
resultTempresultTemp'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');