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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [processor/] [VHDL/] [ext_modules/] [ext_miniUART/] [ext_miniUART.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 jlechner
-----------------------------------------------------------------------
2
-- This file is part of SCARTS.
3
-- 
4
-- SCARTS is free software: you can redistribute it and/or modify
5
-- it under the terms of the GNU General Public License as published by
6
-- the Free Software Foundation, either version 3 of the License, or
7
-- (at your option) any later version.
8
-- 
9
-- SCARTS is distributed in the hope that it will be useful,
10
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
11
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
-- GNU General Public License for more details.
13
-- 
14
-- You should have received a copy of the GNU General Public License
15
-- along with SCARTS.  If not, see <http://www.gnu.org/licenses/>.
16
-----------------------------------------------------------------------
17
 
18
 
19
-------------------------------------------------------------------------------
20
-- Title      : Extension Module: miniUART
21
-- Project    : HW/SW-Codesign
22
-------------------------------------------------------------------------------
23
-- File       : ext_miniUART.vhd
24
-- Author     : Roman Seiger
25
-- Company    : TU Wien - Institut für Technische Informatik
26
-- Created    : 2005-03-10
27
-- Last update: 2007-05-17
28
-------------------------------------------------------------------------------
29
 
30
-- TODO: Herstellernummer
31
 
32
----------------------------------------------------------------------------------
33
-- LIBRARY
34
----------------------------------------------------------------------------------
35
LIBRARY IEEE;
36
USE IEEE.std_logic_1164.all;
37
USE IEEE.numeric_std.all;
38
USE work.pkg_basic.all;
39
use work.pkg_miniUART.all;
40
 
41
----------------------------------------------------------------------------------
42
-- ARCHITECTURE
43
----------------------------------------------------------------------------------
44
ARCHITECTURE behaviour OF ext_miniUART IS
45
 
46
------------------------------------------------------------------------------
47
-- Definition der Constanten für Module Type und versionsnummer
48
-------------------------------------------------------------------------------
49
-- ID für miniUART definieren
50
  constant MOD_TYPE     : std_logic_vector(15 downto 0):="0000000100000001";
51
  constant MOD_VERSION  : std_logic_vector(15 downto 0):="0000000000000000";
52
 
53
 
54
-------------------------------------------------------------------------------
55
-- Definieren eines Types "ext_register_set" : Array vom 8 Registern die
56
-- jeweils 16 Bit breit sind => Register der Module Interfaces
57
-------------------------------------------------------------------------------  
58
  subtype ext_register is std_logic_vector(7 downto 0);
59
  type    ext_register_set is array (0 to 9) of ext_register;
60
  signal  ExtReg,ExtReg_next         : ext_register_set;
61
 
62
-------------------------------------------------------------------------------
63
--  Interne Signale, siehe Programm-Code 
64
-------------------------------------------------------------------------------    
65
  signal ExtReset                        : std_logic;  -- reset oder SRes
66
--  signal Ena                             : std_logic;  -- Modul angesprochen
67
  signal IntAckClrNxt                    : std_logic;
68
  --signal WriteDataNxt                    : std_logic_vector(DATA_W-1 downto 0);
69
  -- ganzes Statusregister überschreiben!
70
--  signal StatusNxt                       : std_logic_vector((DATA_W/2)-1 downto 0);
71
  signal StatusNxt                       : std_logic_vector(DATA_W-1 downto 0);
72
--  signal MsgNxt                          : std_logic_vector(DATA_W-1 downto 0);
73
--  signal CmdNxt                          : std_logic_vector(DATA_W-1 downto 0);
74
  signal UBRS                            : std_logic_vector(DATA_W-1 downto 0);
75
 
76
--  signal parity : std_logic;            -- für Parityberechnung
77
  signal newmessage : std_logic;        -- neue Nachricht ins Messageregister geschrieben?
78
  signal messageread : std_logic;       -- empfangene Nachricht abgeholt?
79
  signal statusread : std_logic;        -- Status gelesen? (für Eventflag)
80
  signal old_statusread : std_logic;
81
 
82
  --signal MINIUART_BADDR                  : std_logic_vector(DATA_W-1 downto 3);
83
 
84
-------------------------------------------------------------------------------
85
-- Verbindungssignale
86
-------------------------------------------------------------------------------
87
  -- Transmitter
88
  signal ParBit : std_logic;            -- berechnetes Paritybit für Transmitter
89
 
90
  -- Busdriver
91
  signal OutD : std_logic;              -- Output disable
92
 
93
  -- UARTCtrl
94
  signal ParErr : std_logic;          -- Parity Error
95
  signal FrameErr : std_logic;        -- Frame Error (Transmission Error)
96
  signal Data_r : Data_type;            -- empfangene Daten
97
  signal RBR : std_logic;               -- Receive Buffer Ready
98
  signal TBR : std_logic;               -- Transmit Buffer Ready
99
  signal event : std_logic;             -- event occured?
100
 
101
  -- UARTCtrl <=> receiver
102
  signal Data_r2c : Data_type;
103
  signal Data_c2t : Data_type;
104
  signal ParBit_r2c : std_logic;
105
  signal FrameErr_r2c : std_logic;
106
  signal RecComp_r2c : std_logic;
107
  signal RecBusy_r2c : std_logic;
108
  signal EnaRec_c2r : std_logic;
109
 
110
  -- UARTCtrl <=> transmitter
111
  signal TransComp_t2c : std_logic;
112
 
113
  -- UARTcontrol <=> BRG
114
  signal StartTrans_c2brg : std_logic;
115
 
116
  -- transmitter <=> BRG
117
  signal tp_brg2t : std_logic;
118
 
119
  -- transmitter <=> busdriver
120
  signal TransEna_t2bd : std_logic;
121
  signal TxD_t2bd : std_logic;
122
 
123
  -- receiver <=> BRG
124
  signal rp_brg2r : std_logic;
125
  signal StartRecPulse_r2brg : std_logic;
126
 
127
  -- receiver <=> busdriver
128
  signal RecEna_r2bd : std_logic;
129
  signal RxD_bd2r : std_logic;
130
 
131
-------------------------------------------------------------------------------
132
-- begin architecture
133
-------------------------------------------------------------------------------
134
  begin  -- behaviour
135
 
136
-------------------------------------------------------------------------------
137
-- Port mapping der Komponenten
138
-------------------------------------------------------------------------------
139
    -- miniUART_control
140
    miniUART_control_unit : miniUART_control
141
      port map (
142
        clk => clk,
143
        reset => ExtReset,
144
        ParEna => ExtReg(EXTUARTCONF)(EXTCONF_PARENA),
145
        Odd => ExtReg(EXTUARTCONF)(EXTCONF_PARODD),
146
        AsA => ExtReg(EXTCMD)(EXTCMD_ASA_H downto EXTCMD_ASA_L),
147
        EvS => ExtReg(EXTCMD)(EXTCMD_EVS_H downto EXTCMD_EVS_L),
148
        Data_r => Data_r2c,
149
        ParBit_r => ParBit_r2c,
150
        FrameErr => FrameErr_r2c,
151
        RecComp => RecComp_r2c,
152
        RecBusy => RecBusy_r2c,
153
        TransComp => TransComp_t2c,
154
        EnaRec => EnaRec_c2r,
155
        Data_r_out => Data_r,
156
        FrameErr_out => FrameErr,
157
        ParityErr => ParErr,
158
        RBR => RBR,
159
        StartTrans => StartTrans_c2brg,
160
        TBR => TBR,
161
        event => event
162
        );
163
 
164
                Data_c2t(7 downto 0) <= ExtReg(MSGREG_LOW);
165
                Data_c2t(15 downto 8) <= ExtReg(MSGREG_HIGH);
166
 
167
    -- miniUART_transmitter
168
    miniUART_transmitter_unit : miniUART_transmitter
169
      port map (
170
        clk => clk,
171
        reset => ExtReset,
172
        MsgLength => ExtReg(EXTUARTCONF)(EXTCONF_MSGL_H downto EXTCONF_MSGL_L),
173
        Stop2 => ExtReg(EXTUARTCONF)(EXTCONF_STOP),
174
        ParEna => ExtReg(EXTUARTCONF)(EXTCONF_PARENA),
175
        ParBit => ParBit,
176
        Data => Data_c2t,
177
        tp => tp_brg2t,
178
        TransEna => TransEna_t2bd,
179
        TrComp => TransComp_t2c,
180
        TxD => TxD_t2bd
181
        );
182
 
183
    -- miniUART_receiver
184
    miniUART_receiver_unit : miniUART_receiver
185
      port map (
186
        clk => clk,
187
                reset => ExtReset,
188
        enable => EnaRec_c2r,
189
        MsgLength => ExtReg(EXTUARTCONF)(EXTCONF_MSGL_H downto EXTCONF_MSGL_L),
190
        Stop2 => ExtReg(EXTUARTCONF)(EXTCONF_STOP),
191
        ParEna => ExtReg(EXTUARTCONF)(EXTCONF_PARENA),
192
        rp => rp_brg2r,
193
        RxD => RxD_bd2r,
194
        Data => Data_r2c,
195
        ParBit => ParBit_r2c,
196
        RecEna => RecEna_r2bd,
197
        StartRecPulse => StartRecPulse_r2brg,
198
        busy => RecBusy_r2c,
199
        RecComplete => RecComp_r2c,
200
        FrameErr => FrameErr_r2c
201
        );
202
 
203
     UBRS(7 downto 0)  <= ExtReg(UBRSREG_LOW);
204
     UBRS(15 downto 8) <= ExtReg(UBRSREG_HIGH);
205
 
206
    -- miniUART_BRG
207
    miniUART_BRG_unit : miniUART_BRG
208
      port map (
209
        clk => clk,
210
                reset => ExtReset,
211
        StartTrans => StartTrans_c2brg,
212
        StartRec => StartRecPulse_r2brg,
213
        UBRS => UBRS,--ExtReg(UBRSREG),
214
        tp => tp_brg2t,
215
        rp => rp_brg2r
216
        );
217
 
218
 
219
    -- miniUART_busdriver
220
    miniUART_busdriver_unit : miniUART_busdriver
221
      port map (
222
        clk => clk,
223
                reset => ExtReset,
224
        OutD => OutD,
225
        TransEna => TransEna_t2bd,
226
        RecEna => RecEna_r2bd,
227
        Data_t => TxD_t2bd,
228
        Data_r => RxD_bd2r,
229
        TxD => TxD,
230
        RxD => RxD
231
        );
232
 
233
 
234
-------------------------------------------------------------------------------
235
-- Synchroner Prozess:
236
-- Bei einem Reset werden alle Register mit Null initialisiert.
237
-- Anschliessend werden mit jeder steigenden Flanke die neuen Werte in das
238
-- Register geschrieben.
239
-- Zu beachten ist dabei die Reigenfolge: StatusNxt wird
240
-- als letztes zugewiesen - daher wird in jedem Fall das Status Register mit
241
-- diesem Wert beschreiben, auch wenn man von aussen versucht  dieses zu
242
-- überschreiben  -> read-only Funktion  (nur die unteren 8 Bits). Beim
243
-- Config-Register ist es genau umgekehrt - dadurch kann man das INTA-Bit vom
244
-- Prozessor aus überschreiben..
245
-------------------------------------------------------------------------------        
246
    SYNC_SM: process (clk, ExtReset)
247
    begin
248
 
249
      if ExtReset = RST_ACT then
250
        for i in 0 to 9 loop
251
          ExtReg(i) <= (others => '0');
252
        end loop;  -- i
253
        old_statusread <= '0';
254
      elsif clk'event and clk = '1' then
255
        ExtReg <= ExtReg_next;
256
 
257
        ExtReg(STATUSREG) <= StatusNxt(7 downto 0);
258
        ExtReg(STATUSREG_CUST) <= StatusNxt(15 downto 8);
259
        old_statusread <= statusread;
260
 
261
      end if;
262
    end process SYNC_SM;
263
 
264
 
265
 
266
 
267
-------------------------------------------------------------------------------
268
-- Schreiben in die Register:
269
-- Defaultmässig wird der ältere Wert beibehalten
270
------------------------------------------------------------------------------- 
271
    WRITE_REG: process (exti, ExtReg, RBR, TBR,  Data_r, extsel, IntAckClrNxt)--(ExtAddr, Data2Ext, ExtWr, Ena, ExtReg) --DE, AccViol)
