我遇到类型不匹配错误,但所有值都是相同类型的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]的多个常量驱动程序”!!!!!!
答案 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
这样做感觉就像跳过不必要的箍,但它应该有效。祝你好运!