有谁知道为什么这个VHDL代码没有编译? (我正在使用modelsim)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.NUMERIC_STD.all;
Entity PartC IS
Generic (constant N: natural := 1);
Port
( A : IN std_logic_vector(15 downto 0);
S0,S1,Cin : IN std_logic;
F : OUT std_logic_vector(15 downto 0));
End Entity PartC;
Architecture CCC of PartC IS
Begin
F <= std_logic_vector(unsigned(A) srl N) when S1='0' And S0='0'
Elsif std_logic_vector(unsigned(A) ror N) when S1='0' And S0='1'
Elsif std_logic_vector(unsigned(A) ror Cin) when S1='1' And S0='0'
Elsif std_logic_vector(unsigned(A) sra N);
End CCC;
enter code here
这是16位ALU的一部分,它接受两个16位输入值A
和B
并提供16位输出F
。
答案 0 :(得分:2)
您似乎依赖于std_logic_arith包的Mentor版本,其中包括srl,ror,sra等,而Synopsys版本的软件包std_logic_arith则没有。
使用该软件包时有两个问题。首先出现语法错误,其中elsif
应该是else
s,其次没有定义一个&#39; ta ror
,其旋转距离为#std_logic(或std_ulogic) ,基本类型)。
解决这些问题:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- Mentor
entity partc_mentor is
generic (constant n: natural := 1);
port (
a: in std_logic_vector(15 downto 0);
s0, s1, cin: in std_logic;
f: out std_logic_vector(15 downto 0)
);
end entity partc_mentor;
architecture ccc of partc_mentor is
begin
f <= std_logic_vector(unsigned(a) srl n) when s1 = '0' and s0 = '0' else
std_logic_vector(unsigned(a) ror n) when s1 = '0' and s0 = '1' else
std_logic_vector(unsigned(a) ror conv_integer(unsigned'("") & cin))
when s1 = '1' and s0 = '0' else
std_logic_vector(unsigned(a) sra n);
end ccc;
然后您的代码进行分析。请注意,cin
通过连接空字符串而提升为无符号数组值。限定表达式用于区分连接运算符,否则空字符串的类型将不再明显。
这也可以使用IEEE numeric_std派生包完成。但是在2008年修订版之前,sra
被排除在包之外,它还引入了包numeric_std_unsigned以提供在Synopsys包std_logic_arith_unsigned中找到的功能,并在std_logic_vector值上提供无符号算术。 (导师没有提供类似的套餐)。
使用支持-2008版IEEE标准软件包的模拟器或综合分析工具(编译器)如下所示:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std_unsigned.all;
entity partc_ieee is
generic (constant n: natural := 1);
port (
a: in std_logic_vector(15 downto 0);
s0, s1, cin: in std_logic;
f: out std_logic_vector(15 downto 0)
);
end entity partc_ieee;
architecture ieee of partc_ieee is
begin
f <= a srl n when s1 = '0' and s0 = '0' else
a ror n when s1 = '0' and s0 = '1' else
a ror to_integer("" & cin) when s1 = '1' and s0 = '0' else
a sra n;
end architecture ieee;
此代码还分析并依赖于numeric_std_unsigned中定义的to_integer函数。如果没有其他连接操作符可以使用std_logic / std_ulogic值的正确参数显示,则不需要合格的表达式。