272
    begin
273
 
274
      -- Defaultwert
275
      ExtReg_next <= ExtReg;
276
      ExtReg_next(CONFIGREG)(CONF_INTA)  <= IntAckClrNxt;
277
      --WriteDataNxt <=  ExtReg(conv_integer(unsigned(exti.ExtAddr)));
278
      newmessage <= '0';
279
      if RBR = RB_READY then
280
        ExtReg_next(MSGREG_LOW)   <= Data_r(7 downto 0);       -- empfangene Nachricht übernehmen
281
        ExtReg_next(MSGREG_HIGH) <= Data_r(15 downto 8);
282
      end if;
283
 
284
      if TBR = TB_READY then
285
        if ExtReg(EXTCMD)(EXTCMD_ASA_H downto EXTCMD_ASA_L) = ASA_STRANS then
286
             ExtReg_next(EXTCMD)(EXTCMD_ASA_H downto EXTCMD_ASA_L) <= "000";
287
        end if;
288
      end if;
289
 
290
 
291
      -- neue Daten übernehmen
292
      if ((extsel = '1') and (exti.write_en = '1')) then
293
        case exti.addr(4 downto 2) is
294
          when "000" =>
295
            if ((exti.byte_en(0) = '1')) then
296
              ExtReg_next(2) <= exti.data(7 downto 0);
