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

Subversion Repositories hdlc

[/] [hdlc/] [trunk/] [CODE/] [TOP/] [core/] [RxBuff.vhd] - Blame information for rev 17

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 khatib
------------------------------------------------------------------------------
2
-- Title      : HDLC Rx Buffer
3
-- Project    : HDLC controller
4
-------------------------------------------------------------------------------
5
-- File       : RxBuff.vhd
6
-- Author     : Jamil Khatib  <khatib@ieee.org>
7
-- Organization: OpenIPCore Project 
8
-- Created    : 2001/04/06
9
-- Last update: 2001/04/25
10
-- Platform   : 
11
-- Simulators  : Modelsim/Windows98, NC-sim/Linux
12
-- Synthesizers: 
13
-- Target      : 
14
-- Dependency  : ieee.std_logic_1164
15
--                memLib.mem_pkg
16
-------------------------------------------------------------------------------
17
-- Description:  HDLC Receive Buffer
18
-------------------------------------------------------------------------------
19
-- Copyright (c) 2001  Jamil Khatib
20
-- 
21
-- This VHDL design file is an open design; you can redistribute it and/or
22
-- modify it and/or implement it after contacting the author
23
-- You can check the draft license at
24
-- http://www.opencores.org/OIPC/license.shtml
25
-------------------------------------------------------------------------------
26
-- Revisions  :
27
-- Revision Number :   1
28
-- Version         :   0.1
29
-- Date            :  2001/04/06
30
-- Modifier        :  Jamil Khatib  <khatib@ieee.org>
31
-- Desccription    :  Created
32
-- ToOptimize      :
33
-- Known Bugs      :
34
-------------------------------------------------------------------------------
35
-- $Log: not supported by cvs2svn $
36
-- Revision 1.3  2001/04/27 18:21:59  jamil
37
-- After Prelimenray simulation
38
--
39
-- Revision 1.2  2001/04/22 20:08:16  jamil
40
-- Top level simulation
41
--
42
-- Revision 1.1  2001/04/14 15:02:25  jamil
43
-- Initial Release
44
--
45
-------------------------------------------------------------------------------
46
LIBRARY ieee;
47
USE ieee.std_logic_1164.ALL;
48
USE ieee.std_logic_unsigned.ALL;
49
 
50
LIBRARY memLib;
51
USE memLib.mem_Pkg.ALL;
52
 
53
ENTITY RxBuff_ent IS
54
 
55
  GENERIC (
56
    FCS_TYPE  : INTEGER := 2;           -- 2 = FCS 16
57
                                        -- 4 = FCS 32
58
                                        -- 0 = FCS disabled
59
    ADD_WIDTH : INTEGER := 7);          -- Internal Address width
60
 
61
  PORT (
62
    Clk           : IN  STD_LOGIC;      -- System Clock
63
    rst_n         : IN  STD_LOGIC;      -- System reset
64
    DataBuff      : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Rx Data
65
    EOF           : IN  STD_LOGIC;      -- End of Frame pulse
66
    WrBuff        : IN  STD_LOGIC;      -- Write buffer
67
    FrameSize     : OUT STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0);  -- Frame Length
68
    RxRdy         : OUT STD_LOGIC;      -- Rx Ready
69
    RxDataBuffOut : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Output Rx Buffer
70
    Overflow      : OUT STD_LOGIC;      -- Buffer Overflow
71
    Rd            : IN  STD_LOGIC);     -- Read buffer
72
 
73
END RxBuff_ent;
74
 
75
 
76
ARCHITECTURE RxBuff_rtl OF RxBuff_ent IS
77
 
78
  SIGNAL load_FrSize : STD_LOGIC;       -- Load Frame Size
79
  SIGNAL en_Count    : STD_LOGIC;       -- Enable Counter
80
 
81
  SIGNAL   Data_In_i   : STD_LOGIC_VECTOR(7 DOWNTO 0);
82
                                        -- Internal Data in
83
  SIGNAL   Data_Out_i  : STD_LOGIC_VECTOR(7 DOWNTO 0);
84
                                        -- Internal Data out
85
  CONSTANT MAX_ADDRESS : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0) := (OTHERS => '1');
86
                                        -- MAX Address
87
 
88
  SIGNAL Count     : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0);  -- Counter
89
  SIGNAL rst_count : STD_LOGIC;                               -- Reset Counter
90
 
91
  SIGNAL cs : STD_LOGIC := '1';         -- dummy signal
92
 
93
  SIGNAL WR_i        : STD_LOGIC;       -- Internal Read/Write signal
94
  SIGNAL Address     : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0);
95
                                        -- Internal Address bus
96
  SIGNAL FrameSize_i : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0);
97
                                        -- Internal Frame Size
98
  SIGNAL Overflow_i  : STD_LOGIC;       -- Internal Overflow
99
  SIGNAL RxRdy_i     : STD_LOGIC;       -- Internal RxRdy
100
 
101
  TYPE states_typ IS (IDLE_st, WRITE_st, READ_st);  -- states types
102
 
103
  SIGNAL p_state : states_typ;          -- Present state
104
  SIGNAL n_state : states_typ;          -- Next State
105
 
106
 
107
BEGIN  -- RxBuff_rtl
108
-------------------------------------------------------------------------------
109
 
110
  Data_In_i     <= DataBuff;
111
  RxDataBuffOut <= Data_Out_i;
112
 
113
-------------------------------------------------------------------------------
114
--  Full    <= '1' WHEN Address = MAX_ADDRESS ELSE '0';
115
  Address <= Count;
116
 
