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

Subversion Repositories ahbmaster

[/] [ahbmaster/] [trunk/] [test79_AHBmaster/] [component/] [work/] [top/] [CoreUARTapb_0/] [rtl/] [vhdl/] [core/] [CoreUARTapb.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 uson
-- ********************************************************************
2
-- Actel Corporation Proprietary and Confidential
3
--  Copyright 2008 Actel Corporation.  All rights reserved.
4
--
5
-- ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
6
-- ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
7
-- IN ADVANCE IN WRITING.
8
--
9
-- Description: top_CoreUARTapb_0_COREUART/ CoreUARTapb UART core
10
--
11
--
12
--  Revision Information:
13
-- Date     Description
14
-- Jun09    Revision 4.1
15
-- Aug10    Revision 4.2
16
--
17
 
18
-- SVN Revision Information:
19
-- SVN $Revision: 8508 $
20
-- SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
21
--
22
-- Resolved SARs
23
-- SAR      Date     Who   Description
24
-- 20741    2Sep10   AS    Increased baud rate by ensuring fifo ctrl runs off
25
--                         sys clk (not baud clock).  See note below.
26
-- 22093    7Spe10   AS    Missind PSLVERR and PREADY signals added
27
 
28
-- Notes:
29
-- best viewed with tabstops set to "4"
30
--
31
--
32
--
33
--==============================================================================
34
-- AMBA APB wrapped COREUART
35
--
36
-- Three control registers and one status register are implemented in this file
37
-- i.e. at the wrapper level.
38
-- Transmit and receive data registers are located in the UART module which is
39
-- instantiated in this file.
40
--
41
-- A separate word location is used for each (8-bit) register.
42
--
43
--
44
-- Address Map:
45
--
46
--     Offset    Register Name       Read/Write         Width
47
--     -------------------------------------------------------
48
--      0x00     Transmit data       (Write only)       8 bits
49
--      0x04     Receive data        (Read only)        8 bits
50
--      0x08     Control Register 1  (R/W)              8 bits
51
--      0x0C     Control Register 2  (R/W)              3 bits
52
--      0x10     Status Register     (Read Only)        4 bits
53
--      0x14     Control Register 3  (R/W)              3 bits
54
--
55
--==============================================================================
56
LIBRARY IEEE;
57
USE IEEE.std_logic_1164.all;
58
USE IEEE.std_logic_arith.all;
59
USE IEEE.std_logic_unsigned.all;
60
use work.top_CoreUARTapb_0_coreuart_pkg.all;
61
 
62
ENTITY top_CoreUARTapb_0_CoreUARTapb IS
63
   GENERIC (
64
      RX_LEGACY_MODE                 :  integer := 0;
65
      -- DEVICE FAMILY
66
      FAMILY                         :  integer := 15;
67
      -- UART configuration parameters
68
      TX_FIFO                        :  integer := 0;    --  1 = with tx fifo, 0 = without tx fifo
69
      RX_FIFO                        :  integer := 0;    --  1 = with rx fifo, 0 = without rx fifo
70
      BAUD_VALUE                     :  integer := 0;    --  Baud value is set only when fixed buad rate is selected
71
      FIXEDMODE                      :  integer := 0;    --  fixed or programmable mode, 0: programmable; 1:fixed
72
      PRG_BIT8                       :  integer := 0;    --  This bit value is selected only when FIXEDMODE is set to 1
73
      PRG_PARITY                     :  integer := 0;    --  This bit value is selected only when FIXEDMODE is set to 1
74
      BAUD_VAL_FRCTN                 :  integer := 0;    --  0 = +0.0, 1 = +0.125, 2 = +0.25, 3 = +0.375, 4 = +0.5, 5 = +0.625, 6 = +0.75, 7 = +0.875,
75
      BAUD_VAL_FRCTN_EN              :  integer := 0     --  1 = enable baud fraction, 0 = disable baud fraction
76
);
77
   PORT (
78
      -- Inputs and Outputs
79
-- APB signals
80
 
81
      PCLK                    : IN std_logic;   --  APB system clock
82
      PRESETN                 : IN std_logic;   --  APB system reset
83
      PADDR                   : IN std_logic_vector(4 DOWNTO 0);   --  Address
84
      PSEL                    : IN std_logic;   --  Peripheral select signal
85
      PENABLE                 : IN std_logic;   --  Enable (data valid strobe)
86
      PWRITE                  : IN std_logic;   --  Write/nRead signal
87
      PWDATA                  : IN std_logic_vector(7 DOWNTO 0);   --  8 bit write data
88
      PRDATA                  : OUT std_logic_vector(7 DOWNTO 0);   --  8 bit read data
89
 
90
      -- AS: Added PREADY and PSLVERR
91
      PREADY                  : OUT std_logic;   -- APB READY signal (tied to 1)
92
      PSLVERR                 : OUT std_logic;   -- APB slave error signal (tied to 0)
93
 
94
      -- transmit ready and receive full indicators
95
 
96
      TXRDY                   : OUT std_logic;
97
      RXRDY                   : OUT std_logic;
98
      -- FLAGS
99
 
100
      FRAMING_ERR             : OUT std_logic;
101
      PARITY_ERR              : OUT std_logic;
102
      OVERFLOW                : OUT std_logic;
103
      -- Serial receive and transmit data
104
 
105
      RX                      : IN std_logic;
106
      TX                      : OUT std_logic
107
);
108
END ENTITY top_CoreUARTapb_0_CoreUARTapb;
109
 
110
ARCHITECTURE translated OF top_CoreUARTapb_0_CoreUARTapb IS
111
 
112
   COMPONENT top_CoreUARTapb_0_COREUART
113
      GENERIC (
114
          RX_LEGACY_MODE    : integer;
115
          TX_FIFO           : integer;
116
          RX_FIFO           : integer;
117
          BAUD_VAL_FRCTN_EN : integer;
118
                  FAMILY            : integer);
119
      PORT (
120
         RESET_N                 : IN  std_logic;
121
         CLK                     : IN  std_logic;
122
         WEN                     : IN  std_logic;
123
         OEN                     : IN  std_logic;
124
         CSN                     : IN  std_logic;
125
         DATA_IN                 : IN  std_logic_vector(7 DOWNTO 0);
126
         RX                      : IN  std_logic;
127
         BAUD_VAL                : IN  std_logic_vector(12 DOWNTO 0);
128
         BIT8                    : IN  std_logic;
129
         PARITY_EN               : IN  std_logic;
130
         ODD_N_EVEN              : IN  std_logic;
131
         BAUD_VAL_FRACTION       : IN  std_logic_vector(2 DOWNTO 0);
132
         PARITY_ERR              : OUT std_logic;
133
         OVERFLOW                : OUT std_logic;
134
         TXRDY                   : OUT std_logic;
135
         RXRDY                   : OUT std_logic;
136
         DATA_OUT                : OUT std_logic_vector(7 DOWNTO 0);
137
         TX                      : OUT std_logic;
138
         FRAMING_ERR             : OUT std_logic);
139
   END COMPONENT;
140
 
141
   ------------------------------------------------------------------------
142
   -- Constant declarations
143
   ------------------------------------------------------------------------
144
  -- Sync/Async Mode Select
145
  CONSTANT SYNC_RESET : INTEGER := SYNC_MODE_SEL(FAMILY);
146
   ------------------------------------------------------------------------
147
   -- Signal declarations
148
   ------------------------------------------------------------------------
149
   -- I/O signals
150
   -- Internal signals
151
   SIGNAL controlReg1              :  std_logic_vector(7 DOWNTO 0);
152
   SIGNAL controlReg2              :  std_logic_vector(7 DOWNTO 0);
153
   SIGNAL controlReg3              :  std_logic_vector(2 DOWNTO 0);
154
   SIGNAL NxtPrdata                :  std_logic_vector(7 DOWNTO 0);
155
   SIGNAL iPRDATA                  :  std_logic_vector(7 DOWNTO 0);
156
   SIGNAL NxtPrdataEn              :  std_logic;   --   valid read
157
   SIGNAL data_in                  :  std_logic_vector(7 DOWNTO 0);
158
   SIGNAL data_out                 :  std_logic_vector(7 DOWNTO 0);
159
   SIGNAL baud_val                 :  std_logic_vector(12 DOWNTO 0);
160
   SIGNAL bit8                     :  std_logic;
161
   SIGNAL parity_en                :  std_logic;
162
   SIGNAL odd_n_even               :  std_logic;
163
   SIGNAL WEn                      :  std_logic;
164
   SIGNAL OEn                      :  std_logic;
165
   SIGNAL csn                      :  std_logic;
166
   SIGNAL gen_parity_en            :  std_logic_vector(1 DOWNTO 0);
167
   SIGNAL prg_parity_en            :  std_logic;
168
   SIGNAL prg_odd_even             :  std_logic;
169
   -- block: p_CtrlReg1Seq
170
   SIGNAL temp_xhdl10              :  std_logic_vector(12 DOWNTO 0);
171
   -- block: p_CtrlReg2Seq
172
   SIGNAL temp_xhdl11              :  std_logic;
173
   SIGNAL temp_xhdl12              :  std_logic;
174
   SIGNAL temp_xhdl13              :  std_logic;
175
   SIGNAL PRDATA_xhdl1             :  std_logic_vector(7 DOWNTO 0);
176
   SIGNAL TXRDY_xhdl2              :  std_logic;
177
   SIGNAL RXRDY_xhdl3              :  std_logic;
178
   SIGNAL TX_xhdl4                 :  std_logic;
179
   SIGNAL PARITY_ERR_xhdl5         :  std_logic;
180
   SIGNAL OVERFLOW_xhdl6           :  std_logic;
181
   SIGNAL FRAMING_ERR_i            :  std_logic;
182
 
183
   SIGNAL fixed_baudval_fraction   :  std_logic_vector(2 DOWNTO 0);
184
   SIGNAL baudval_fraction         :  std_logic_vector(2 DOWNTO 0);
185
   SIGNAL aresetn                  :  std_logic;
186
   SIGNAL sresetn                  :  std_logic;
187
 
188
   FUNCTION CONV_STD_LOGIC (
189
      val      : IN integer) RETURN std_logic IS
190
   BEGIN
191
      IF (val = 1) THEN
192
         RETURN('1');
193
      ELSE
194
         RETURN('0');
195
      END IF;
196
   END CONV_STD_LOGIC;
197
 
198
BEGIN
199
   aresetn <= '1' WHEN (SYNC_RESET=1) ELSE PRESETN;
200
   sresetn <= PRESETN WHEN (SYNC_RESET=1) ELSE '1';
201
   -- AS: added APB3 signals, unused
202
   PSLVERR <= '0';
203
   PREADY <= '1';
204
 
205
   PRDATA <= PRDATA_xhdl1;
206
   TXRDY <= TXRDY_xhdl2;
207
   RXRDY <= RXRDY_xhdl3;
208
   TX <= TX_xhdl4;
209
   PARITY_ERR <= PARITY_ERR_xhdl5;
210
   FRAMING_ERR <= FRAMING_ERR_i;
211
   OVERFLOW <= OVERFLOW_xhdl6;
212
 
213
   ------------------------------------------------------------------------
214
   -- Write enable, output enable and select signals for UART
215
   ------------------------------------------------------------------------
216
   -- WEn only asserted (low) when writing transmit data
217
   WEn <= '0' when (PENABLE = '1' and
218
                     PWRITE = '1' and
219
                     PADDR(4 DOWNTO 2) = "000") else
220
           '1';
221
   -- OEn only asserted (low) when reading received data
222
   OEn <= '0' when (PENABLE = '1' and
223
                     PWRITE = '0' and
224
                     PADDR(4 DOWNTO 2) = "001") else
225
           '1';
226
   csn <= NOT PSEL ;
227
   -- data_in input to UART is used for transmit data
228
   data_in <= PWDATA ;
229
   ------------------------------------------------------------------------
230
   -- APB read data
231
   ------------------------------------------------------------------------
232
   -- NxtPrdataEn is asserted during the first cycle of a valid read
233
   NxtPrdataEn <= (PSEL AND NOT PWRITE) AND (NOT PENABLE OR PARITY_ERR_xhdl5) ;
234
 
235
   p_NxtPrdataComb : PROCESS (PADDR, NxtPrdataEn, iPRDATA, data_out,
236
   controlReg1, controlReg2, controlReg3, OVERFLOW_xhdl6, PARITY_ERR_xhdl5,
237
   RXRDY_xhdl3, TXRDY_xhdl2, FRAMING_ERR_i)
238
      VARIABLE NxtPrdata_xhdl7  : std_logic_vector(7 DOWNTO 0);
239
   BEGIN
240
      IF (NxtPrdataEn = '1') THEN
241
         CASE PADDR(4 DOWNTO 2) IS
242
            WHEN "000" =>
243
                     NxtPrdata_xhdl7 := "00000000";    --  transmit data location reads as 0x00
244
            WHEN "001" =>
245
                     NxtPrdata_xhdl7 := data_out;    --  received data
246
            WHEN "010" =>
247
                     NxtPrdata_xhdl7 := controlReg1;    --  control reg 1 - baud value
248
            WHEN "011" =>
249
                     NxtPrdata_xhdl7 := controlReg2;    --  control reg 2 - bit8, parity_en, odd_n_even
250
            WHEN "100" =>
251
                     NxtPrdata_xhdl7 := "000" & FRAMING_ERR_i & OVERFLOW_xhdl6 & PARITY_ERR_xhdl5 & RXRDY_xhdl3 & TXRDY_xhdl2;    --  status register
252
            WHEN "101" =>
253
                     NxtPrdata_xhdl7 := "00000" & controlReg3;    --  control reg 3 - fractional part of baud value
254
            WHEN OTHERS  =>
255
                     NxtPrdata_xhdl7 := iPRDATA;
256
         END CASE;
257
      ELSE
258
         NxtPrdata_xhdl7 := iPRDATA;
259
      END IF;
260
      NxtPrdata <= NxtPrdata_xhdl7;
261
   END PROCESS p_NxtPrdataComb;
262
 
263
   -- block: p_NxtPrdataComb
264
 
265
   gen_parity_en <= CONV_STD_LOGIC_VECTOR(PRG_PARITY, 2) ;
266
 
267
   prg_parity_en <= '1' when (gen_parity_en = "01" or gen_parity_en = "10") else '0';
268
   prg_odd_even <= '1' when (gen_parity_en = "01") else '0';
269
 
270
 
271
   -- PRDATA output register
272
 
273
   p_iPRDATASeq : PROCESS (PCLK, aresetn)
274
   BEGIN
275
      IF (NOT aresetn = '1') THEN
276
         iPRDATA <= "00000000";
277
      ELSIF (PCLK'EVENT AND PCLK = '1') THEN
278
         IF (NOT sresetn = '1') THEN
279
            iPRDATA <= "00000000";
280
             ELSE
281
            iPRDATA <= NxtPrdata;
282
         END IF;
283
      END IF;
284
   END PROCESS p_iPRDATASeq;
285
   -- block: p_iPRDATASeq
286
   -- Drive output with internal version.
287
   PRDATA_xhdl1 <= data_out WHEN ((RX_FIFO = 1) AND (PARITY_ERR_xhdl5 = '1')) ELSE iPRDATA ;
288
 
289
   ------------------------------------------------------------------------
290
   -- Control register 1
291
   -- Holds 8-bit value to set baud rate.
292
   ------------------------------------------------------------------------
293
 
294
   p_CtrlReg1Seq : PROCESS (PCLK, aresetn)
295
   BEGIN
296
      IF (NOT aresetn = '1') THEN
297
         controlReg1 <= "00000000";
298
      ELSIF (PCLK'EVENT AND PCLK = '1') THEN
299
          IF (NOT sresetn = '1') THEN
300
             controlReg1 <= "00000000";
301
              ELSE
302
             if (PSEL = '1' and PENABLE = '1' and PWRITE = '1' and PADDR(4 downto 2) = "010") THEN
303
                controlReg1 <= PWDATA;
304
             ELSE
305
                controlReg1 <= controlReg1;
306
             END IF;
307
          END IF;
308
      END IF;
309
   END PROCESS p_CtrlReg1Seq;
310
   temp_xhdl10 <= CONV_STD_LOGIC_VECTOR(BAUD_VALUE, 13) WHEN FIXEDMODE /= 0 ELSE controlReg2(7 downto 3) & controlReg1;
311
   baud_val <= temp_xhdl10 ;
312
 
313
   ------------------------------------------------------------------------
314
   -- Control register 2
315
   -- Contents as follows:
316
   --   Bit 0: bit8        Data width is 8 bits when '1', 7 bits otherwise.
317
   --   Bit 1: parity_en   Parity enabled when '1'.
318
   --   Bit 2: odd_n_even  Odd parity when '1', even parity when '0'.
319
   --   Bits 3 to 7: Unused.
320
   ------------------------------------------------------------------------
321
 
322
   p_CtrlReg2Seq : PROCESS (PCLK, aresetn)
323
   BEGIN
324
      IF (NOT aresetn = '1') THEN
325
         controlReg2 <= "00000000";
326
      ELSIF (PCLK'EVENT AND PCLK = '1') THEN
327
         IF (NOT sresetn = '1') THEN
328
            controlReg2 <= "00000000";
329
             ELSE
330
            IF (PSEL = '1' and PENABLE = '1' and PWRITE = '1' and PADDR(4 downto 2) = "011") THEN
331
               controlReg2 <= PWDATA(7 DOWNTO 0);
332
            ELSE
333
               controlReg2 <= controlReg2;
334
            END IF;
335
         END IF;
336
      END IF;
337
   END PROCESS p_CtrlReg2Seq;
338
 
339
    ----------------------------------------------------------------------
340
    -- Control register 3
341
    -- Controls the fractional baud value as follows:
342
    --   000:   Baud Value = baud_val + 0.0
343
    --   001:   Baud Value = baud_val + 0.125
344
    --   010:   Baud Value = baud_val + 0.25
345
    --   011:   Baud Value = baud_val + 0.375
346
    --   100:   Baud Value = baud_val + 0.5
347
    --   101:   Baud Value = baud_val + 0.625
348
    --   110:   Baud Value = baud_val + 0.75
349
    --   111:   Baud Value = baud_val + 0.875
350
    ----------------------------------------------------------------------
351
 
352
UG08:IF (BAUD_VAL_FRCTN_EN = 1) GENERATE
353
    p_CtrlReg3Seq: PROCESS(PCLK, aresetn)
354
    BEGIN
355
      IF (NOT aresetn = '1') THEN
356
         controlReg3 <= "000";
357
      ELSIF (PCLK'EVENT AND PCLK = '1') THEN
358
         IF (NOT sresetn = '1') THEN
359
            controlReg3 <= "000";
360
             ELSE
361
            if (PSEL = '1' and PENABLE = '1' and PWRITE = '1' and PADDR(4 downto 2) = "101") THEN
362
               controlReg3 <= PWDATA(2 DOWNTO 0);
363
            ELSE
364
               controlReg3 <= controlReg3;
365
            END IF;
366
         END IF;
367
      END IF;
368
   END PROCESS p_CtrlReg3Seq;
369
END GENERATE;
370
 
371
--Sets fractional part of baud value
372
 fixed_baudval_fraction <= "000" WHEN BAUD_VAL_FRCTN = 0 ELSE
373
                           "001" WHEN BAUD_VAL_FRCTN = 1 ELSE
374
                           "010" WHEN BAUD_VAL_FRCTN = 2 ELSE
375
                           "011" WHEN BAUD_VAL_FRCTN = 3 ELSE
376
                           "100" WHEN BAUD_VAL_FRCTN = 4 ELSE
377
                           "101" WHEN BAUD_VAL_FRCTN = 5 ELSE
378
                           "110" WHEN BAUD_VAL_FRCTN = 6 ELSE
379
                           "111" WHEN BAUD_VAL_FRCTN = 7 ELSE
380
                           "000";
381
 
382
   temp_xhdl11 <= CONV_STD_LOGIC(PRG_BIT8) WHEN FIXEDMODE /= 0 ELSE
383
   controlReg2(0);
384
   bit8 <= temp_xhdl11 ;
385
   temp_xhdl12 <= prg_parity_en WHEN FIXEDMODE /= 0 ELSE controlReg2(1)
386
   ;
387
   parity_en <= temp_xhdl12 ;
388
   temp_xhdl13 <= prg_odd_even WHEN FIXEDMODE /= 0 ELSE controlReg2(2);
389
   odd_n_even <= temp_xhdl13 ;
390
 
391
   baudval_fraction <= fixed_baudval_fraction WHEN FIXEDMODE /= 0 ELSE controlReg3 WHEN BAUD_VAL_FRCTN_EN /= 0 ELSE "000";
392
 
393
   ------------------------------------------------------------------------
394
   -- Instantiation of UART
395
   ------------------------------------------------------------------------
396
   uUART : top_CoreUARTapb_0_COREUART
397
      GENERIC MAP (
398
         RX_LEGACY_MODE => RX_LEGACY_MODE,
399
         RX_FIFO => RX_FIFO,
400
         TX_FIFO => TX_FIFO,
401
         BAUD_VAL_FRCTN_EN => BAUD_VAL_FRCTN_EN,
402
                 FAMILY => FAMILY)
403
      PORT MAP (
404
         RESET_N => PRESETN,
405
         CLK => PCLK,
406
         WEN => WEn,
407
         OEN => OEn,
408
         CSN => csn,
409
         DATA_IN => data_in,
410
         RX => RX,
411
         BAUD_VAL => baud_val,
412
         BIT8 => bit8,
413
         PARITY_EN => parity_en,
414
         ODD_N_EVEN => odd_n_even,
415
         PARITY_ERR => PARITY_ERR_xhdl5,
416
         OVERFLOW => OVERFLOW_xhdl6,
417
         TXRDY => TXRDY_xhdl2,
418
         RXRDY => RXRDY_xhdl3,
419
         DATA_OUT => data_out,
420
         TX => TX_xhdl4,
421
         FRAMING_ERR => FRAMING_ERR_i,
422
         BAUD_VAL_FRACTION => baudval_fraction);
423
 
424
END ARCHITECTURE translated;

powered by: WebSVN 2.1.0

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