297
            end if;
298
            if ((exti.byte_en(1) = '1')) then
299
              ExtReg_next(3) <= exti.data(15 downto 8);
300
            end if;
301
            if ((exti.byte_en(2) = '1')) then
302
              ExtReg_next(2) <= exti.data(23 downto 16);
303
            end if;
304
            if ((exti.byte_en(3) = '1')) then
305
              ExtReg_next(3) <= exti.data(31 downto 24);
306
            end if;
307
          when "001" =>
308
            if ((exti.byte_en(0) = '1')) then
309
              ExtReg_next(4) <= exti.data(7 downto 0);
310
            end if;
311
            if ((exti.byte_en(1) = '1')) then
312
              ExtReg_next(5) <= exti.data(15 downto 8);
313
            end if;
314
            if ((exti.byte_en(2) = '1')) then
315
              ExtReg_next(6) <= exti.data(23 downto 16);
316
              newmessage <= '1';
317
            end if;
318
            if ((exti.byte_en(3) = '1')) then
319
              ExtReg_next(7) <= exti.data(31 downto 24);
320
            end if;
321
          when "010" =>
322
            if ((exti.byte_en(0) = '1')) then
323
              ExtReg_next(8) <= exti.data(7 downto 0);
324
            end if;
325
            if ((exti.byte_en(1) = '1')) then
