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

Subversion Repositories w11

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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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