【问题标题】:Does anyone know why this VHDL code is not compiling?有谁知道为什么这个 VHDL 代码没有编译?
【发布时间】:2017-09-18 16:08:00
【问题描述】:

有谁知道为什么这个 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

【问题讨论】:

  • 错误信息是什么?
  • (vcom-1078) 标识符“无符号”不直接可见。无法解析中缀表达式的表达式类型。 ** 错误:(vcom-1583) 从“未知”到“ieee.std_logic_1164.STD_LOGIC_VECTOR”的非法类型转换(操作数类型未知)。
  • 非标准库太多,隐藏 numeric_std.unsigned。删除 std_logic_arith 和 std_logic_unsigned。 (另外,Else 和 Elsif 之间有些混淆)

标签: vhdl modelsim


【解决方案1】:

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

使用该软件包时有两个问题。首先有一个语法错误,其中elsifs 应该是elses,其次没有定义一个旋转距离为 std_logic(或 std_ulogic,基本类型)的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;

然后您的代码进行分析。请注意,cin 通过连接空字符串被提升为无符号数组值。限定表达式用于区分连接运算符,否则空字符串的类型不会很明显。

这也可以使用 IEEE numeric_std 派生包来完成。然而,sra 在 -2008 版本之前被排除在包之外,它还引入了包 numeric_std_unsigned 以提供在 Synopsys 包 std_logic_arith_unsigned 中找到的功能,并提供对 std_logic_vector 值的无符号运算。 (Mentor 不提供类似的软件包)。

使用支持 IEEE 标准包 -2008 版本的模拟器或综合分析工具(编译器)如下所示:

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 值,因此不需要限定表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2012-09-08
    • 2021-12-24
    • 2014-03-31
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多