我正在尝试为我的测试平台构建一个程序,每个时钟周期从外部 FIFO 读取数据并将数据插入到测试平台的内部数组中。
我的目标是从 FIFO 读取数据直到它为空的过程。我遇到的问题是,在退出程序之前它似乎只读取了一个单词。
procedure read_uplink_FIFO(
signal clk : in std_logic;
)is
variable rd_cnt : integer := 0;
begin
if rising_edge(clk) then
if fifo_empty_o = '0' then
rd_ena_i <= '1';
uplink_fifo_reg(rd_cnt) <= rd_data_o;
rd_cnt := rd_cnt + 1;
elsif fifo_empty_o = '1' then
rd_ena_i <= '0';
rd_cnt := 0;
end if;
end if;
end;
在知道对 FIFO 的写入操作完成后,该过程在测试台主进程内调用:
wait until rising_edge(clk);
read_uplink_FIFO(clk);
我在程序方面没有太多经验,有关我的问题的信息也很有限。我想知道我是否使用了错误的程序,或者是否有可能使用程序来实现我的目标。
我尝试切换嵌套的 if 语句,但没有成功:
if fifo_empty_o = '0' then
if rising_edge(clk) then
...
end if;
elsif fifo_empty_o = '1' then
.....
这是一个测试平台,您可以创建一个简单循环多次直到 fifo 为空的过程。按照这些思路的过程看起来像这样:
procedure read_uplink_FIFO(
signal clk : in std_logic;
constant scope : in string := C_SCOPE
)is
variable rd_cnt : integer := 0;
begin
rd_ena_i <= '1';
while not fifo_empty_o loop
wait until rising_edge(clk);
uplink_fifo_reg(rd_cnt) <= rd_data_o;
log(ID_SEQUENCER_SUB, "Data: (" & to_string(rd_data_o, HEX, AS_IS, INCL_RADIX)
& "), read from FIFO index: (" & to_string(rd_cnt) & ")", scope);
rd_cnt := rd_cnt + 1;
end loop;
rd_ena_i <= '0';
log(ID_SEQUENCER_SUB, "Read complete, FIFO is empty", scope);
end procedure;
这只是一个例子。请根据您的需求量身定制。