117
-------------------------------------------------------------------------------
118
-- purpose: Byte counter
119
-- type   : sequential
120
-- inputs : Clk, rst_n
121
-- outputs: 
122
  counter_proc  : PROCESS (Clk, rst_n)
123
  BEGIN  -- process counter_proc
124
    IF rst_n = '0' THEN                 -- asynchronous reset (active low)
125
      count         <= (OTHERS => '0');
126
    ELSIF Clk'event AND Clk = '1' THEN  -- rising clock edge
127
      IF rst_count = '1' THEN           -- Synchronouse Reset (active high)
128
        count       <= (OTHERS => '0');
129
      ELSIF en_Count = '1' THEN
130
        count       <= count +1;
131
      END IF;
132
    END IF;
133
  END PROCESS counter_proc;
134
-------------------------------------------------------------------------------
135
-- purpose: Frame Size register
136
-- type   : sequential
137
-- inputs : Clk, rst_n
138
-- outputs: 
139
  FrameSize_reg : PROCESS (Clk, rst_n)
140
  BEGIN  -- process FrameSize_reg
141
    IF rst_n = '0' THEN                 -- asynchronous reset (active low)
142
      FrameSize     <= (OTHERS => '0');
143
      FrameSize_i   <= (OTHERS => '0');
144
    ELSIF Clk'event AND Clk = '1' THEN  -- rising clock edge
145
      IF load_FrSize = '1' THEN
146
        FrameSize   <= address - FCS_TYPE;
147
        FrameSize_i <= address - FCS_TYPE;
148
      END IF;
149
    END IF;
150
  END PROCESS FrameSize_reg;
151
-------------------------------------------------------------------------------
152
 
153
  -- purpose: fsm process
154
  -- type   : sequential
155
  -- inputs : Clk, rst_n
156
  -- outputs: 
157
  fsm_proc  : PROCESS (Clk, rst_n)
158
  BEGIN  -- process fsm_proc
159
    IF rst_n = '0' THEN                 -- asynchronous reset (active low)
160
      p_state  <= IDLE_st;
161
      Overflow <= '0';
162
      RxRdy    <= '0';
163
    ELSIF Clk'event AND Clk = '1' THEN  -- rising clock edge
164
      p_state  <= n_state;
165
      Overflow <= Overflow_i;
166
      RxRdy    <= RxRdy_i;
167
    END IF;
168
  END PROCESS fsm_proc;
169
-------------------------------------------------------------------------------
170
  -- purpose: FSM Combinational logic
171
  -- type   : combinational
172
  -- inputs : p_state,WrBuff,Rd
173
  -- outputs: 
174
  ReadWrite : PROCESS (p_state, WrBuff, Rd, EOF, FrameSize_i, address)
175
 
176
  BEGIN  -- PROCESS ReadWrite
177
 
178
    CASE p_state IS
179
 
180
      WHEN IDLE_st =>
181
        RxRdy_i     <= '0';
182
        load_FrSize <= '0';
183
        wr_i        <= NOT WrBuff;
184
        Overflow_i  <= '0';
185
        IF WrBuff = '1' THEN
186
          n_state   <= WRITE_st;
187
          en_Count  <= '1';
188
          rst_count <= '0';
189
        ELSE
190
          n_state   <= IDLE_st;
191
          en_Count  <= '0';
192
          rst_count <= '1';
193
        END IF;
194
 
195
      WHEN WRITE_st =>
196
        IF (Address = MAX_ADDRESS) THEN
197
          Overflow_i <= '1';
198
        ELSE
199
          Overflow_i <= '0';
200
        END IF;
201
 
202
 
203
--        RxRdy_i  <= '0';
204
        wr_i     <= NOT WrBuff;
205
        en_Count <= WrBuff;
206
 
207
        IF (EOF = '1') OR (address = MAX_ADDRESS) THEN
208
          RxRdy_i     <= '1';
209
          n_state     <= READ_st;
210
          load_FrSize <= '1';
211
          rst_count   <= '1';
212
        ELSE
213
          RxRdy_i     <= '0';
214
          n_state     <= WRITE_st;
215
          load_FrSize <= '0';
216
          rst_count   <= '0';
217
        END IF;
218
 
219
      WHEN READ_st =>
220
 
221
        wr_i        <= '1';
222
        en_Count    <= Rd;
223
        load_FrSize <= '0';
224
 
225
        IF address = FrameSize_i THEN
226
          Overflow_i   <= '0';
227
          RxRdy_i      <= '0';
228
          n_state      <= IDLE_st;
229
          rst_count    <= '1';
230
        ELSE
231
          IF (WrBuff = '1') THEN
232
            Overflow_i <= '1';
233
            n_state    <= WRITE_st;
234
            rst_count  <= '1';
235
          ELSE
236
            Overflow_i <= '0';
237
            n_state    <= READ_st;
238
            rst_count  <= '0';
239
          END IF;
240
          RxRdy_i      <= '1';
241
 
242
        END IF;
243
 
244
    END CASE;
245
 
246
  END PROCESS ReadWrite;
247
 
248
 
249
  Buff : Spmem_ent
250
    GENERIC MAP (
251
      USE_RESET   => FALSE,
252
      USE_CS      => FALSE,
253
      DEFAULT_OUT => '1',
254
      OPTION      => 0,
255
      ADD_WIDTH   => ADD_WIDTH,
256
      WIDTH       => 8)
257
    PORT MAP (
258
      cs          => cs,
259
      clk         => clk,
260
      reset       => rst_n,
261
      add         => Address,
262
      Data_In     => Data_In_i,
263
      Data_Out    => Data_Out_i,
264
      WR          => WR_i);
265
 
266
END RxBuff_rtl;

powered by: WebSVN 2.1.0

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