Vhdl can';t比较“;迭代器;i内有std_逻辑_向量,用于生成

Vhdl can';t比较“;迭代器;i内有std_逻辑_向量,用于生成,vhdl,Vhdl,在generate构造的中,我试图在比较中使用I,但我遇到了麻烦 代码是: mult_lineA_colX : for i in 0 to DIM-1 generate begin if i /= to_integer(unsigned(iterNb)) then multVect(i) <= A_line(i) * X_mat(i); else multVect(i) <= (others => '0'); end if

在generate构造的中,我试图在比较中使用I,但我遇到了麻烦

代码是:

mult_lineA_colX :
for i in 0 to DIM-1 generate
begin
    if i /= to_integer(unsigned(iterNb)) then
        multVect(i) <= A_line(i) * X_mat(i);
    else
        multVect(i) <= (others => '0');
    end if;
end generate;
图书馆:

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;
我在条件行上有一个错误:

ERROR:HDLCompiler:806 - "/path/to/file.vhd" Line 213: Syntax error near "if".
这不是允许使用i吗?我怎样才能修复这个问题或将其更改为具有相同效果的内容

我也尝试过使用when构造函数来获得相同的效果,但我遇到了两个错误:

ERROR:HDLCompiler:56 - "/path/to/file.vhd" Line 211: <i> is not a signal.
ERROR:HDLCompiler:258 - "/path/to/file.vhd" Line 211: Cannot convert type integer to type multvect
错误:HDLCompiler:56-“/path/to/file.vhd”行211:不是信号。
错误:HDLCompiler:258-“/path/to/file.vhd”行211:无法将integer类型转换为multvect类型

VHDL'93不支持进程外部的if-then-else构造。对于生成语句,您可以做的下一件最好的事情如下所示:

ieee库;
使用ieee.std_logic_1164.all;
实体foo是
最终实体foo;
foo的架构栏是
开始——架构栏
multV:对于0中的i,生成DIM-1
常量比较:布尔值:=(i/=to_整数(无符号(iterNb));
开始
案例1:如果比较生成

multVect(i)multVect在这里声明为标签,不能用作信号分配目标,就像在问题的片段中声明为类型而不是信号一样。正如您所指出的,如果条件必须是静态表达式,则迭代方案。这意味着在声明常量比较时iterNb的值,使其成为iterNb声明中表示为整数的默认值。缺少multVect类型的信号声明是一个严重的疏忽。谢谢你!我遇到了一个问题,常数的初始值根本不是常数(因为它不应该是常数,因为我希望它随着时间的推移而改变)。有没有想过如何克服这个问题?所以interNb不是恒定不变的?我不确定您想在这里实现什么,但是在这种情况下,您不应该使用generate语句(因为这些语句是在编译时计算的),而是使用一个进程。
ERROR:HDLCompiler:56 - "/path/to/file.vhd" Line 211: <i> is not a signal.
ERROR:HDLCompiler:258 - "/path/to/file.vhd" Line 211: Cannot convert type integer to type multvect