有谁知道为什么这个VHDL代码没有编译?

时间:2017-09-18 16:08:01

标签: vhdl modelsim

有谁知道为什么这个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位输入值AB 并提供16位输出F

1 个答案:

答案 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值的正确参数显示,则不需要合格的表达式。