Implementación de FIFO en VHDL: ¿la función de lectura elimina el elemento de FIFO?

-1
library IEEE;  
use IEEE.STD_LOGIC_1164.ALL;  
use IEEE.STD_LOGIC_ARITH.ALL;  
use IEEE.STD_LOGIC_UNSIGNED.ALL;  

entity fifo is  
port (  clk : in std_logic;  
        enr : in std_logic;   --enable read,should be '0' when not in use.  
        enw : in std_logic;    --enable write,should be '0' when not in use.  
        dataout : out std_logic_vector(7 downto 0);    --output data  
        datain : in std_logic_vector (7 downto 0);     --input data  
        empty : out std_logic;     --set as '1' when the queue is empty  
        full : out std_logic     --set as '1' when the queue is full  
     );  
end fifo;  

architecture Behavioral of fifo is  
type memory_type is array (0 to 255) of std_logic_vector(7 downto 0);  
signal memory : memory_type :=(others => (others => '0')); --memory for queue.  
signal readptr,writeptr : std_logic_vector(7 downto 0) :="00000000"; --read/write pointers.  
begin  
  process(clk)  
  begin   
    if(clk'event and clk='1' and enr ='1') then  
      dataout <= memory(conv_integer(readptr));  
      error <= '0';  
      readptr <= readptr + '1';      --points to next address.  
    end if;  
    if(clk'event and clk='1' and enw ='1') then  
      memory(conv_integer(writeptr)) <= datain;  
      writeptr <= writeptr + '1';   --points to next address.  
    end if;  
    if(readptr = "11111111") then      --resetting read pointer.  
      readptr <= "00000000";  
    end if;  
    if(writeptr = "11111111") then        --checking whether queue is full or not
      full <='1';  
      writeptr <= "00000000";  
    else  
      full <='0';  
    end if;  
    if(writeptr = "00000000") then   --checking whether queue is empty or not  
      empty <='1';  
    else  
      empty <='0';  
    end if;  
  end process;  
end Behavioral; 

En el código anterior, quiero saber si la función de lectura también está actuando para eliminar el elemento en particular que se está leyendo.

Si no, ¿alguien puede proporcionar un pequeño código vhdl para la función de eliminación?

    
pregunta zyxwvu

2 respuestas

8

El primer problema es que el código, incluso cuando está formateado para que pueda leerlo, no es muy bueno. Tendrías suerte si se sintetizara, y si lo hace, no funcionará muy bien. El problema principal es que hay múltiples fragmentos de lógica cronometrados y no cronometrados dentro del proceso. Si se sintetizó, todavía hay D-Flip-Flops que tienen conjuntos / reinicios asíncronos desagradables. Se puede encontrar para simulaciones, pero no me gustaría usarlo "de verdad".

El segundo problema es que es difícil saber a qué te refieres con "eliminar".

Dados esos problemas, este es mi mejor intento de respuesta ...

La mayoría de los FIFO's (incluido este en un grado de muerte cerebral) utilizan lo que denominamos búfer circular . En FIFO es solo una parte de la RAM que contiene los datos, más un puntero de lectura y escritura. Los punteros se utilizan para realizar un seguimiento de qué ubicaciones de ram se están utilizando. Una vez que se ha leído una parte de los datos, todavía está en el ram, pero los indicadores indican que no se utilizan. A medida que más y más datos fluyan a través del FIFO, esa ubicación de ram será eventualmente sobrescrita con nuevos datos.

Por lo tanto, no hay ningún concepto de eliminar datos. Solo ubicaciones de ram que se están utilizando y no se utilizan.

    
respondido por el user3624
-1

Se prueba el siguiente código:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity fifo is
generic (RAMsize: integer :=4);
port (  data_in: in std_logic_vector (7 downto 0);  
    clk,nrst: in std_logic;
    readReq: in std_logic;  
        writeReq: in std_logic; 
        data_out: out std_logic_vector(7 downto 0); 
        empty: out std_logic;  
        full: out std_logic;
    error: out std_logic);
end fifo;

architecture Behavioral of fifo is
type memory_type is array (0 to RAMsize-1) of std_logic_vector(7 downto 0);
signal memory : memory_type :=(others => (others => '0')); 

begin
  process(clk,nrst)
  variable read_ptr, write_ptr : std_logic_vector(7 downto 0) :="00000000";  -- read and write pointers
  variable isempty , isfull : std_logic :='0';
  begin
  if nrst='0' then
    memory <= (others => (others => '0'));
    empty <='1';
    full <='0';
    data_out <= "00000000";
    read_ptr := "00000000";
    write_ptr := "00000000";
    isempty :='1';
    isfull :='0';
    error <='0';
  elsif clk'event and clk='1' then
    if readReq='0' and writeReq='0' then
      error <='0';
    end if;
    if readReq='1' then
      if isempty='1' then
        error <= '1';
      else
        data_out <= memory(conv_integer(read_ptr));
        isfull :='0';
        full <='0';
        error <='0';
        if read_ptr=conv_std_logic_vector(RAMsize-1,8) then
          read_ptr := "00000000";
        else
          read_ptr := read_ptr + '1';
        end if;
        if read_ptr=write_ptr then
          isempty:='1';
          empty <='1';
        end if;
      end if;
    end if;
    if writeReq='1' then
      if isfull='1' then
        error <='1';
      else
        memory(conv_integer(write_ptr)) <= data_in;
        error <='0';
        isempty :='0';
        empty <='0';
        if write_ptr=conv_std_logic_vector(RAMsize-1,8) then
          write_ptr := "00000000";
        else
          write_ptr := write_ptr + '1';
        end if;
        if write_ptr=read_ptr then
          isfull :='1';
          full <='1';
        end if;
      end if;
    end if;
  end if;
  end process;

end Behavioral;





------ test bench:



library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity fifo_tb is end fifo_tb;
architecture fifo_tb of fifo_tb is
component fifo is
generic (RAMsize: integer );
port (  data_in: in std_logic_vector (7 downto 0);  
    clk,nrst: in std_logic;
    readReq: in std_logic;  
        writeReq: in std_logic; 
        data_out: out std_logic_vector(7 downto 0); 
        empty: out std_logic;  
        full: out std_logic;
    error: out std_logic);
end component;
signal data_in_t:  std_logic_vector (7 downto 0);  
signal clk_t,nrst_t: std_logic :='0';
signal readReq_t: std_logic;  
signal writeReq_t: std_logic; 
signal data_out_t: std_logic_vector(7 downto 0); 
signal empty_t: std_logic;  
signal full_t: std_logic;
signal error_t: std_logic;

begin
  u1: fifo generic map (4) port map (data_in_t,clk_t,nrst_t,readReq_t,writeReq_t,data_out_t,empty_t,full_t,error_t);
  nrst_t <= '0' , '1' after 15 ns;
  clk_t <= not clk_t after 2 ns;
  readReq_t <= '1' after 21 ns , '0' after 23 ns, '1' after 41 ns, '0' after 45 ns , '1' after 53 ns;
  writeReq_t <= '1' after 28 ns, '0' after 31 ns , '1' after 33 ns , '0' after 35 ns, '1' after 37 ns, '1' after 45 ns, '0' after 47 ns , '1' after 49 ns, '0' after 51 ns;
  data_in_t <= "11111111" after 29 ns, "11111110" after 33 ns , "11111100" after 37 ns, "11111000" after 45 ns, "11110000" after 49 ns;

end fifo_tb;
    
respondido por el behnaz

Lea otras preguntas en las etiquetas