我正在尝试将一个数据块(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';