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] 的多个常量驱动程序”!!!!!!

4

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

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

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

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

于 2013-03-23T13:17:11.300 回答
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

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

于 2013-05-06T19:37:39.627 回答