通过for循环分配VHDL记录

通过for循环分配VHDL记录,vhdl,Vhdl,我在过程中有一个for循环,它在std_逻辑数组中运行良好,但在记录数组中运行不好。我使用Xilinx ISE和ISIM,代码是vhdl-93。目标是斯巴达3 以下是记录定义: TYPE spi_rx_t IS RECORD CS : std_logic; MOSI : std_logic; CLK : std_logic; END RECORD; constant SYNC_LATCHES : integer := 2; 以下是数组定义和声明: type spi_

我在过程中有一个for循环,它在std_逻辑数组中运行良好,但在记录数组中运行不好。我使用Xilinx ISE和ISIM,代码是vhdl-93。目标是斯巴达3

以下是记录定义:

TYPE spi_rx_t IS RECORD
CS      : std_logic;
MOSI    : std_logic;
CLK     : std_logic;
END RECORD;
constant SYNC_LATCHES   : integer := 2;
以下是数组定义和声明:

type spi_rx_array_t is array (0 to SYNC_LATCHES) of spi_rx_t;
signal spi_in_array : spi_rx_array_t;
以下是过程:

    spi_in_array(0).MOSI <= SPI_MOSI;
    spi_in_array(0).CLK <= SPI_CLK;
    spi_in_array(0).CS <= SPI_CS;    

    sync_p: process (clk_100)
        begin
            if rising_edge(clk_100) then
--                for I in 1 to SYNC_LATCHES loop
--                  spi_in_array(I) <= spi_in_array(I - 1);
--                end loop;
                spi_in_array(1) <= spi_in_array(0);
                spi_in_array(2) <= spi_in_array(1);
            end if;
        end process;
_数组(0)中的spi_
MOSI正如所评论的,这是由于VHDL概念“最长静态前缀”。这与我的问题类似

在我的例子中,解决问题的最简单方法是将数组第一个元素的赋值移动到与for循环相同的进程中。我还必须将SYNC_locks常量从2减少到1,因为_数组(0)中的spi_现在使用clk_100锁存

sync_p: process (clk_100)
begin
    if rising_edge(clk_100) then
        spi_in_array(0).MOSI <= SPI_MOSI;
        spi_in_array(0).CLK <= SPI_CLK;
        spi_in_array(0).CS <= SPI_CS;
        for I in 1 to SYNC_LATCHES-1 loop
            spi_in_array(I) <= spi_in_array(I - 1);
        end loop;
    end if;
end process;
sync\u p:进程(时钟100)
开始
如果上升沿(clk_100),则

spi_in_数组(0)。MOSI如果使用注释掉的行,是否有任何警告或错误消息?我不知道是否相关,但在模拟时使用的VHDL标准是什么?可能重复的是VHDL-2002的属性,如“12.6.1驱动程序”一节所述;因此,这不是ISIM的一个缺陷。请参阅我的建议中对这一点的引用,以重复的形式结束这个问题。我已经添加了一个答案。非常感谢莫滕·齐默:)