326
              ExtReg_next(9) <= exti.data(15 downto 8);
327
            end if;
328
          when others =>
329
            null;
330
        end case;
331
      end if;
332
    end process WRITE_REG;
333
 
334
-------------------------------------------------------------------------------
335
-- Lesezugriff auf das Extension Module
336
-- Wenn das ID-Bit im Config Register gesetzt ist, so wird auf Data 0/1 der
337
-- Module Type und die Versionsnummer ausgegeben
338
-- Bei einem Interrupt wird auf DATA0 der Interruptvector ausgegeben
339
-------------------------------------------------------------------------------
340
    READ_REG: process (exti, ExtReg, extsel) --DE AccViol)
341
    begin
342
      --Defaultwert (Hochohmig)-> neue Konvention, Default auf 0
343
--      WrBData <= (others => 'Z');
344
      exto.data <= (others => '0');
345
 
346
      messageread <= '0';
347
      statusread <= '0';
348
 
349
      -- Lesezugriff auf das Module? (ohne Access Violation (AccViol))
350
      if ((extsel = '1') and (exti.write_en = '0')) then
351
        case exti.addr(4 downto 2) is
352
          when "000" =>
353
              if ((exti.byte_en(0) = '1')) then
354
                statusread <= '1';
355
              end if;
356
            exto.data<= ExtReg(3) & ExtReg(2) & ExtReg(1) & ExtReg(0);
