通过for循环的VHDL记录分配

时间:2018-09-26 11:27:11

标签: vhdl

我在进程中有一个 for循环,它可以与 std_logic 数组配合使用,但不适用于 record 数组。我将Xilinx ISE与ISIM一起使用,代码为vhdl-93。目标将是Spartan 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;

注释代码下面的2行代码完全按预期工作(允许我将外部信号同步到clk_100),但是我宁愿将它们实现为for循环(例如注释的代码)。

但是,这些注释行在ISIM测试平台中不会产生相同的结果(使用 for循环时,spi_in_array处于未知状态)。为什么?

请帮助我。

1 个答案:

答案 0 :(得分:1)

正如Morten Zilmer所评论的,这是由于VHDL概念“最长静态前缀”。这个SO answer与我的问题类似。

对于我来说,解决问题的最简单方法是将数组的第一个元素的分配移到与for循环相同的过程中。我还不得不将SYNC_LATCHES常数从2减少到1,因为spi_in_array(0)现在被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;