首页 文章

Vhdl类型不匹配错误

提问于
浏览
1

我遇到类型不匹配错误,但所有值都是相同类型的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 回答

  • 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

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

    这样做感觉就像跳过不必要的箍,但它应该工作 . 祝好运!

相关问题