357
          when "001" =>
358
            if (ExtReg(CONFIGREG)(CONF_ID) = '1') then
359
              exto.data<= MODULE_VER & MODULE_ID;
360
            else
361
              if ((exti.byte_en(2) = '1')) then
362
                messageread <= '1';
363
              end if;
364
              exto.data<= ExtReg(7) & ExtReg(6) & ExtReg(5) & ExtReg(4);
365
            end if;
366
          when "010" =>
367
            exto.data<= "00000000" & "00000000" & ExtReg(9) & ExtReg(8);
368
          when others =>
369
            null;
370
        end case;
371
      end if;
372
    end process READ_REG;
373
 
374
 
375
-------------------------------------------------------------------------------
376
-- Setzen der Status-Bits
377
-------------------------------------------------------------------------------    
378
    STATUS_EXT: process(ExtReg, RBR, TBR, ParErr, FrameErr, --Data_r,
379
                        newmessage, messageread, statusread, event, old_statusread)
380
    begin
381
      -- Defaultwerte
382
     -- MsgNxt(7 downto 0) <= ExtReg(MSGREG_LOW);   
383
        --  MsgNxt(15 downto 8) <= ExtReg(MSGREG_HIGH);
384
    --  CmdNxt(7 downto 0) <= ExtReg(EXTCMD);
385
  --    CmdNxt(15 downto 8) <= (others =>'0');
386
 
387
      StatusNxt(STA_LOOR) <= ExtReg(CONFIGREG)(CONF_LOOW);
388
      StatusNxt(STA_FSS)  <= ExtReg(STATUSREG)(STA_FSS);      -- Failsafestate
389
      StatusNxt(STA_RESH) <= '0';                               --not used
390
      StatusNxt(STA_RESL) <= '0';                               --not used
391
      StatusNxt(STA_BUSY) <= '0';      -- miniUART is never too busy!
392
      StatusNxt(STA_ERR)  <= ExtReg(STATUSREG)(STA_ERR);  -- Error occured
393
      StatusNxt(STA_RDY)  <= '1';                               --not used
394
      StatusNxt(STA_INT)  <= ExtReg(STATUSREG)(STA_INT);
395
      IntAckClrNxt         <= ExtReg(CONFIGREG)(CONF_INTA);
396
 
397
      StatusNxt(15)          <= '0';    -- not used
398
      StatusNxt(STA_TRANSERR +8) <= ExtReg(STATUSREG_CUST)(STA_TRANSERR); -- Transmission Error (Frame Error)
399
      StatusNxt(STA_PARERR+8)   <= ExtReg(STATUSREG_CUST)(STA_PARERR); -- Parity Error
400
      StatusNxt(STA_EVF+8)      <= ExtReg(STATUSREG_CUST)(STA_EVF);    -- EventFlag
