带有数组插入的时钟程序 VHDL

问题描述 投票:0回答:1

我正在尝试为我的测试平台构建一个程序,每个时钟周期从外部 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
    .....

stored-procedures vhdl fifo test-bench
1个回答
1
投票

这是一个测试平台,您可以创建一个简单循环多次直到 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;

这只是一个例子。请根据您的需求量身定制。

© www.soinside.com 2019 - 2024. All rights reserved.