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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [rtl/] [vlib/] [serport/] [serport_1clock.vhd] - Blame information for rev 24

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 19 wfjm
-- $Id: serport_1clock.vhd 476 2013-01-26 22:23:53Z mueller $
2 16 wfjm
--
3
-- Copyright 2011- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
--
5
-- This program is free software; you may redistribute and/or modify it under
6
-- the terms of the GNU General Public License as published by the Free
7
-- Software Foundation, either version 2, or at your option any later version.
8
--
9
-- This program is distributed in the hope that it will be useful, but
10
-- WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
-- for complete details.
13
--
14
------------------------------------------------------------------------------
15
-- Module Name:    serport_1clock - syn
16
-- Description:    serial port: serial port module, 1 clock domain
17
--
18
-- Dependencies:   serport_uart_rxtx_ab
19
--                 serport_xonrx
20
--                 serport_xontx
21
--                 memlib/fifo_1c_dram
22
-- Test bench:     -
23
-- Target Devices: generic
24
-- Tool versions:  xst 13.1; ghdl 0.29
25
--
26
-- Synthesized (xst):
27
-- Date         Rev  ise         Target      flop lutl lutm slic t peri
28
-- 2011-11-13   424 13.1    O40d xc3s1000-4   157  337   64  232 s  9.9
29
--
30
-- Revision History: 
31
-- Date         Rev Version  Comment
32
-- 2011-12-10   438   1.0.2  internal reset on abact
33
-- 2011-12-09   437   1.0.1  rename stat->moni port
34
-- 2011-11-13   424   1.0    Initial version
35
-- 2011-10-23   419   0.5    First draft
36
------------------------------------------------------------------------------
37
 
38
library ieee;
39
use ieee.std_logic_1164.all;
40
use ieee.numeric_std.all;
41
 
42
use work.slvtypes.all;
43 19 wfjm
use work.serportlib.all;
44 16 wfjm
use work.memlib.all;
45
 
46
entity serport_1clock is                -- serial port module, 1 clock domain
47
  generic (
48
    CDWIDTH : positive := 13;           -- clk divider width
49
    CDINIT : natural   := 15;           -- clk divider initial/reset setting
50
    RXFAWIDTH : natural :=  5;          -- rx fifo address width
51
    TXFAWIDTH : natural :=  5);         -- tx fifo address width
52
  port (
53
    CLK : in slbit;                     -- clock
54
    CE_MSEC : in slbit;                 -- 1 msec clock enable
55
    RESET : in slbit;                   -- reset
56
    ENAXON : in slbit;                  -- enable xon/xoff handling
57
    ENAESC : in slbit;                  -- enable xon/xoff escaping
58
    RXDATA : out slv8;                  -- receiver data out
59
    RXVAL : out slbit;                  -- receiver data valid
60
    RXHOLD : in slbit;                  -- receiver data hold
61
    TXDATA : in slv8;                   -- transmit data in
62
    TXENA : in slbit;                   -- transmit data enable
63
    TXBUSY : out slbit;                 -- transmit busy
64
    MONI : out serport_moni_type;       -- serport monitor port
65
    RXSD : in slbit;                    -- receive serial data (uart view)
66
    TXSD : out slbit;                   -- transmit serial data (uart view)
67
    RXRTS_N : out slbit;                -- receive rts (uart view, act.low)
68
    TXCTS_N : in slbit                  -- transmit cts (uart view, act.low)
69
  );
70
end serport_1clock;
71
 
72
 
73
architecture syn of serport_1clock is
74
 
75
  signal R_RXOK : slbit := '1';
76
 
77
  signal RESET_INT : slbit := '0';
78
 
79
  signal UART_RXDATA : slv8 := (others=>'0');
80
  signal UART_RXVAL : slbit := '0';
81
  signal UART_TXDATA : slv8 := (others=>'0');
82
  signal UART_TXENA : slbit := '0';
83
  signal UART_TXBUSY : slbit := '0';
84
 
85
  signal XONTX_TXENA : slbit := '0';
86
  signal XONTX_TXBUSY : slbit := '0';
87
 
88
  signal RXFIFO_DI : slv8 := (others=>'0');
89
  signal RXFIFO_ENA : slbit := '0';
90
  signal RXFIFO_BUSY : slbit := '0';
91
  signal RXFIFO_SIZE : slv(RXFAWIDTH downto 0) := (others=>'0');
92
  signal TXFIFO_DO : slv8 := (others=>'0');
93
  signal TXFIFO_VAL : slbit := '0';
94
  signal TXFIFO_HOLD : slbit := '0';
95
 
96
  signal RXERR  : slbit := '0';
97
  signal RXOVR  : slbit := '0';
98
  signal RXACT  : slbit := '0';
99
  signal ABACT  : slbit := '0';
100
  signal ABDONE : slbit := '0';
101
  signal ABCLKDIV : slv(CDWIDTH-1 downto 0) := (others=>'0');
102
 
103
  signal TXOK : slbit := '0';
104
  signal RXOK : slbit := '0';
105
 
106
begin
107
 
108
  assert CDWIDTH<=16
109
    report "assert(CDWIDTH<=16): max width of UART clock divider"
110
    severity failure;
111
 
112
  UART : serport_uart_rxtx_ab           -- uart, rx+tx+autobauder combo
113
  generic map (
114
    CDWIDTH => CDWIDTH,
115
    CDINIT  => CDINIT)
