Vhdl for循环只执行1次

Vhdl for循环只执行1次,vhdl,Vhdl,我有一个关于在if语句中使用for循环的问题。if语句位于进程语句中。问题是当我执行这部分代码时,for循环只执行一次,而不管B的值是多少。我甚至尝试输入显式值并忽略B,但循环只执行一次。我错过什么了吗 该代码是ALU行为模型的一部分,用于在不使用sll的情况下应用逻辑左移 elsif ALU_Control = "100" then -- implement shift logic left by B units if (B &

我有一个关于在if语句中使用for循环的问题。if语句位于进程语句中。问题是当我执行这部分代码时,for循环只执行一次,而不管B的值是多少。我甚至尝试输入显式值并忽略B,但循环只执行一次。我错过什么了吗

该代码是ALU行为模型的一部分,用于在不使用sll的情况下应用逻辑左移

        elsif ALU_Control = "100" then
            -- implement shift logic left by B units 
            if (B > X"00000000") then
                -- Use value of B input as the shift position
                shift_value := TO_INTEGER(UNSIGNED(B)); 
                -- concatenate a 0 to end of A          
                for index in 0 to shift_value loop
                    temp_A := (A(30 downto 0) & '0');
                end loop;

                ALU_out <= temp_A(31 downto 0) after 100 ps;
            else
                ALU_out <= A after 100 ps; 
            end if;
elsif ALU_Control=“100”则
--B单元左侧的机具换档逻辑
如果(B>X“00000000”),则
--使用B输入值作为换档位置
移位_值:=到_整数(无符号(B));
--将0连接到
对于0中的索引,将值循环移位
温度A:=(A(30至0)和“0”);
端环;

ALU_out请看下面这部分代码:

for index in 0 to shift_value loop
  temp_A := (A(30 downto 0) & '0');
end loop;
这在循环的每次迭代中都会执行相同的操作,因此无论循环运行多少次,都会得到相同的结果。也许你真的想拥有这样的东西:

temp_A := A;
for index in 0 to shift_value loop
  temp_A := temp_A(30 downto 0) & '0';
end loop;

请看下面代码的这一部分:

for index in 0 to shift_value loop
  temp_A := (A(30 downto 0) & '0');
end loop;
这在循环的每次迭代中都会执行相同的操作,因此无论循环运行多少次,都会得到相同的结果。也许你真的想拥有这样的东西:

temp_A := A;
for index in 0 to shift_value loop
  temp_A := temp_A(30 downto 0) & '0';
end loop;
没有循环:

temp_A := (others => '0');
temp_A(A'high downto shift_value) := A(A'high-shift_value downto A'low);
没有循环:

temp_A := (others => '0');
temp_A(A'high downto shift_value) := A(A'high-shift_value downto A'low);

索引没有在循环中使用:它是否被优化掉了?您可以添加一些日志来证明temp_A被修改了吗?只有一次?你曾经结束过elsif吗?我不知道怎么结束。不幸的是,我刚刚开始学习VHDL。当我在Isim(Xilinx)上运行测试台时,无论我在索引范围内使用什么值,该ALU控制输入的输出仅“移位”1位。在结束if之后紧接着还有另一个elsif语句。似乎您正在为硬件模块(即不是测试台)编写VHDL。因此请注意,您的合成工具可能不支持i到j循环的
i
j
不是常数(即静态确定的否),尽管它可以在模拟中工作。例如,Altera Quartus II将拒绝此项。循环中未使用索引:是否正在对其进行优化?是否可以添加一些日志以证明温度A已更改?只有一次?你曾经结束过elsif吗?我不知道怎么结束。不幸的是,我刚刚开始学习VHDL。当我在Isim(Xilinx)上运行测试台时,无论我在索引范围内使用什么值,该ALU控制输入的输出仅“移位”1位。在结束if之后紧接着还有另一个elsif语句。似乎您正在为硬件模块(即不是测试台)编写VHDL。因此请注意,您的合成工具可能不支持i到j循环的
i
j
不是常数(即静态确定的否),尽管它可以在模拟中工作。例如,Altera Quartus II将拒绝这一点。