0

我正在尝试将一个数据块(16 个字节,4 个字)从我的实体缓存写入我的其他实体内存。

内存是字节可寻址的,所以我一次只能写 1 个字节。当一个字节被写入时,内存会将mem_done更新为 1。

要编写一个块,我需要:

  • 写一个字节,

  • 等待mem_done被设置(通过内存实体),

  • 递增mem_address(给内存的下一个地址)、byte_count和每 4 个字节递增word_offset(缓存中字的偏移量)。

  • 循环直到所有单词都被写入(word_offset = words_per_block-1)。

在使用 Xilinx 进行综合时,我收到 wait_loop 错误“超出非静态循环限制”。

  • 我不能在循环中使用等待直到语句(错误:不允许多个等待语句)。

  • 我不能使用 FSM,因为状态转换会浪费一个时钟周期(而且我有时序限制)。

在不打破循环限制的情况下,我该怎么做?

-- block dirty in memory, write cache block back to memory
mem_enable   <= '1';      -- out to memory, enable memory transfer
mem_rw       <= '1';      -- out to memory. read/write bit
mem_addr_tmp <= cpu_addr; -- internal, address to write to
word_offset  <= 0;        -- internal, offset in cache
byte_count   <= 31;

burst_loop: loop
    -- Transfer 1 byte of data
    mem_data     <= CACHE(index).data(word_offset)(byte_count downto byte_count-7);
    mem_addr     <= mem_addr_tmp;
    wait_loop: loop
        if mem_done = '1' then  -- mem_done comes from memory entity
            exit wait_loop;
        end if;
    end loop wait_loop;

    -- Update address, word offset, byte count
    mem_addr_tmp <= std_logic_vector(to_unsigned(to_integer(unsigned(mem_addr_tmp)) + 1, mem_addr_tmp'length));
    if (byte_count mod 4 = 0) then -- a word has been transfered, increment word_offset
        word_offset  <= word_offset + 1;
        byte_count   <= 31;
    else                           -- a byte of a word has been transfered
        byte_count   <= byte_count - 7;
    end if;
    exit burst_loop when (mem_done = '1' and word_offset = words_per_block-1);
end loop burst_loop;    
mem_enable <= '0';
4

1 回答 1

2
wait_loop: loop
    if mem_done = '1' then  -- mem_done comes from memory entity
        exit wait_loop;
    end if;
end loop wait_loop;

这是一个无限循环mem_done = '0'。在 VHDL 中,语句的执行时间是瞬时的,等待语句除外。因此,如果进入循环时mem_done为 '0',则它永远不会退出,因为时间永远不会前进。

此外,等待语句通常是不可综合的。我们使用状态机在 VHDL 中产生顺序语句(否则,语句是并行执行的)。

最后, VHDL(用于综合)中的loop用于表示空间循环,您将它们用于时间循环,就像在编程语言中一样(VHDL 是一种硬件描述语言)。如果你愿意,循环总是展开,并且只提供一种更简洁的方式来编写多个类似的语句。在模拟中,您可以像在编程语言中一样通过使用等待语句来使用循环。

于 2015-03-30T04:32:44.200 回答