116
  port map (
117
    CLK      => CLK,
118
    CE_MSEC  => CE_MSEC,
119
    RESET    => RESET,
120
    RXSD     => RXSD,
121
    RXDATA   => UART_RXDATA,
122
    RXVAL    => UART_RXVAL,
123
    RXERR    => RXERR,
124
    RXACT    => RXACT,
125
    TXSD     => TXSD,
126
    TXDATA   => UART_TXDATA,
127
    TXENA    => UART_TXENA,
128
    TXBUSY   => UART_TXBUSY,
129
    ABACT    => ABACT,
130
    ABDONE   => ABDONE,
131
    ABCLKDIV => ABCLKDIV
132
  );
133
 
134
  RESET_INT <= RESET or ABACT;
135
 
136
  XONRX : serport_xonrx                 --  xon/xoff logic rx path
137
  port map (
138
    CLK         => CLK,
139
    RESET       => RESET_INT,
140
    ENAXON      => ENAXON,
141
    ENAESC      => ENAESC,
142
    UART_RXDATA => UART_RXDATA,
143
    UART_RXVAL  => UART_RXVAL,
144
    RXDATA      => RXFIFO_DI,
145
    RXVAL       => RXFIFO_ENA,
146
    RXHOLD      => RXFIFO_BUSY,
147
    RXOVR       => RXOVR,
148
    TXOK        => TXOK
149
  );
150
 
151
  XONTX : serport_xontx                 --  xon/xoff logic tx path
152
  port map (
153
    CLK         => CLK,
154
    RESET       => RESET_INT,
155
    ENAXON      => ENAXON,
156
    ENAESC      => ENAESC,
157
    UART_TXDATA => UART_TXDATA,
158
    UART_TXENA  => XONTX_TXENA,
159
    UART_TXBUSY => XONTX_TXBUSY,
160
    TXDATA      => TXFIFO_DO,
161
    TXENA       => TXFIFO_VAL,
162
    TXBUSY      => TXFIFO_HOLD,
163
    RXOK        => RXOK,
164
    TXOK        => TXOK
165
  );
166
 
167
  RXFIFO : fifo_1c_dram                 -- input fifo, 1 clock, dram based
168
  generic map (
169
    AWIDTH => RXFAWIDTH,
170
    DWIDTH => 8)
171
  port map (
172
    CLK   => CLK,
173
    RESET => RESET_INT,
174
    DI    => RXFIFO_DI,
175
    ENA   => RXFIFO_ENA,
176
    BUSY  => RXFIFO_BUSY,
177
    DO    => RXDATA,
178
    VAL   => RXVAL,
179
    HOLD  => RXHOLD,
180
    SIZE  => RXFIFO_SIZE
181
  );
182
 
183
  TXFIFO : fifo_1c_dram                 -- input fifo, 1 clock, dram based
184
  generic map (
185
    AWIDTH => TXFAWIDTH,
186
    DWIDTH => 8)
187
  port map (
188
    CLK   => CLK,
189
    RESET => RESET_INT,
190
    DI    => TXDATA,
191
    ENA   => TXENA,
192
    BUSY  => TXBUSY,
193
    DO    => TXFIFO_DO,
194
    VAL   => TXFIFO_VAL,
195
    HOLD  => TXFIFO_HOLD,
196
    SIZE  => open
197
  );
198
 
199
  -- receive back preasure
200
  --    on if fifo more than 3/4 full
201
  --   off if fifo less than 1/2 full
202
  proc_rxok: process (CLK)
203
    constant rxsize_rxok_off : slv3 := "011";
204
    constant rxsize_rxok_on  : slv3 := "010";
205
    variable rxsize_msb : slv3 := "000";
206
  begin
207
    if rising_edge(CLK) then
208
      if RESET_INT = '1' then
209
        R_RXOK <= '1';
210
      else
211
        rxsize_msb := RXFIFO_SIZE(RXFAWIDTH downto RXFAWIDTH-2);
212
        if unsigned(rxsize_msb) >=  unsigned(rxsize_rxok_off) then
213
          R_RXOK <= '0';
214
        elsif unsigned(rxsize_msb) <=  unsigned(rxsize_rxok_on) then
215
          R_RXOK <= '1';
216
        end if;
217
      end if;
218
    end if;
219
  end process proc_rxok;
220
 
221
  RXOK    <= R_RXOK;
222
  RXRTS_N <= not R_RXOK;
223
 
224
  proc_cts: process (TXCTS_N, XONTX_TXENA, UART_TXBUSY)
225
  begin
226
    if TXCTS_N = '0' then               -- transmit cts asserted
227
      UART_TXENA   <= XONTX_TXENA;
228
      XONTX_TXBUSY <= UART_TXBUSY;
229
    else                                -- transmit cts not asserted
230
      UART_TXENA   <= '0';
231
      XONTX_TXBUSY <= '1';
232
    end if;
233
  end process proc_cts;
234
 
235
  MONI.rxerr  <= RXERR;
236
  MONI.rxovr  <= RXOVR;
237
  MONI.rxact  <= RXACT;
238
  MONI.txact  <= UART_TXBUSY;
239
  MONI.abact  <= ABACT;
240
  MONI.abdone <= ABDONE;
241
  MONI.rxok   <= RXOK;
242
  MONI.txok   <= TXOK;
243
 
244
  proc_abclkdiv: process (ABCLKDIV)
245
  begin
246
    MONI.abclkdiv <= (others=>'0');
247
    MONI.abclkdiv(ABCLKDIV'range) <= ABCLKDIV;
248
  end process proc_abclkdiv;
249
 
250
end syn;

powered by: WebSVN 2.1.0

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