我遇到类型不匹配错误,但所有值都是相同类型的std_logic . 这是代码
Nx,Ny - 仿制药
ipx - 输入端口向量
tempx,tempz - 信号
ipx:在std_logic_vector(Nx-1 downto 0); .......信号tempx:std_logic_vector(Ny-1 downto 0):= ipx(Nx-1 downto Nx-Ny); (信号初始化)信号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 回答
错误消息告诉您确切的问题是什么:
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(0)的两个驱动程序并消除错误的驱动程序 . 您还没有发布足够的代码来明确发生了什么,这取决于您 . 如果您正在使用Modelsim,“drivers”命令将识别信号上的所有驱动程序 .
如果需要将tempx初始化为输入信号,然后再使用其他信号驱动它,则必须在两个信号之间进行选择 - 例如:
最有可能的是,修复此错误也会消除“层次结构”错误;这基本上是“先前出错了所以编译无法完成” .
这是一个很好地解释命名关联与位置关联概念的页面 . 请注意,该示例显示了使用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
这样做感觉就像跳过不必要的箍,但它应该工作 . 祝好运!