我在进程中有一个 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处于未知状态)。为什么?
请帮助我。
答案 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;