嵌入式循环中参数的vhdl算法

vhdl arithmetic of parameters in embedded loops

比方说,我有两种类型的数组:

type A_type is array (0 to 39) of std_logic_vector(7 downto 0);
type B_type is array (0 to 4) of std_logic_vector(63 downto 0);

以及相应的信号:

signal A : A_type := (others => (others => '0'));
signal B : B_type := (  x"0706050403020100",
                        x"0f0e0d0c0b0a0908",
                        x"1716151413121110",
                        x"1f1e1d1c1b1a1918",
                        x"2726252423222120");

现在,在这个过程中的某个地方,我想使用两个 for 循环将 A 按字节转换为 B,一个循环包装另一个 (1):

process(clk)
begin
    if rising_edge(clk) then
        for i in 1 to 5 loop
            for j in 1 to 8 loop
                A(i*j-1)  <= B(i-1)(7+8*(j-1) downto 8*(j-1));
            end loop;
        end loop;
    end if; 
end process;

当然,我可以用更直接的方式来实现它(2):

for i in 0 to 4 loop
    A(0+8*i) <= B(i)(7 downto 0);
    A(1+8*i) <= B(i)(15 downto 8);
    A(2+8*i) <= B(i)(23 downto 16);
    A(3+8*i) <= B(i)(31 downto 24);
    A(4+8*i) <= B(i)(39 downto 32);
    A(5+8*i) <= B(i)(47 downto 40);
    A(6+8*i) <= B(i)(55 downto 48);
    A(7+8*i) <= B(i)(63 downto 56);
end loop;

因此,我想要字节数组 A,它以这种方式存储向量数组 B:proper_result, and expression (2) gives it. But expression (1) gives this: failed_result 所以问题是 - 我错过了什么吗?获取数组索引时,循环参数(i*j)相乘是否正确?

p.s。我是 运行 具有默认 sim 选项的 xilinx vivado 模拟器。

不应该这样:

A(i*j-1)  <= B(i-1)(7+8*(j-1) downto 8*(j-1));

更像这样:

A(8*(i-1)+j-1)  <= B(i-1)(7+8*(j-1) downto 8*(j-1));