401
      StatusNxt(STA_OVF+8)      <= ExtReg(STATUSREG_CUST)(STA_OVF);    -- OverflowFlag
402
      StatusNxt(STA_RBR+8)      <= ExtReg(STATUSREG_CUST)(STA_RBR);     -- Receive Buffer Ready
403
      StatusNxt(STA_TBR+8)      <= ExtReg(STATUSREG_CUST)(STA_TBR);    -- Transmit Buffer Ready
404
      StatusNxt(8)           <= '0';    -- not used
405
 
406
      -- Nachricht empfangen
407
      if RBR = RB_READY then
408
        StatusNxt(STA_RBR+8) <= RB_READY;
409
        -- Overflow?
410
        if ExtReg(STATUSREG_CUST)(STA_RBR) = RB_READY then
411
          StatusNxt(STA_OVF) <= OVERFLOW;
412
        end if;
413
        -- übernehmen
414
   --     MsgNxt <= Data_r;
415
        -- Parity bzw. Transmission (Frame) Error (nur wenn TrCtrl oder ERRI)
416
        if (ExtReg(EXTUARTCONF)(EXTCONF_TRCTRL) = TRCTRL_ENA) or (ExtReg(EXTCMD)(EXTCMD_ERRI) = TRCTRL_ENA) then
417
          StatusNxt(STA_PARERR+8) <= ParErr;
418
          StatusNxt(STA_TRANSERR +8) <= FrameErr;
419
          if (ParErr = PARITY_ERROR) or (FrameErr = FRAME_ERROR) then
420
            StatusNxt(STA_ERR) <= '1';
421
          end if;
422
          -- Interrupt auslösen?
423
          if (ExtReg(EXTCMD)(EXTCMD_ERRI) = TRCTRL_ENA) and ((ParErr = PARITY_ERROR) or (FrameErr = FRAME_ERROR)) then
424
            StatusNxt(STA_INT) <= '1';
425
            IntAckClrNxt <= '0';
426
          end if;
427
        end if;
428
      elsif messageread = '1' then
429
        -- clear receive flags
430
        StatusNxt(STA_RBR+8) <= not RB_READY;
431
        StatusNxt(STA_OVF+8) <= not OVERFLOW;
432
        StatusNxt(STA_PARERR+8) <= not PARITY_ERROR;
433
        StatusNxt(STA_TRANSERR+8) <= not FRAME_ERROR;
434
        StatusNxt(STA_ERR) <= '0';
435
      end if;
436
 
437
      -- Nachricht wird gesendet, TBR für eine Taktperiode auf high => signal
438
-- ist irreführend, es zeigt legilich an, dass mit dem Senden der Nachricht
439
-- begonnen wurde, nicht dass sie erfolgreich übertragen wurde. 
440
      if TBR = TB_READY then
441
        StatusNxt(STA_TBR+8) <= TB_READY;
442
        -- erneutes Senden verhindern!
443
       -- if ExtReg(EXTCMD)(EXTCMD_ASA_H downto EXTCMD_ASA_L) = ASA_STRANS then
444
       --   CmdNxt(EXTCMD_ASA_H downto EXTCMD_ASA_L) <= "000"; 
445
       -- end if;
446
      elsif newmessage = '1' then
447
        -- clear TBR
448
        StatusNxt(STA_TBR+8) <= not TB_READY;
449
      end if;
450
 
451
      -- Event
452
      if event = EV_OCC then
453
        StatusNxt(STA_EVF+8) <= EV_OCC;
454
        -- Interrupt auslösen
455
        if ExtReg(EXTCMD)(EXTCMD_EI) = EV_INT then
456
          StatusNxt(STA_INT) <= '1';
457
          IntAckClrNxt <= '0';
458
        end if;
459
      elsif (old_statusread = '1') and (statusread = '0') then
460
        StatusNxt(STA_EVF+8) <= not EV_OCC;
461
      end if;
462
 
