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

Subversion Repositories tdm

[/] [tdm/] [trunk/] [code/] [tdm_cont/] [core/] [RxTDMBuff.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 khatib
-------------------------------------------------------------------------------
2
-- Title      : TDM controller Rx Buffer
3
-- Project    : TDM controller
4
-------------------------------------------------------------------------------
5
-- File       : RxTDMBuff.vhd
6
-- Author     : Jamil Khatib  <khatib@ieee.org>
7
-- Organization:  OpenCores.org
8
-- Created    : 2001/05/14
9
-- Last update:2001/05/23
10
-- Platform   : 
11
-- Simulators  : NC-sim/linux, Modelsim XE/windows98
12
-- Synthesizers: Leonardo
13
-- Target      : 
14
-- Dependency  : ieee.std_logic_1164
15
-------------------------------------------------------------------------------
16
-- Description:  Receive Buffer that uses internal Sram
17
-------------------------------------------------------------------------------
18
-- Copyright (c) 2001  Jamil Khatib
19
-- 
20
-- This VHDL design file is an open design; you can redistribute it and/or
21
-- modify it and/or implement it after contacting the author
22
-- You can check the draft license at
23
-- http://www.opencores.org/OIPC/license.shtml
24
-------------------------------------------------------------------------------
25
-- Revisions  :
26
-- Revision Number :   1
27
-- Version         :   0.1
28
-- Date            :  2001/05/14
29
-- Modifier        :  Jamil Khatib  <khatib@ieee.org>
30
-- Desccription    :  Created
31
-- ToOptimize      :
32
-- Known Bugs      : 
33
-------------------------------------------------------------------------------
34
-- $Log: not supported by cvs2svn $
35
-- Revision 1.1  2001/05/24 22:48:55  jamil
36
-- TDM Initial release
37
--
38
-------------------------------------------------------------------------------
39
 
40
LIBRARY ieee;
41
USE ieee.std_logic_1164.ALL;
42
USE ieee.std_logic_unsigned.ALL;
43
 
44
LIBRARY memLib;
45
USE memLib.mem_pkg.ALL;
46
 
47
 
48
ENTITY RxTDMBuff IS
49
 
50
  PORT (
51
    CLK_I           : IN  STD_LOGIC;
52
    rst_n           : IN  STD_LOGIC;    -- System reset
53
    RxD             : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Rx Data
54
    RxRead          : OUT STD_LOGIC;    -- Rx Read
55
    RxRdy           : IN  STD_LOGIC;    -- Rx Ready to provide data
56
    RxValidData     : IN  STD_LOGIC;    -- Valid Data strobe
57
    BufferDataAvail : OUT STD_LOGIC;    -- Buffer Data Available strobe
58
    ReadBuff        : IN  STD_LOGIC;    -- Read Byte from Buffer
59
    RxData          : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Rx Byte output from buffer
60
    RxError  : OUT STD_LOGIC    -- Rx Error (buffer over flow)
61
    );
62
END RxTDMBuff;
63
 
64
 
65
 
66
ARCHITECTURE RxTDMBuff OF RxTDMBuff IS
67
 
68
 
69
  TYPE States_type IS (IDLE_st, READ_st, WRITE_st,WAITWRITE_st);  -- Buffer states
70
 
71
  SIGNAL Address : STD_LOGIC_VECTOR(4 DOWNTO 0);  -- memory address
72
 
73
  SIGNAL cs : STD_LOGIC := '1';         -- dummy signal
74
 
75
  SIGNAL wr_i    : STD_LOGIC;                     -- Read/Write signal
76
  SIGNAL Data_In : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Memory Data in
77
 
78
  SIGNAL Data_Out : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Memory Data out
79
 
80
 
81
 
82
BEGIN  -- RxTDMBuff
83
-------------------------------------------------------------------------------
84
  RxData <= Data_Out;
85
 
86
-------------------------------------------------------------------------------
87
-- purpose: FSM process
88
-- type   : sequential
89
-- inputs : CLK_I, rst_n
90
-- outputs: 
91
  fsm : PROCESS (CLK_I, rst_n)
92
 
93
    VARIABLE state   : States_type;                   -- internal state
94
    VARIABLE counter : STD_LOGIC_VECTOR(4 DOWNTO 0);  -- Internal Counter
95
    VARIABLE value   : STD_LOGIC_VECTOR(4 DOWNTO 0);  -- Max count value
96
 
97
  BEGIN  -- PROCESS fsm
98
 
99
    IF rst_n = '0' THEN                 -- asynchronous reset (active low)
100
      state           := IDLE_st;
101
      RxRead          <= '0';
102
      Counter         := "00000";
103
      BufferDataAvail <= '0';
104
      value           := "00000";
105
      WR_I <= '1';
106
      RxError <= '0';
107
      Data_In <= (OTHERS => '1');
108
      address <= (OTHERS => '0');
109
 
110
    ELSIF CLK_I'event AND CLK_I = '1' THEN  -- rising clock edge
111
 
112
      address <= Counter;
113
 
114
      Data_In <= RxD;
115
 
116
      CASE state IS
117
        WHEN IDLE_st =>
118
 
119
          IF (RxValidData = '1') THEN
120
            state := WRITE_st;
121
          END IF;
122
 
123
          wr_i            <= '1';
124
          RxRead          <= '0';
125
          Counter         := "00000";
126
          BufferDataAvail <= '0';
127
          value           := "00000";
128
          RxError         <= '0';
129
 
130
        WHEN READ_st =>
131
 
132
          BufferDataAvail <= '1';
133
          RxRead          <= '0';
134
 
135
          wr_i    <= '1';--ReadBuff;
136
          RxError <= RxValidData;
137
 
138
          IF (counter = value) OR RxValidData = '1' THEN
139
            state   := IDLE_st;
140
            counter := "00000";
141
 
142
          ELSE
143
            IF (ReadBuff = '1') THEN
144
              Counter := Counter + 1;
145
            END IF;
146
 
147
          END if;
148
 
149
            WHEN WRITE_st =>
150
            BufferDataAvail <= '0';
151
 
152
            RxError <= '0';
153
            RxRead  <= RxRdy;
154
            wr_i    <= NOT RxRdy;
155
 
156
            IF (counter = "11111" OR RxValidData = '0') THEN
157
              state := READ_st;
158
              value := counter;
159
 
160
              counter := "00000";
161
 
162
--            wr_i   <= '1';
163
--            RxRead <= '0';
164
            ELSE
165
              IF (RxRdy = '1') THEN
166
--              wr_i    <= '0';         --write to buffer
167
                counter := counter + 1;
168
                state := WAITWRITE_st;
169
--              RxRead  <= '1';
170
--            ELSE
171
--              wr_i    <= '1';
172
--              RxRead  <= '0';
173
              END IF;
174
 
175
            END IF;
176
 
177
            WHEN WAITWRITE_st =>
178
          BufferDataAvail <= '0';
179
          RxError <= '0';
180
          RxRead <= '1';
181
          wr_i <= '0';
182
          IF (RxRdy = '0') THEN
183
            state := WRITE_st;
184
          END IF;
185
 
186
            WHEN OTHERS => NULL;
187
          END CASE;
188
      END IF;
189
 
190
    END PROCESS fsm;
191
 
192
 
193
      Buff : Spmem_ent
194
        GENERIC MAP (
195
          USE_RESET   => FALSE,
196
          USE_CS      => FALSE,
197
          DEFAULT_OUT => '1',
198
          OPTION      => 0,
199
          ADD_WIDTH   => 5,
200
          WIDTH       => 8)
201
        PORT MAP (
202
          cs          => cs,
203
          clk         => clk_I,
204
          reset       => rst_n,
205
          add         => Address,
206
          Data_In     => Data_In,
207
          Data_Out    => Data_Out,
208
          WR          => WR_i);
209
 
210
 
211
    END RxTDMBuff;

powered by: WebSVN 2.1.0

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