vhdl嵌入循环中参数的算法

时间:2016-12-20 14:07:53

标签: arrays for-loop vhdl

让我们说,我有两种类型的数组:

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,而表达式(2)给出它。但是表达式(1)给出了这个:failed_result 所以问题是 - 我错过了什么吗?在获取数组索引时,乘以循环参数(i * j)是否正确?

P.S。我正在使用默认的sim选项运行xilinx vivado模拟器。

1 个答案:

答案 0 :(得分:1)

不应该这样:

PATH

更像这样:

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