Vhdl 使用变量作为标准逻辑向量中的边界时遇到的问题

Vhdl 使用变量作为标准逻辑向量中的边界时遇到的问题,vhdl,Vhdl,我试图做以下工作:在一个过程中,在声明了一个自然类型的变量之后 VARIABLE Pointer: NATURAL := 0; 。。。我把它赋给一个值Pnt,它是一个std_logic_vector(3到0)类型的信号: 。。。稍后(在流程的开始部分),我使用这个值,指针,指向称为缓冲区的大std_逻辑_向量的一部分(一个字节): Buffer(Pointer*8+7 downto Pointer*8) <= ...something... 我已经导入了numeric_std,在我的文

我试图做以下工作:在一个过程中,在声明了一个自然类型的变量之后

VARIABLE Pointer: NATURAL := 0;
。。。我把它赋给一个值Pnt,它是一个std_logic_vector(3到0)类型的信号:

。。。稍后(在流程的开始部分),我使用这个值,指针,指向称为缓冲区的大std_逻辑_向量的一部分(一个字节):

Buffer(Pointer*8+7 downto Pointer*8) <= ...something...
我已经导入了numeric_std,在我的文件顶部写上“use IEEE.numeric_std.all


为什么会发生这种错误?提前感谢您的宝贵帮助,我希望我提供了足够的、有条理的关于这个问题的信息

原因是您的indexer:Pointer变量正在更改。如果编译器无法将节解析为组合逻辑,则VHDL中不允许这样做

如果编译器只能实现一个顺序实现,那么它将抱怨一个错误

取决于您的供应商。有时很难让编译器理解您所描述的逻辑实际上是组合的


此外,请确保检查您是否没有推断的锁存,如果没有,这肯定不起作用

原因是您的indexer:Pointer变量正在更改。如果编译器无法将节解析为组合逻辑,则VHDL中不允许这样做

如果编译器只能实现一个顺序实现,那么它将抱怨一个错误

取决于您的供应商。有时很难让编译器理解您所描述的逻辑实际上是组合的


此外,确保检查您没有推断的锁存,如果没有,这肯定不起作用

这将有助于发布错误所在的整个第38行,以及其中所有内容的声明。但最好将问题提炼成最小的自包含的可编译示例,让人们重现您正在做的事情。当然,给定上述声明,
Pointer*8
不是问题。
buffer
是VHDL中的保留字。您的数组真的被称为“缓冲区”吗?如果是这样的话,那也无济于事;您需要更改它的名称。(缓冲端口是一种可以读取的输出端口。它很少使用,因为它会带来其他复杂性。)@MatthewTaylor好的观点:这可能会使一些VHDL解析器偏离轨道,并导致错误消息令人困惑。这将有助于发布错误所在的整个第38行,以及其中所有内容的声明。但最好将问题提炼成最小的自包含的可编译示例,让人们重现您正在做的事情。当然,给定上述声明,
Pointer*8
不是问题。
buffer
是VHDL中的保留字。您的数组真的被称为“缓冲区”吗?如果是这样的话,那也无济于事;您需要更改它的名称。(缓冲端口是一种您可以读取的输出端口。它很少使用,因为它会带来其他复杂性。)@MatthewTaylor好的观点:这可能会使一些VHDL解析器偏离轨道,并导致错误消息。谢谢CJC,这就是问题所在!我必须指定一大堆“with xx select…”明确考虑所有可能的情况,然后使用“downto”周围的数字,现在一切正常:)谢谢CJC,这就是问题所在!我必须指定一大堆“with xx select…”明确考虑所有可能的情况,然后只使用“downto”周围的数字,现在一切正常:)
Buffer(Pointer*8+7 downto Pointer*8) <= ...something...
Error (10327): VHDL error at OutputInterface.vhd(38): can't determine definition of operator ""*"" -- found 0 possible definitions