OpenCores
URL https://opencores.org/ocsvn/spi_slave/spi_slave/trunk

Subversion Repositories spi_slave

[/] [spi_slave/] [trunk/] [pcore/] [opb_spi_slave_v1_00_a/] [hdl/] [vhdl/] [fifo_prog_flags.vhd] - Rev 38

Go to most recent revision | Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------
--* 
--* @short Generate fifo flags
--* 
--* @generic C_FIFO_SIZE_WIDTH  RAM Size = 2**C_FIFO_SIZE_WIDTH
--* @generic C_SYNC_TO          Sync FIFO Flags to read or write clock
--*
--*    @author: Daniel Köthe
--*   @version: 1.0
--* @date:      2007-11-11
--/
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
 
 
entity fifo_prog_flags is
  generic (
    C_FIFO_SIZE_WIDTH : integer := 4;
    C_SYNC_TO         : string  := "WR");
  port (
    rst               : in  std_logic;
    clk               : in  std_logic;
    cnt_grey          : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
    cnt               : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
    prog_full_thresh  : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
    prog_empty_thresh : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
    prog_empty        : out std_logic;
    prog_full         : out std_logic);
 
end fifo_prog_flags;
architecture behavior of fifo_prog_flags is
 
  -- sync register for clock domain transfer
  signal cnt_grey_reg : std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
 
  type rom_t is array (0 to (2**C_FIFO_SIZE_WIDTH)-1) of std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
 
  --* convert from gray to binary
  component gray2bin
    generic (
      width : integer);
    port (
      in_gray : in  std_logic_vector(width-1 downto 0);
      out_bin : out std_logic_vector(width-1 downto 0));
  end component;
 
  signal cnt_bin_reg : std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
 
begin  -- behavior
 
  --* Generate fifo flags
  gen_flags_proc: process(rst, clk)
    variable diff : std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
  begin
    if (rst = '1') then
      cnt_grey_reg <= (others => '0');
      prog_empty   <= '1';
      prog_full    <= '0';
    elsif rising_edge(clk) then
      -- transfer to rd_clk domain
      cnt_grey_reg <= cnt_grey;
      -- fifo prog full/empty
      if (C_SYNC_TO = "RD") then
        -- diff := conv_grey_rom(conv_integer(cnt_grey_reg))- cnt;
        diff := cnt_bin_reg - cnt;
      else
        -- diff := cnt - conv_grey_rom(conv_integer(cnt_grey_reg));
        diff := cnt - cnt_bin_reg;
      end if;
 
      if (diff > prog_full_thresh) then
        prog_full <= '1';
      else
        prog_full <= '0';
      end if;
 
      if (diff < prog_empty_thresh) then
        prog_empty <= '1';
      else
        prog_empty <= '0';
      end if;
    end if;
  end process gen_flags_proc;
 
  --* convert gray to bin 
  gray2bin_1: gray2bin
    generic map (
      width => C_FIFO_SIZE_WIDTH)
    port map (
      in_gray => cnt_grey_reg,
      out_bin => cnt_bin_reg);
 
end behavior;
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.