【问题标题】:Vhdl Type mismatch errorVhdl 类型不匹配错误
【发布时间】:2013-03-23 12:36:02
【问题描述】:

我遇到类型不匹配错误,但所有值都属于同一类型的 std_logic。 这是代码

Nx, Ny - 泛型

ipx - 输入端口向量

tempx, tempz - 信号

ipx : in std_logic_vector(Nx-1 down to 0);
.......
信号 tempx : std_logic_vector(Ny-1 downto 0) := ipx(Nx-1 downto Nx-Ny); (信号初始化)
信号 tempz : std_logic_vector(Ny-1 down to 0);
......
tempx tempz(Ny-2 downto 0), 0 => ipx(a-1));

错误:错误(10381):ArrayDivider.vhd(53)处的VHDL类型不匹配错误:索引名称返回一个类型与目标表达式类型“std_ulogic”不匹配的值 (tempx最后一行代码出错)

但是 ipx 和 tempz 都是 std_logic 向量所以,这里的类型不匹配在哪里???? 请给我一些解决方案

我也尝试过使用连接运算符 & 但它给了我另一个与顶级层次结构相关的错误,并且“无法解析 tempx[0] 的多个常量驱动程序”!!!!!!

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    错误消息告诉您问题的确切原因:

    error : Error (10381): VHDL Type Mismatch error at ArrayDivider.vhd(53): indexed name returns a value whose type does not match "std_ulogic", the type of the target expression

    确实,tempz(Ny-2 downto 0) 不是 std_ulogic 而是向量。

    问题是命名关联不能识别向量的切片,而是单个元素;您不能使用它来将一个向量的一个切片分配给另一个向量的切片。

    改为使用串联运算符&

    tempx <= tempz(Ny-2 downto 0) & ipx(a-1);
    

    您的帖子暗示连接会产生其他错误;随时将这些添加到问题中。

    编辑:

    >Error (10028): Can't resolve multiple constant drivers for net 
    >"tempx[0]" at ArrayDivider.vhd(44) (on the line of initialing >tempx) 
    

    这再次告诉您出了什么问题。这个错误几乎肯定在两个版本的设计中都存在,但最初的错误只是隐藏了它。找到 tempx(0) 的两个驱动程序并消除错误的驱动程序。您还没有发布足够多的代码来说明发生了什么,所以这取决于您。如果您使用的是 Modelsim,“驱动程序”命令将识别信号上的所有驱动程序。

    如果您需要将 tempx 初始化为输入信号,然后用另一个信号驱动它,则必须在两个信号之间进行选择 - 例如:

    tempx <= ipx(Nx-1 downto Nx-Ny) when <some condition>
             else tempz(Ny-2 downto 0) & ipx(a-1);
    

    很可能,修复此错误也将消除“层次结构”错误;这基本上是“早些时候出了点问题,因此无法完成编译”。

    【讨论】:

    • 感谢您的支持和您对解决我的错误的兴趣......:) 我也尝试过连接......但这给了我 2 个错误...... .... >Error (10028): Can't resolve multiple constant drivers for net >"tempx[0]" at ArrayDivider.vhd(44)(在初始化行>tempx)>错误:无法详细说明-level 用户层次结构
    【解决方案2】:

    这是一个页面,它很好地解释了命名关联与位置关联的概念。请注意,该示例显示了使用 bit_vector 类型的两种关联方法的使用。

    http://www.ics.uci.edu/~jmoorkan/vhdlref/aggregat.html

    正如您所注意到的,当您对 std_logic 向量执行命名关联时,VHDL 会返回一个 bit_vector。如果您尝试将结果分配给 std_logic_vector,这会导致类型不匹配。

    一种选择是使用 TO_BITVECTOR 和 TO_STDLOGICVECTOR 在 bit_vector 和 std_logic_vector 之间进行转换。这些在 ieee.std_logic_1164 库中定义,语法描述如下:

    http://www.seas.upenn.edu/~ese171/vhdl/PackageSTD_1164.html

    这样做感觉就像跳过不必要的障碍,但它应该有效。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多