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] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dkoethe
-------------------------------------------------------------------------------
2
--* 
3
--* @short Generate fifo flags
4
--* 
5
--* @generic C_FIFO_SIZE_WIDTH  RAM Size = 2**C_FIFO_SIZE_WIDTH
6
--* @generic C_SYNC_TO          Sync FIFO Flags to read or write clock
7
--*
8
--*    @author: Daniel Köthe
9
--*   @version: 1.0
10
--* @date:      2007-11-11
11
--/
12
-------------------------------------------------------------------------------
13
library ieee;
14
use ieee.std_logic_1164.all;
15
use ieee.std_logic_unsigned.all;
16
use ieee.std_logic_arith.all;
17
 
18
 
19
entity fifo_prog_flags is
20
  generic (
21
    C_FIFO_SIZE_WIDTH : integer := 4;
22
    C_SYNC_TO         : string  := "WR");
23
  port (
24
    rst               : in  std_logic;
25
    clk               : in  std_logic;
26
    cnt_grey          : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
27
    cnt               : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
28
    prog_full_thresh  : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
29
    prog_empty_thresh : in  std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
30
    prog_empty        : out std_logic;
31
    prog_full         : out std_logic);
32
 
33
end fifo_prog_flags;
34
architecture behavior of fifo_prog_flags is
35
 
36
  -- sync register for clock domain transfer
37
  signal cnt_grey_reg : std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
38
 
39
  type rom_t is array (0 to (2**C_FIFO_SIZE_WIDTH)-1) of std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
40
 
41
  --* convert from gray to binary
42
  component gray2bin
43
    generic (
44
      width : integer);
45
    port (
46
      in_gray : in  std_logic_vector(width-1 downto 0);
47
      out_bin : out std_logic_vector(width-1 downto 0));
48
  end component;
49
 
50
  signal cnt_bin_reg : std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
51
 
52
begin  -- behavior
53
 
54
  --* Generate fifo flags
55
  gen_flags_proc: process(rst, clk)
56
    variable diff : std_logic_vector(C_FIFO_SIZE_WIDTH-1 downto 0);
57
  begin
58
    if (rst = '1') then
59
      cnt_grey_reg <= (others => '0');
60
      prog_empty   <= '1';
61
      prog_full    <= '0';
62
    elsif rising_edge(clk) then
63
      -- transfer to rd_clk domain
64
      cnt_grey_reg <= cnt_grey;
65
      -- fifo prog full/empty
66
      if (C_SYNC_TO = "RD") then
67
        -- diff := conv_grey_rom(conv_integer(cnt_grey_reg))- cnt;
68
        diff := cnt_bin_reg - cnt;
69
      else
70
        -- diff := cnt - conv_grey_rom(conv_integer(cnt_grey_reg));
71
        diff := cnt - cnt_bin_reg;
72
      end if;
73
 
74
      if (diff > prog_full_thresh) then
75
        prog_full <= '1';
76
      else
77
        prog_full <= '0';
78
      end if;
79
 
80
      if (diff < prog_empty_thresh) then
81
        prog_empty <= '1';
82
      else
83
        prog_empty <= '0';
84
      end if;
85
    end if;
86
  end process gen_flags_proc;
87
 
88
  --* convert gray to bin 
89
  gray2bin_1: gray2bin
90
    generic map (
91
      width => C_FIFO_SIZE_WIDTH)
92
    port map (
93
      in_gray => cnt_grey_reg,
94
      out_bin => cnt_bin_reg);
95
 
96
end behavior;

powered by: WebSVN 2.1.0

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