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

有人知道为什么这个VHDL代码没有编译吗?,vhdl,modelsim,Vhdl,Modelsim,有人知道为什么这个VHDL代码没有编译吗?(我正在使用modelsim) IEEE库; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.STD_LOGIC_ARITH.ALL; 使用IEEE.STD_LOGIC_UNSIGNED.ALL; 使用ieee.NUMERIC_STD.all; 实体PartC是 通用(常数N:自然:=1); 港口 (A:标准逻辑向量(15到0); S0、S1、Cin:标准逻辑中; F:输出标准逻辑向量(15到0); 最终实体C部分; PartC的架构

有人知道为什么这个VHDL代码没有编译吗?(我正在使用modelsim)

IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
使用ieee.NUMERIC_STD.all;
实体PartC是
通用(常数N:自然:=1);
港口
(A:标准逻辑向量(15到0);
S0、S1、Cin:标准逻辑中;
F:输出标准逻辑向量(15到0);
最终实体C部分;
PartC的架构CCC是
开始

F您似乎依赖于软件包标准逻辑算法的指导版本,其中包括srl、ror、sra等,而软件包标准逻辑算法的Synopsys版本则没有

使用该软件包时有两个问题。首先是语法错误,
elsif
s应该是
else
s,其次是没有定义旋转距离的
ror
,旋转距离是标准逻辑(或标准逻辑,基本类型)

解决这些问题:

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;

此代码还分析并依赖于在numeric_std_unsigned中定义的to_integer函数。由于正确的参数是std_logic/std_ulogic值,没有其他连接运算符可见,因此不需要限定表达式。

您似乎依赖于包std_logic_arith的Mentor版本,其中包括srl、ror、sra等,而包std_logic_arith的Synopsys版本则不需要

使用该软件包时有两个问题。首先是语法错误,
elsif
s应该是
else
s,其次是没有定义旋转距离的
ror
,旋转距离是标准逻辑(或标准逻辑,基本类型)

解决这些问题:

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;

此代码还分析并依赖于在numeric_std_unsigned中定义的to_integer函数。如果右参数为std_逻辑/std_逻辑值,没有其他连接运算符可见,则不需要限定表达式。

错误消息是什么?(vcom-1078)标识符“unsigned”不直接可见。无法解析中缀表达式的表达式类型。**错误:(vcom-1583)从“未知”到“ieee.std_logic_1164.std_logic_VECTOR”(操作数类型未知)的非法类型转换。非标准库太多,隐藏了无符号的数字。删除标准逻辑算术和标准逻辑无符号。(另外,Else和Elsif之间存在一些混淆)错误消息是什么?(vcom-1078)标识符“unsigned”不直接可见。无法解析中缀表达式的表达式类型。**错误:(vcom-1583)从“未知”到“ieee.std_logic_1164.std_logic_VECTOR”(操作数类型未知)的非法类型转换。非标准库太多,隐藏了无符号的数字。删除标准逻辑算术和标准逻辑无符号。(另外,Else和Elsif之间存在一些混淆)
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;