463
      -- Failsafestate
464
      if ExtReg(CONFIGREG)(CONF_EFSS) = FAILSAFE then
465
        StatusNxt(STA_FSS) <= '1';
466
        StatusNxt(STA_INT) <= '1';
467
        IntAckClrNxt <= '0';
468
      else
469
        StatusNxt(STA_FSS) <= '0';
470
      end if;
471
 
472
      -- Interruptstatus (bei Acknowledge abdrehen)
473
      if ExtReg(CONFIGREG)(CONF_INTA) = '1' then
474
        StatusNxt(STA_INT)  <= '0';
475
        IntAckClrNxt        <= '0';
476
      end if;
477
 
478
    end process STATUS_EXT;
479
 
480
 
481
-------------------------------------------------------------------------------
482
-- Ein Reset kann durch ein externes Signal oder durch setzen eines Bits im
483
-- Config-Register ausgelöst werden.
484
-------------------------------------------------------------------------------
485
    RESET_EXT: process (exti, ExtReg)
486
    begin
487
      -- Defaultwert
488
      ExtReset <= not RST_ACT;
489
      if exti.reset = RST_ACT or ExtReg(CONFIGREG)(CONF_SRES)= '1' then
490
        ExtReset <= RST_ACT;
491
      end if;
492
    end process RESET_EXT;
493
 
494
 
495
 
496
-------------------------------------------------------------------------------
497
-------------------------------------------------------------------------------
498
-------------------------------------------------------------------------------
499
-- Module Specific Part
500
-------------------------------------------------------------------------------
501
-------------------------------------------------------------------------------
502
-------------------------------------------------------------------------------
503
 
504
-------------------------------------------------------------------------------
505
-- Parity berechnen
506
-------------------------------------------------------------------------------    
507
    PARITY_CALC: process (ExtReg)
508
--      variable i : integer;
509
      variable parity : std_logic;
510
    begin  -- process PARITY_CALC
511
      parity := '0';
512
      for i in 15 downto 0 loop
513
        if to_integer(unsigned(ExtReg(EXTUARTCONF)(EXTCONF_MSGL_H downto EXTCONF_MSGL_L))) < i then
514
          parity := parity;
515
        else
516
                  if i < 8 then
517
                parity := parity xor ExtReg(MSGREG_LOW)(i);
518
                  else
519
                        parity := parity xor ExtReg(MSGREG_HIGH)(i-8);
520
          end if;
521
                end if;
522
      end loop;
523
 
524
      -- Odd oder even?
525
      ParBit <= parity xor ExtReg(EXTUARTCONF)(EXTCONF_PARODD);
526
    end process PARITY_CALC;
527
 
528
-------------------------------------------------------------------------------
529
-- Output disable (explizit oder im FSS)
530
-------------------------------------------------------------------------------    
531
    OUTPUT_CONTROL: process (ExtReg)
532
    begin  -- process FSS_CONTROL
533
      if (ExtReg(STATUSREG)(STA_FSS) = '1') or (ExtReg(CONFIGREG)(EXTCONF_OUTD) = OUTD_ACT) then
534
        OutD <= OUTD_ACT;
535
      else
536
        OutD <= not OUTD_ACT;
537
      end if;
538
    end process OUTPUT_CONTROL;
539
 
540
 
541
-------------------------------------------------------------------------------
542
-- Interrupt request
543
-------------------------------------------------------------------------------    
544
 
545
   INT_CONTROL: process (ExtReg)
546
   begin  -- process INT_CONTROL
547
     if ExtReg(STATUSREG)(STA_INT) = '1' then
548
       exto.intreq <= '1';--EXC_ACT;
549
     else
550
       exto.intreq <= '0';--not EXC_ACT;
551
     end if;
552
   end process INT_CONTROL;
553
 
554
end behaviour;
555
 
556
----------------------------------------------------------------------------------
557
-- END ARCHITECTURE
558
----------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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