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

Subversion Repositories mdct

[/] [mdct/] [tags/] [MDCT_REL_B1_1/] [source/] [DBUFCTL.VHD] - Blame information for rev 24

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mikel262
--------------------------------------------------------------------------------
2
--                                                                            --
3
--                          V H D L    F I L E                                --
4
--                          COPYRIGHT (C) 2006                                --
5
--                                                                            --
6
--------------------------------------------------------------------------------
7
--
8
-- Title       : DBUFCTL
9
-- Design      : MDCT Core
10
-- Author      : Michal Krepa
11
--
12
--------------------------------------------------------------------------------
13
--
14
-- File        : DBUFCTL.VHD
15
-- Created     : Thu Mar 30 22:19 2006
16
--
17
--------------------------------------------------------------------------------
18
--
19
--  Description : Double buffer memory controller
20
--
21
--------------------------------------------------------------------------------
22
library IEEE;
23
  use IEEE.STD_LOGIC_1164.all;
24
 
25
library WORK;
26
  use WORK.MDCT_PKG.all;
27
 
28
entity DBUFCTL is
29
        port(
30
                clk          : in STD_LOGIC;
31
                rst          : in STD_LOGIC;
32
    requestwr    : in STD_LOGIC;
33
    requestrd    : in STD_LOGIC;
34
    releasewr    : in STD_LOGIC;
35
    releaserd    : in STD_LOGIC;
36
 
37
    memswitchwr  : out STD_LOGIC;
38
    memswitchrd  : out STD_LOGIC;
39
    reqwrfail    : out STD_LOGIC;
40
    reqrdfail    : out STD_LOGIC;
41
    dataready    : out STD_LOGIC
42
                );
43
end DBUFCTL;
44
 
45
architecture RTL of DBUFCTL is
46
 
47
  signal memswitchwr_reg : STD_LOGIC;
48
  signal memswitchrd_reg : STD_LOGIC;
49
  signal mem1_full_reg   : STD_LOGIC;
50
  signal mem2_full_reg   : STD_LOGIC;
51
  signal mem1_lock_reg   : STD_LOGIC;
52
  signal mem2_lock_reg   : STD_LOGIC;
53
 
54
begin
55
 
56
  dataready <= '1' when
57
    ((mem1_lock_reg = '0' and mem1_full_reg = '1') or
58
    (mem2_lock_reg = '0' and mem2_full_reg = '1')) else '0';
59
 
60
  memswitchwr  <= memswitchwr_reg;
61
  memswitchrd  <= memswitchrd_reg;
62
 
63
  MEM_SWITCH : process(rst,clk)
64
  begin
65
    if rst = '1' then
66
      memswitchwr_reg <= '0'; -- initially mem 1 is selected
67
      memswitchrd_reg <= '0'; -- initially mem 1 is selected
68
      mem1_full_reg <= '0';
69
      mem2_full_reg <= '0';
70
      mem1_lock_reg <= '0';
71
      mem2_lock_reg <= '0';
72
      reqrdfail     <= '0';
73
      reqwrfail     <= '0';
74
    elsif clk = '1' and clk'event then
75
 
76
      -- write request by DCT1D
77
      if requestwr = '1' then
78
        -- if mem1 is free
79
        if mem1_lock_reg = '0' and mem1_full_reg = '0' then
80
          memswitchwr_reg <= '0';
81
          mem1_lock_reg  <= '1';
82
          reqwrfail      <= '0';
83
        -- if mem2 is free
84
        elsif mem2_lock_reg = '0' and mem2_full_reg = '0' then
85
          memswitchwr_reg <= '1';
86
          mem2_lock_reg   <= '1';
87
          reqwrfail       <= '0';
88
        else
89
          reqwrfail       <= '1';
90
        end if;
91
      end if;
92
 
93
      -- write request released by DCT1D
94
      if releasewr = '1' then
95
        -- if mem1 locked by DCT1D release it
96
        if mem1_lock_reg = '1' and memswitchwr_reg = '0' then
97
          mem1_lock_reg  <= '0';
98
          mem1_full_reg  <= '1';
99
        -- if mem2 locked by DCT1D release it
100
        elsif mem2_lock_reg = '1' and memswitchwr_reg = '1' then
101
          mem2_lock_reg  <= '0';
102
          mem2_full_reg  <= '1';
103
        end if;
104
      end if;
105
 
106
      -- read request by DCT2D
107
      if requestrd = '1' then
108
        if mem1_lock_reg = '0' and mem1_full_reg = '1' then
109
          memswitchrd_reg <= '0';
110
          mem1_lock_reg   <= '1';
111
          reqrdfail       <= '0';
112
        elsif mem2_lock_reg = '0' and mem2_full_reg = '1' then
113
          memswitchrd_reg <= '1';
114
          mem2_lock_reg   <= '1';
115
          reqrdfail       <= '0';
116
        else
117
          reqrdfail       <= '1';
118
        end if;
119
      end if;
120
 
121
      -- read request released by DCT2D
122
      if releaserd = '1' then
123
        -- if mem1 locked by DCT2D release it
124
        if mem1_lock_reg = '1' and memswitchrd_reg = '0' then
125
          mem1_lock_reg  <= '0';
126
          mem1_full_reg  <= '0';
127
        -- if mem2 locked by DCT2D release it
128
        elsif mem2_lock_reg = '1' and memswitchrd_reg = '1' then
129
          mem2_lock_reg  <= '0';
130
          mem2_full_reg  <= '0';
131
        end if;
132
      end if;
133
 
134
    end if;
135
  end process;
136
 
137
end RTL;
138
--------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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