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

Subversion Repositories ahbmaster

[/] [ahbmaster/] [trunk/] [test79_AHBmaster/] [component/] [work/] [top/] [CoreUARTapb_0/] [rtl/] [vhdl/] [core/] [Tx_async.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: CoreUART/ CoreUARTapb UART core
10
--
11
--
12
--  Revision Information:
13
-- Date     Description
14
-- Jun09    Revision 4.1
15
-- Aug10    Revision 4.2
16
 
17
-- SVN Revision Information:
18
-- SVN $Revision: 8508 $
19
-- SVN $Date: 2009-06-15 16:49:49 -0700 (Mon, 15 Jun 2009) $
20
--
21
-- Resolved SARs
22
-- SAR      Date     Who   Description
23
-- 20741    2Sep10   AS    Increased baud rate by ensuring fifo ctrl runs off
24
--                         sys clk (not baud clock).  See note below.
25
 
26
-- Notes:
27
-- best viewed with tabstops set to "4"
28
LIBRARY IEEE;
29
USE IEEE.std_logic_1164.all;
30
USE IEEE.std_logic_arith.all;
31
USE IEEE.std_logic_unsigned.all;
32
 
33
ENTITY top_CoreUARTapb_0_Tx_async IS
34
  GENERIC ( SYNC_RESET       : integer := 0;
35
            -- TX Parameters
36
            TX_FIFO          : integer := 0);    --  0=without tx fifo
37
  PORT (
38
         --  1=with tx fifo
39
 
40
         clk                     : IN std_logic;
41
         xmit_pulse              : IN std_logic;
42
         reset_n                 : IN std_logic;
43
         rst_tx_empty            : IN std_logic;
44
         tx_hold_reg             : IN std_logic_vector(7 DOWNTO 0);
45
         tx_dout_reg             : IN std_logic_vector(7 DOWNTO 0);
46
         fifo_empty              : IN std_logic;
47
         fifo_full               : IN std_logic;
48
         bit8                    : IN std_logic;
49
         parity_en               : IN std_logic;
50
         odd_n_even              : IN std_logic;
51
         txrdy                   : OUT std_logic;
52
         tx                      : OUT std_logic;
53
         fifo_read_tx            : OUT std_logic);
54
END ENTITY top_CoreUARTapb_0_Tx_async;
55
 
56
ARCHITECTURE translated OF top_CoreUARTapb_0_Tx_async IS
57
 
58
 
59
  CONSTANT  tx_idle               :  integer := 0;
60
  CONSTANT  tx_load               :  integer := 1;
61
  CONSTANT  start_bit             :  integer := 2;
62
  CONSTANT  tx_data_bits          :  integer := 3;
63
  CONSTANT  parity_bit            :  integer := 4;
64
  CONSTANT  tx_stop_bit           :  integer := 5;
65
  CONSTANT  delay_state           :  integer := 6;
66
  SIGNAL xmit_state               :  integer;   --  transmit state machine
67
  SIGNAL txrdy_int                :  std_logic;   --  transmit ready for another byte
68
  SIGNAL tx_byte                  :  std_logic_vector(7 DOWNTO 0);   --  transmit byte
69
  SIGNAL xmit_bit_sel             :  std_logic_vector(3 DOWNTO 0);   --  selects transmit bit
70
  SIGNAL tx_parity                :  std_logic;   --  transmit parity
71
                                                  -- AS: Removed deprecated signals due to SARfix for v4.2 
72
  SIGNAL fifo_read_en0            :  std_logic;
73
  --SIGNAL fifo_read_en1            :  std_logic;
74
  --SIGNAL fifo_read_en             :  std_logic;
75
  SIGNAL txrdy_xhdl1              :  std_logic;
76
  SIGNAL tx_xhdl2                 :  std_logic;
77
  --SIGNAL fifo_read_tx_xhdl3       :  std_logic;
78
  SIGNAL aresetn                  :  std_logic;
79
  SIGNAL sresetn                  :  std_logic;
80
 
81
  FUNCTION to_integer (
82
  val      : std_logic_vector) RETURN integer IS
83
 
84
    CONSTANT vec      : std_logic_vector(val'high-val'low DOWNTO 0) := val;
85
    VARIABLE rtn      : integer := 0;
86
  BEGIN
87
    FOR index IN vec'RANGE LOOP
88
      IF (vec(index) = '1') THEN
89
        rtn := rtn + (2**index);
90
      END IF;
91
    END LOOP;
92
    RETURN(rtn);
93
  END to_integer;
94
 
95
BEGIN
96
  aresetn <= '1' WHEN (SYNC_RESET=1) ELSE reset_n;
97
  sresetn <= reset_n WHEN (SYNC_RESET=1) ELSE '1';
98
  txrdy <= txrdy_xhdl1;
99
  tx <= tx_xhdl2;
100
 
101
  -- Modified Sep 2006, ROK
102
  -- ----------------------------------------------------------
103
  -- AS, Sep10: synchronized to start bit, rather than load bit
104
  -- since txload now happens on start bit state
105
  make_txrdy : PROCESS (clk, aresetn)
106
  BEGIN
107
    IF (NOT aresetn = '1') THEN
108
      txrdy_int <= '1';
109
    ELSIF (clk'EVENT AND clk = '1') THEN
110
      IF (NOT sresetn = '1') THEN
111
        txrdy_int <= '1';
112
          ELSE
113
        IF (TX_FIFO = 2#0#) THEN
114
          IF (xmit_pulse = '1') THEN
115
            IF (xmit_state = start_bit) THEN
116
              txrdy_int <= '1';
117
            END IF;
118
          END IF;
119
          IF (rst_tx_empty = '1') THEN
120
            txrdy_int <= '0';
121
          END IF;
122
        ELSE
123
          txrdy_int <= NOT fifo_full;
124
        END IF;
125
      END IF;
126
    END IF;
127
  END PROCESS make_txrdy;
128
 
129
  -- Modified Sep10, AS
130
  -- FIFO load state transitions and outputs register on system clock
131
  -- (clk) instead of baud clock
132
  xmit_sm : PROCESS (clk, aresetn)
133
  BEGIN
134
    IF (NOT aresetn = '1') THEN
135
      xmit_state <= tx_idle;
136
      tx_byte <= "00000000";
137
      fifo_read_en0 <= '1';
138
    ELSIF (clk'EVENT AND clk = '1') THEN
139
      IF (NOT sresetn = '1') THEN
140
        xmit_state <= tx_idle;
141
        tx_byte <= "00000000";
142
        fifo_read_en0 <= '1';
143
          ELSE
144
        -- AS:
145
        -- (1) state on sysclk for tx_idle, tx_load, delay_state since these operations run
146
        -- off the system clock, not the baud clock
147
        -- (2) perform tx byte load on start bit state to ensure that data is
148
        -- valid at that point
149
        IF (xmit_pulse = '1' OR xmit_state = tx_idle OR xmit_state = delay_state OR xmit_state = tx_load) THEN
150
          fifo_read_en0 <= '1';
151
          CASE xmit_state IS
152
            WHEN tx_idle =>
153
              IF (TX_FIFO = 2#0#) THEN
154
                IF (NOT txrdy_int = '1') THEN
155
                  xmit_state <= tx_load;
156
                ELSE
157
                  xmit_state <= tx_idle;
158
                END IF;
159
              ELSE
160
                IF (fifo_empty = '0') THEN
161
                  fifo_read_en0 <= '0';
162
                  xmit_state <= delay_state;
163
                ELSE
164
                  xmit_state <= tx_idle;
165
                  fifo_read_en0 <= '1';
166
                END IF;
167
              END IF;
168
            WHEN tx_load =>
169
              xmit_state <= start_bit;
170
            WHEN start_bit =>
171
              IF (TX_FIFO = 2#0#) THEN
172
                tx_byte <= tx_hold_reg;
173
              ELSE
174
                tx_byte <= tx_dout_reg;
175
              END IF;
176
              xmit_state <= tx_data_bits;
177
            WHEN tx_data_bits =>
178
              IF (bit8 = '1') THEN
179
                IF (xmit_bit_sel = "0111") THEN
180
                  IF (parity_en = '1') THEN
181
                    xmit_state <= parity_bit;
182
                  ELSE
183
                    xmit_state <= tx_stop_bit;
184
                  END IF;
185
                ELSE
186
                  xmit_state <= tx_data_bits;
187
                END IF;
188
              ELSE
189
                IF (xmit_bit_sel = "0110") THEN
190
                  IF (parity_en = '1') THEN
191
                    xmit_state <= parity_bit;
192
                  ELSE
193
                    xmit_state <= tx_stop_bit;
194
                  END IF;
195
                ELSE
196
                  xmit_state <= tx_data_bits;
197
                END IF;
198
              END IF;
199
            WHEN parity_bit =>
200
              xmit_state <= tx_stop_bit;
201
            WHEN tx_stop_bit =>
202
              xmit_state <= tx_idle;
203
            WHEN delay_state =>
204
              xmit_state <= tx_load;
205
            WHEN OTHERS  =>
206
              xmit_state <= tx_idle;
207
 
208
          END CASE;
209
        END IF;
210
      END IF;
211
    END IF;
212
  END PROCESS xmit_sm;
213
 
214
    -- AS: Need to remove clock delay of fifo read, since tx_load state is
215
    -- registered on sys clk now and fifo_read_en needs to be made available
216
    -- immediately
217
 
218
    -- Added by Hari
219
 
220
    --  read_fifo : PROCESS (clk, reset_n)
221
    --  BEGIN
222
    --    IF (NOT reset_n = '1') THEN
223
    --      fifo_read_tx_xhdl3 <= '1';
224
    --      fifo_read_en1 <= '1';
225
    --    ELSIF (clk'EVENT AND clk = '1') THEN
226
    --      fifo_read_tx_xhdl3 <= '1';
227
    --      fifo_read_en1 <= fifo_read_en0;
228
    --      IF (fifo_read_en = '0') THEN
229
    --        fifo_read_tx_xhdl3 <= '0';
230
    --      END IF;
231
    --    END IF;
232
    --  END PROCESS read_fifo;
233
    --  fifo_read_en <= NOT fifo_read_en1 OR fifo_read_en0 ;
234
  fifo_read_tx <= fifo_read_en0;
235
 
236
  xmit_cnt : PROCESS (clk, aresetn)
237
  BEGIN
238
    IF (NOT aresetn = '1') THEN
239
      xmit_bit_sel <= "0000";
240
    ELSIF (clk'EVENT AND clk = '1') THEN
241
      IF (NOT sresetn = '1') THEN
242
        xmit_bit_sel <= "0000";
243
          ELSE
244
        IF (xmit_pulse = '1') THEN
245
          IF (xmit_state /= tx_data_bits) THEN
246
            xmit_bit_sel <= "0000";
247
          ELSE
248
            xmit_bit_sel <= xmit_bit_sel + "0001";
249
          END IF;
250
        END IF;
251
      END IF;
252
    END IF;
253
  END PROCESS xmit_cnt;
254
 
255
  xmit_sel : PROCESS (clk, aresetn)
256
  BEGIN
257
    IF (NOT aresetn = '1') THEN
258
      tx_xhdl2 <= '1';
259
    ELSIF (clk'EVENT AND clk = '1') THEN
260
      IF (NOT sresetn = '1') THEN
261
        tx_xhdl2 <= '1';
262
          ELSE
263
        -- AS:
264
        -- state on sysclk for tx_idle, tx_load, delay_state since these operations run
265
        -- off the system clock, not the baud clock
266
        IF (xmit_pulse = '1' OR xmit_state = tx_idle OR xmit_state = delay_state OR xmit_state = tx_load) THEN
267
          CASE xmit_state IS
268
            WHEN tx_idle =>
269
              tx_xhdl2 <= '1';
270
            WHEN tx_load =>
271
              tx_xhdl2 <= '1';
272
            WHEN start_bit =>
273
              tx_xhdl2 <= '0';
274
            WHEN tx_data_bits =>
275
              --tx <= tx_byte[conv_integer(xmit_bit_sel)] ;
276
 
277
              tx_xhdl2 <= tx_byte(to_integer(xmit_bit_sel));
278
            WHEN parity_bit =>
279
              tx_xhdl2 <= odd_n_even XOR tx_parity;
280
            --when parity_bit    => if(ODD_N_EVEN = '1') then
281
            --                        tx <= not tx_parity;
282
            --                      else
283
            --                        tx <= tx_parity;
284
            --                      end if;
285
 
286
            WHEN tx_stop_bit =>
287
              tx_xhdl2 <= '1';
288
            WHEN OTHERS  =>
289
              tx_xhdl2 <= '1';
290
 
291
          END CASE;
292
        END IF;
293
      END IF;
294
    END IF;
295
  END PROCESS xmit_sel;
296
 
297
  xmit_par_calc : PROCESS (clk, aresetn)
298
  BEGIN
299
    IF (NOT aresetn = '1') THEN
300
      tx_parity <= '0';
301
    ELSIF (clk'EVENT AND clk = '1') THEN
302
      IF (NOT sresetn = '1') THEN
303
        tx_parity <= '0';
304
          ELSE
305
        IF ((xmit_pulse AND parity_en) = '1') THEN
306
          IF (xmit_state = tx_data_bits) THEN
307
            --tx_parity <= tx_parity ^ tx_byte[conv_integer(xmit_bit_sel)] ;
308
 
309
            tx_parity <= tx_parity XOR tx_byte(to_integer(xmit_bit_sel));
310
          ELSE
311
            tx_parity <= tx_parity;
312
          END IF;
313
        END IF;
314
        IF (xmit_state = tx_stop_bit) THEN
315
          tx_parity <= '0';
316
        END IF;
317
      END IF;
318
    END IF;
319
  END PROCESS xmit_par_calc;
320
  txrdy_xhdl1 <= txrdy_int ;
321
 
322
END ARCHITECTURE translated;

powered by: WebSVN 2.1.0

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