Vhdl类型不匹配错误

时间:2013-03-23 12:36:02

标签: vhdl

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

Nx,Ny - 仿制药

ipx - 输入端口向量

tempx,tempz - 信号

  

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

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

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

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

2 个答案:

答案 0 :(得分:3)

错误消息确切地告诉您问题所在:

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,“drivers”命令将识别信号上的所有驱动程序。

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

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

最有可能的是,修复此错误也会消除“层次结构”错误;这基本上是“先前出错了所以编译无法完成”。

答案 1 :(得分:1)

这是一个很好地解释命名关联与位置关联概念的页面。请注意,该示例显示了使用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

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