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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [rtl/] [ibus/] [ibd_iist.vhd] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wfjm
-- $Id: ibd_iist.vhd 314 2010-07-09 17:38:41Z mueller $
2
--
3
-- Copyright 2009- 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:    ibd_iist - syn
16
-- Description:    ibus dev(loc): IIST
17
--
18
-- Dependencies:   -
19
-- Test bench:     -
20
-- Target Devices: generic
21
-- Tool versions:  xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
22
--
23
-- Synthesized (xst):
24
-- Date         Rev  ise         Target      flop lutl lutm slic t peri
25
-- 2009-06-01   223  10.1.03 K39 xc3s1000-4   111  439    0  256 s  9.8
26
-- 2009-06-01   221  10.1.03 K39 xc3s1000-4   111  449    0  258 s 13.3
27
--
28
-- Revision History: 
29
-- Date         Rev Version  Comment
30
-- 2009-06-07   224   0.7    send inverted stc_stp; remove pgc_err; honor msk_im
31
--                           also for dcf_dcf and exc_rte; add iist_mreq and
32
--                           iist_sreq, boot and lock interfaces
33
-- 2009-06-05   223   0.6    level interrupt, parity logic, exc.ui logic
34
--                           st logic modified (partially tested)
35
-- 2009-06-01   221   0.5    Initial version (untested, lock&boot missing)
36
------------------------------------------------------------------------------
37
 
38
library ieee;
39
use ieee.std_logic_1164.all;
40
use ieee.std_logic_arith.all;
41
 
42
use work.slvtypes.all;
43
use work.iblib.all;
44
use work.ibdlib.all;
45
 
46
-- ----------------------------------------------------------------------------
47
entity ibd_iist is                      -- ibus dev(loc): IIST
48
                                        -- fixed address: 177500
49
  generic (
50
    SID : slv2 := "00");                -- self id
51
  port (
52
    CLK : in slbit;                     -- clock
53
    CE_USEC : in slbit;                 -- usec pulse
54
    RESET : in slbit;                   -- system reset
55
    BRESET : in slbit;                  -- ibus reset
56
    IB_MREQ : in ib_mreq_type;          -- ibus request
57
    IB_SRES : out ib_sres_type;         -- ibus response
58
    EI_REQ : out slbit;                 -- interrupt request
59
    EI_ACK : in slbit;                  -- interrupt acknowledge
60
    IIST_BUS : in iist_bus_type;        -- iist bus (input from all iist's)
61
    IIST_OUT : out iist_line_type;      -- iist output
62
    IIST_MREQ : out iist_mreq_type;     -- iist->cpu requests
63
    IIST_SRES : in iist_sres_type       -- cpu->iist responses
64
  );
65
end ibd_iist;
66
 
67
architecture syn of ibd_iist is
68
 
69
  constant ibaddr_iist : slv16 := conv_std_logic_vector(8#177500#,16);
70
 
71
  constant tdlysnd : natural := 150;    -- send delay timer
72
 
73
  constant ibaddr_acr : slv1 := "0";    -- acr address offset
74
  constant ibaddr_adr : slv1 := "1";    -- adr address offset
75
 
76
  constant acr_ibf_clr :    integer := 15;                  -- clear flag
77
  subtype  acr_ibf_sid      is integer range  9 downto  8;  -- self id
78
  subtype  acr_ibf_ac       is integer range  3 downto  0;  -- ac code
79
 
80
  constant ac_pge : slv4 := "0000";     --  0 program generated enables
81
  constant ac_pgc : slv4 := "0001";     --  1 program generated control/status
82
  constant ac_ste : slv4 := "0010";     --  2 sanity timer enables
83
  constant ac_stc : slv4 := "0011";     --  3 sanity timer control/status
84
  constant ac_msk : slv4 := "0100";     --  4 input masks
85
  constant ac_pgf : slv4 := "0101";     --  5 program generated flags
86
  constant ac_stf : slv4 := "0110";     --  6 sanity timer flags
87
  constant ac_dcf : slv4 := "0111";     --  7 disconnect flags
88
  constant ac_exc : slv4 := "1000";     -- 10 exceptions
89
  constant ac_mtc : slv4 := "1101";     -- 15 maintenance control
90
 
91
  subtype  pge_ibf_pbe      is integer range 11 downto  8;  -- pg boot ena
92
  subtype  pge_ibf_pie      is integer range  3 downto  0;  -- pg int ena
93
 
94
  constant pgc_ibf_err :    integer := 15;                  -- error
95
  constant pgc_ibf_grj :    integer := 14;                  -- go reject
96
  constant pgc_ibf_pgrmr :  integer := 13;                  -- pg req refused
97
  constant pgc_ibf_strmr :  integer := 12;                  -- st req refused
98
  constant pgc_ibf_rdy :    integer := 11;                  -- ready flag
99
  subtype  pgc_ibf_sid      is integer range  9 downto  8;  -- self id
100
  constant pgc_ibf_ip :     integer :=  3;                  -- int pending
101
  constant pgc_ibf_ie :     integer :=  2;                  -- int enable
102
  constant pgc_ibf_ptp :    integer :=  1;                  -- pg parity
103
  constant pgc_ibf_go :     integer :=  0;                  -- go flag
104
 
105
  subtype  ste_ibf_sbe      is integer range 11 downto  8;  -- st boot enable
106
  subtype  ste_ibf_sie      is integer range  3 downto  0;  -- st int  enable
107
 
108
  subtype  stc_ibf_count    is integer range 15 downto  8;  -- count
109
  constant stc_ibf_tmo :    integer :=  3;                  -- timeout
110
  constant stc_ibf_lke :    integer :=  2;                  -- lockup enable
111
  constant stc_ibf_stp :    integer :=  1;                  -- st parity
112
  constant stc_ibf_enb :    integer :=  0;                  -- enable
113
 
114
  subtype  msk_ibf_bm       is integer range 11 downto  8;  -- boot mask
115
  subtype  msk_ibf_im       is integer range  3 downto  0;  -- int  mask
116
 
117
  subtype  pgf_ibf_pbf      is integer range 11 downto  8;  -- boot flags
118
  subtype  pgf_ibf_pif      is integer range  3 downto  0;  -- int  flags
119
 
120
  subtype  stf_ibf_sbf      is integer range 11 downto  8;  -- boot flags
121
  subtype  stf_ibf_sif      is integer range  3 downto  0;  -- int  flags
122
 
123
  subtype  dcf_ibf_brk      is integer range 11 downto  8;  -- break flags
124
  subtype  dcf_ibf_dcf      is integer range  3 downto  0;  -- disconnect flags
125
 
126
  subtype  exc_ibf_ui       is integer range 11 downto  8;  -- unexpected int
127
  subtype  exc_ibf_rte      is integer range  3 downto  0;  -- transm. error
128
 
129
  constant mtc_ibf_mttp :   integer := 11;                  -- maint. type
130
  constant mtc_ibf_mfrm :   integer := 10;                  -- maint. frame err
131
  subtype  mtc_ibf_mid      is integer range  9 downto  8;  -- maint. id
132
  constant mtc_ibf_dsbt :   integer :=  3;                  -- disable boot
133
  constant mtc_ibf_enmxd :  integer :=  2;                  -- enable maint mux
134
  constant mtc_ibf_enmlp :  integer :=  1;                  -- enable maint loop
135
  constant mtc_ibf_dsdrv :  integer :=  0;                  -- disable driver
136
 
137
  type state_type is (
138
    s_idle,                             -- idle state
139
    s_clear,                            -- handle acr clr
140
    s_stsnd,                            -- handle st transmit 
141
    s_pgsnd                             -- handle pg transmit
142
  );
143
 
144
  type regs_type is record              -- state registers
145
    acr_ac : slv4;                      -- acr: ac 
146
    pge_pbe : slv4;                     -- pge: pg boot ena
147
    pge_pie : slv4;                     -- pge: pg int ena
148
    pgc_grj : slbit;                    -- pgc: go reject
149
    pgc_pgrmr : slbit;                  -- pgc: pg req refused
150
    pgc_strmr : slbit;                  -- pgc: st req refused
151
    pgc_ie  : slbit;                    -- pgc: int enable
152
    pgc_ptp : slbit;                    -- pgc: pg parity
153
    ste_sbe : slv4;                     -- ste: st boot enable
154
    ste_sie : slv4;                     -- ste: st int  enable
155
    stc_count : slv8;                   -- stc: count
156
    stc_tmo : slbit;                    -- stc: timeout
157
    stc_lke : slbit;                    -- stc: lockup enable
158
    stc_stp : slbit;                    -- stc: st parity
159
    stc_enb : slbit;                    -- stc: enable
160
    msk_bm  : slv4;                     -- msk: boot mask
161
    msk_im  : slv4;                     -- msk: int  mask
162
    pgf_pbf : slv4;                     -- pgf: boot flags
163
    pgf_pif : slv4;                     -- pgf: int  flags
164
    stf_sbf : slv4;                     -- stf: boot flags
165
    stf_sif : slv4;                     -- stf: int  flags
166
    dcf_brk : slv4;                     -- dcf: break flags
167
    dcf_dcf : slv4;                     -- dcf: disconnect flags
168
    exc_ui  : slv4;                     -- exc: unexpected int
169
    exc_rte : slv4;                     -- exc: transm. error
170
    mtc_mttp  : slbit;                  -- mtc: maint. type
171
    mtc_mfrm  : slbit;                  -- mtc: maint. frame err
172
    mtc_mid   : slv2;                   -- mtc: maint. id
173
    mtc_dsbt  : slbit;                  -- mtc: disable boot
174
    mtc_enmxd : slbit;                  -- mtc: enable maint mux
175
    mtc_enmlp : slbit;                  -- mtc: enable maint loop
176
    mtc_dsdrv : slbit;                  -- mtc: disable driver
177
    state : state_type;                 -- state
178
    req_clear : slbit;                  -- request clear
179
    req_stsnd : slbit;                  -- request sanity timer transmit
180
    req_pgsnd : slbit;                  -- request prog. gen.   transmit
181
    tcnt256 : slv8;                     -- usec clock divider for st clock
182
    tcntsnd : slv8;                     -- timer for transmit delay
183
    req_lock : slbit;                   -- cpu lock request
184
    req_boot : slbit;                   -- cpu boot request
185
   end record regs_type;
186
 
187
  constant regs_init : regs_type := (
188
    "0000",                             -- acr_ac
189
    "0000","0000",                      -- pge_pbe, pge_pie
190
    '0',                                -- pgc_grj
191
    '0','0',                            -- pgc_pgrmr, pgc_strmr
192
    '0','0',                            -- pgc_ie, pgc_ptp
193
    "0000","0000",                      -- ste_sbe, ste_sie
194
    (others=>'0'),                      -- stc_count
195
    '0','0',                            -- stc_tmo, stc_lke
196
    '0','0',                            -- stc_stp, stc_enb
197
    "0000","0000",                      -- msk_bm, msk_im
198
    "0000","0000",                      -- pgf_pbf, pgf_pif
199
    "0000","0000",                      -- stf_sbf, stf_sif
200
    "0000","0000",                      -- dcf_brk, dcf_dcf
201
    "0000","0000",                      -- exc_ui, exc_rte
202
    '0','0',                            -- mtc_mttp, mtc_mfrm
203
    "00",                               -- mtc_mid
204
    '0','0',                            -- mtc_dsbt, mtc_enmxd
205
    '0','0',                            -- mtc_enmlp, mtc_dsdrv
206
    s_idle,                             -- state
207
    '0',                                -- req_clear
208
    '0','0',                            -- req_stsnd, req_pgsnd
209
    (others=>'0'),                      -- tcnt256
210
    (others=>'0'),                      -- tcntsnd
211
    '0','0'                             -- req_lock, req_boot
212
  );
213
 
214
  signal R_REGS : regs_type := regs_init;
215
  signal N_REGS : regs_type := regs_init;
216
 
217
begin
218
 
219
  proc_regs: process (CLK)
220
  begin
221
    if CLK'event and CLK='1' then
222
      if BRESET = '1' or                -- BRESET is 1 for system and ibus reset
223
         R_REGS.req_clear='1' then
224
        R_REGS <= regs_init;            --
225
        if RESET = '0' then               -- if RESET=0 we do just an ibus reset
226
          R_REGS.pgf_pbf <= N_REGS.pgf_pbf; -- don't reset pg boot flags
227
          R_REGS.stf_sbf <= N_REGS.stf_sbf; -- don't reset st boot flags
228
          R_REGS.tcnt256 <= N_REGS.tcnt256; -- don't reset st clock divider
229
        end if;
230
     else
231
        R_REGS <= N_REGS;
232
      end if;
233
    end if;
234
  end process proc_regs;
235
 
236
  proc_next : process (R_REGS, CE_USEC, IB_MREQ, EI_ACK, EI_ACK,
237
                       IIST_BUS(0), IIST_BUS(1), IIST_BUS(2), IIST_BUS(3),
238
                       IIST_SRES)
239
    variable r : regs_type := regs_init;
240
    variable n : regs_type := regs_init;
241
    variable ibsel  : slbit := '0';
242
    variable ibbusy : slbit := '0';
243
    variable idout : slv16 := (others=>'0');
244
    variable ibrd : slbit := '0';
245
    variable ibw0 : slbit := '0';
246
    variable ibw1 : slbit := '0';
247
    variable int_or : slbit := '0';
248
    variable tcnt256_end : slbit := '0';
249
    variable tcntsnd_end : slbit := '0';
250
    variable eff_id  : slv2 := "00";
251
    variable eff_bus : iist_bus_type := iist_bus_init;
252
    variable par_err : slbit := '0';
253
    variable act_ibit : slbit := '0';
254
    variable act_bbit : slbit := '0';
255
    variable iout : iist_line_type := iist_line_init;
256
  begin
257
 
258
    r := R_REGS;
259
    n := R_REGS;
260
 
261
    ibsel  := '0';
262
    ibbusy := '0';
263
    idout  := (others=>'0');
264
    ibrd   := not IB_MREQ.we;
265
    ibw0   := IB_MREQ.we and IB_MREQ.be0;
266
    ibw1   := IB_MREQ.we and IB_MREQ.be1;
267
 
268
    int_or := r.pgc_grj or r.pgc_pgrmr or r.pgc_strmr;
269
    for i in r.dcf_dcf'range loop
270
      int_or := int_or or r.dcf_dcf(i) or
271
                          r.exc_rte(i) or
272
                          r.pgf_pif(i) or
273
                          r.stf_sif(i);
274
    end loop;  -- i
275
 
276
    tcnt256_end := '0';
277
    if CE_USEC='1' and r.stc_enb='1'then   -- if st enabled on every usec
278
      n.tcnt256 := unsigned(r.tcnt256) + 1;  -- advance 8 bit counter
279
      if unsigned(r.tcnt256) = 255 then      -- if wrap
280
        tcnt256_end := '1';                  -- signal 256 usec passed
281
      end if;
282
    end if;
283
 
284
    tcntsnd_end := '0';
285
    n.tcntsnd := unsigned(r.tcntsnd) + 1;  -- advance send timer counter
286
    if unsigned(r.tcntsnd) = tdlysnd-1 then -- if delay time reached 
287
      tcntsnd_end := '1';                    -- signal end
288
    end if;
289
 
290
    eff_id := SID;                      -- effective self-id, normally SID
291
    if r.mtc_enmxd = '1' then           -- if maint. mux enabled
292
      eff_id := r.mtc_mid;                -- use maint. id
293
    end if;
294
 
295
    eff_bus  := IIST_BUS;
296
 
297
    par_err  := '0';
298
    act_ibit := '0';
299
    act_bbit := '0';
300
    iout     := iist_line_init;            -- default state of out line
301
 
302
    -- ibus address decoder
303
    if IB_MREQ.req='1' and
304
       IB_MREQ.addr(12 downto 2)=ibaddr_iist(12 downto 2) then
305
      ibsel := '1';
306
    end if;
307
 
308
    -- internal state machine
309
    case r.state is
310
      when s_idle =>                    -- idle state
311
        n.tcntsnd := (others=>'0');       -- keep send delay timer zero
312
        if r.req_stsnd = '1' then         -- sanity timer request pending
313
          n.state := s_stsnd;
314
        elsif r.req_pgsnd = '1' then      -- prog. gen. request pending
315
          n.state := s_pgsnd;
316
        end if;
317
 
318
      when s_clear =>                   -- handle acr clr
319
        ibbusy := ibsel;                -- keep req pending if selected
320
        ibsel  := '0';                  -- but don't process selection
321
        -- r.req_clear is set when in this state and cause a reset in prog_regs
322
        --   --> n.req_clear := '0';
323
        --   --> n.state := s_idle;
324
 
325
      when s_stsnd =>                   -- handle st transmit
326
        if tcntsnd_end = '1' then         -- send delay expired
327
          n.req_stsnd := '0';               -- clear st transmit request
328
          iout.req   := '1';                -- do transmit
329
          iout.stf   := '1';                -- signal type = st
330
          iout.imask := r.ste_sie;          -- int  enables
331
          iout.bmask := r.ste_sbe;          -- boot enables
332
          iout.par   := not r.stc_stp;      -- send parity (odd incl. stf!)
333
          iout.frm   := '0';                -- frame always ok
334
          n.state   := s_idle;
335
        end if;
336
 
337
      when s_pgsnd =>                   -- handle pg transmit
338
        if tcntsnd_end = '1' then         -- send delay expired
339
          n.req_pgsnd := '0';               -- clear pg transmit request
340
          iout.req   := '1';                -- do transmit
341
          iout.stf   := '0';                -- signal type = pg
342
          iout.imask := r.pge_pie;          -- int  enables
343
          iout.bmask := r.pge_pbe;          -- boot enables
344
          iout.par   := r.pgc_ptp;          -- send parity
345
          iout.frm   := '0';                -- frame always ok
346
          n.state := s_idle;
347
        end if;
348
 
349
      when others => null;
350
    end case;
351
 
352
    if r.mtc_enmxd = '1' then              -- if maintenance mux enabled
353
      iout.stf := r.mtc_mttp;                -- force type  from mtc_mttp
354
      iout.frm := r.mtc_mfrm;                -- force frame from mtc_mfrm
355
    end if;
356
 
357
    -- ibus transactions
358
    if ibsel = '1' then
359
 
360
      if IB_MREQ.addr(1 downto 1) = "0" then -- ACR -- access control reg -----
361
 
362
        idout(acr_ibf_sid) := SID;
363
        idout(acr_ibf_ac)  := r.acr_ac;
364
 
365
        if ibw1 = '1' then
366
          if IB_MREQ.din(acr_ibf_clr) = '1' then
367
            n.req_clear := '1';
368
            n.state     := s_clear;
369
          end if;
370
        end if;
371
        if ibw0 = '1' then
372
          n.acr_ac  := IB_MREQ.din(acr_ibf_ac);
373
        end if;
374
 
375
      else                                  -- ADR -- access data reg --------
376
        case r.acr_ac is
377
 
378
          when ac_pge =>                -- PGE -- program gen enables --------
379
 
380
            idout(pge_ibf_pbe) := r.pge_pbe;
381
            idout(pge_ibf_pie) := r.pge_pie;
382
 
383
            if IB_MREQ.we = '1' then
384
 
385
              if r.req_pgsnd = '0' then   -- no pg transmit pending
386
                if ibw1 = '1' then
387
                  n.pge_pbe := IB_MREQ.din(pge_ibf_pbe);
388
                end if;
389
                if ibw0 = '1' then
390
                  n.pge_pie := IB_MREQ.din(pge_ibf_pie);
391
                end if;
392
              else                        -- if collision with pg transmit
393
                n.pgc_pgrmr := '1';         -- set pge refused flag
394
              end if;
395
 
396
            end if;
397
 
398
          when ac_pgc =>                -- PGC -- program gen control/status -
399
 
400
            idout(pgc_ibf_err)   := r.pgc_grj or r.pgc_pgrmr or r.pgc_strmr;
401
            idout(pgc_ibf_grj)   := r.pgc_grj;
402
            idout(pgc_ibf_pgrmr) := r.pgc_pgrmr;
403
            idout(pgc_ibf_strmr) := r.pgc_strmr;
404
            idout(pgc_ibf_rdy)   := not r.req_pgsnd;
405
            idout(pgc_ibf_sid)   := eff_id;
406
            idout(pgc_ibf_ip)    := int_or;
407
            idout(pgc_ibf_ie)    := r.pgc_ie;
408
            idout(pgc_ibf_ptp)   := r.pgc_ptp;
409
 
410
            if ibw1 = '1' then
411
              if IB_MREQ.din(pgc_ibf_err) = '1' then -- '1' written into ERR
412
                n.pgc_grj   := '0';                  -- clears GRJ
413
                n.pgc_pgrmr := '0';                  -- clears PGRMR
414
                n.pgc_strmr := '0';                  -- clears STRMR
415
              end if;
416
            end if;
417
            if ibw0 = '1' then
418
              n.pgc_ie  := IB_MREQ.din(pgc_ibf_ie);
419
              n.pgc_ptp := IB_MREQ.din(pgc_ibf_ptp);
420
              if IB_MREQ.din(pgc_ibf_go) = '1' then -- GO bit set
421
                if r.req_pgsnd = '0' then           -- if ready (no pgsnd pend)
422
                  n.req_pgsnd := '1';                 -- request pgsnd
423
                else                                -- if not ready
424
                  n.pgc_grj := '1';                   -- set go reject flag
425
                end if;
426
              end if;
427
            end if;
428
 
429
          when ac_ste =>                -- STE -- sanity timer enables -------
430
 
431
            idout(ste_ibf_sbe)   := r.ste_sbe;
432
            idout(ste_ibf_sie)   := r.ste_sie;
433
 
434
            if IB_MREQ.we = '1' then
435
 
436
              if r.req_stsnd = '0' then   -- no st transmit pending
437
                if ibw1 = '1' then
438
                  n.ste_sbe := IB_MREQ.din(ste_ibf_sbe);
439
                end if;
440
                if ibw0 = '1' then
441
                  n.ste_sie := IB_MREQ.din(ste_ibf_sie);
442
                end if;
443
 
444
              else                        -- if collision with st transmit
445
                n.pgc_strmr := '1';         -- set ste refused flag
446
              end if;
447
 
448
            end if;
449
 
450
          when ac_stc =>                -- STC -- sanity timer control/status
451
 
452
            idout(stc_ibf_count) := r.stc_count;
453
            idout(stc_ibf_tmo)   := r.stc_tmo;
454
            idout(stc_ibf_lke)   := r.stc_lke;
455
            idout(stc_ibf_stp)   := r.stc_stp;
456
            idout(stc_ibf_enb)   := r.stc_enb;
457
 
458
            if ibw1 = '1' then
459
              n.stc_count := IB_MREQ.din(stc_ibf_count);    -- reset st count
460
              n.tcnt256   := (others=>'0');                 -- reset usec count
461
            end if;
462
            if ibw0 = '1' then
463
              if IB_MREQ.din(stc_ibf_tmo) = '1' then -- 1 written into TMO
464
                n.stc_tmo := '0';
465
              end if;
466
              n.stc_lke   := IB_MREQ.din(stc_ibf_lke);
467
              n.stc_stp   := IB_MREQ.din(stc_ibf_stp);
468
              n.stc_enb   := IB_MREQ.din(stc_ibf_enb);
469
            end if;
470
 
471
          when ac_msk =>                -- MSK -- input masks ----------------
472
 
473
            idout(msk_ibf_bm)    := r.msk_bm;
474
            idout(msk_ibf_im)    := r.msk_im;
475
 
476
            if ibw1 = '1' then
477
              n.msk_bm  := IB_MREQ.din(msk_ibf_bm);
478
            end if;
479
            if ibw0 = '1' then
480
              n.msk_im  := IB_MREQ.din(msk_ibf_im);
481
            end if;
482
 
483
          when ac_pgf =>                -- PGF -- program generated flags ----
484
 
485
            idout(pgf_ibf_pbf)   := r.pgf_pbf;
486
            idout(pgf_ibf_pif)   := r.pgf_pif;
487
 
488
            if ibw1 = '1' then
489
              n.pgf_pbf := r.pgf_pbf and not IB_MREQ.din(pgf_ibf_pbf);
490
            end if;
491
            if ibw0 = '1' then
492
              n.pgf_pif := r.pgf_pif and not IB_MREQ.din(pgf_ibf_pif);
493
            end if;
494
 
495
          when ac_stf =>                -- STF -- sanity timer flags ---------
496
 
497
            idout(stf_ibf_sbf)   := r.stf_sbf;
498
            idout(stf_ibf_sif)   := r.stf_sif;
499
 
500
            if ibw1 = '1' then
501
              n.stf_sbf := r.stf_sbf and not IB_MREQ.din(stf_ibf_sbf);
502
            end if;
503
            if ibw0 = '1' then
504
              n.stf_sif := r.stf_sif and not IB_MREQ.din(stf_ibf_sif);
505
            end if;
506
 
507
          when ac_dcf =>                -- DCE -- disconnect flags -----------
508
 
509
            idout(dcf_ibf_brk)   := r.dcf_brk;
510
            idout(dcf_ibf_dcf)   := r.dcf_dcf;
511
 
512
            if ibw0 = '1' then
513
              n.dcf_dcf := r.dcf_dcf and not IB_MREQ.din(dcf_ibf_dcf);
514
            end if;
515
 
516
          when ac_exc =>                -- EXC -- exceptions -----------------
517
 
518
            idout(exc_ibf_ui)    := r.exc_ui;
519
            idout(exc_ibf_rte)   := r.exc_rte;
520
 
521
            if ibw1 = '1' then
522
              n.exc_ui  := r.exc_ui  and not IB_MREQ.din(exc_ibf_ui);
523
            end if;
524
            if ibw0 = '1' then
525
              n.exc_rte := r.exc_rte and not IB_MREQ.din(exc_ibf_rte);
526
            end if;
527
 
528
          when ac_mtc =>                -- MTC -- maintenance control --------
529
 
530
            idout(mtc_ibf_mttp)  := r.mtc_mttp;
531
            idout(mtc_ibf_mfrm)  := r.mtc_mfrm;
532
            idout(mtc_ibf_mid)   := r.mtc_mid;
533
            idout(mtc_ibf_dsbt)  := r.mtc_dsbt;
534
            idout(mtc_ibf_enmxd) := r.mtc_enmxd;
535
            idout(mtc_ibf_enmlp) := r.mtc_enmlp;
536
            idout(mtc_ibf_dsdrv) := r.mtc_dsdrv;
537
 
538
            if ibw1 = '1' then
539
              n.mtc_mttp  := IB_MREQ.din(mtc_ibf_mttp);
540
              n.mtc_mfrm  := IB_MREQ.din(mtc_ibf_mfrm);
541
              n.mtc_mid   := IB_MREQ.din(mtc_ibf_mid);
542
            end if;
543
            if ibw0 = '1' then
544
              n.mtc_dsbt  := IB_MREQ.din(mtc_ibf_dsbt);
545
              n.mtc_enmxd := IB_MREQ.din(mtc_ibf_enmxd);
546
              n.mtc_enmlp := IB_MREQ.din(mtc_ibf_enmlp);
547
              n.mtc_dsdrv := IB_MREQ.din(mtc_ibf_dsdrv);
548
            end if;
549
 
550
          when others =>                -- access to undefined AC code -------
551
            null;
552
 
553
        end case;
554
 
555
        if unsigned(r.acr_ac) <= unsigned(ac_exc) then -- if ac 0,..,10
556
          if IB_MREQ.dip = '0' then                    -- if not 1st part of rmw
557
            n.acr_ac := unsigned(r.acr_ac) + 1;          -- autoincrement
558
          end if;
559
        end if;
560
 
561
      end if;
562
 
563
    end if;
564
 
565
    -- sanity timer
566
 
567
    if tcnt256_end = '1' then           -- if 256 usec expired (and enabled)
568
      n.stc_count := unsigned(r.stc_count) - 1;
569
      if unsigned(r.stc_count) = 0 then   -- if sanity timer expired
570
        n.stc_tmo := '1';                   -- set timeout flag
571
        n.req_stsnd := '1';                 -- request st transmit
572
        if r.stc_lke = '1' then             -- if lockup enabled
573
          n.req_lock := '1';                  -- request lockup
574
        end if;
575
      end if;
576
    end if;
577
 
578
    -- process iist bus inputs
579
 
580
    if r.mtc_enmlp = '1' then           -- if mainentance loop
581
      for i in eff_bus'range loop
582
        eff_bus(i) := iout;               -- local signal on all input ports
583
        eff_bus(i).dcf := '0';            -- all ports considered connected
584
      end loop;  -- i
585
    end if;
586
 
587
    for i in eff_bus'range loop
588
 
589
      par_err := eff_bus(i).stf xor
590
                 eff_bus(i).imask(0) xor eff_bus(i).imask(1) xor
591
                 eff_bus(i).imask(2) xor eff_bus(i).imask(3) xor
592
                 eff_bus(i).bmask(0) xor eff_bus(i).bmask(1) xor
593
                 eff_bus(i).bmask(2) xor eff_bus(i).bmask(3) xor
594
                 not eff_bus(i).par;
595
 
596
      act_ibit := eff_bus(i).imask(conv_integer(unsigned(eff_id)));
597
      act_bbit := eff_bus(i).bmask(conv_integer(unsigned(eff_id)));
598
 
599
      n.dcf_brk(i) := eff_bus(i).dcf;     -- trace dcf state in brk
600
 
601
      if eff_bus(i).dcf = '1' then        -- if disconnected
602
        if r.msk_im(i) = '0' then           -- if not disabled
603
          n.dcf_dcf(i) := '1';                -- set dcf flag
604
        end if;
605
 
606
      else                                -- if connected
607
        if eff_bus(i).req = '1' then        -- request received ?
608
          if eff_bus(i).frm='1' or            -- frame error seen ?
609
             par_err='1' then                 -- parity error seen ?
610
            if r.msk_im(i) = '0' then           -- if not disabled
611
              n.exc_rte(i) := '1';                -- set rte flag
612
            end if;
613
 
614
          else                                -- here if valid request seen
615
            if act_ibit = '1' then              -- interrupt request
616
              if r.msk_im(i) = '1' then           -- if disabled
617
                n.exc_ui(i) := '1';                 -- set ui flag
618
              else                                -- if enabled
619
                n.req_lock := '0';                  -- release lock
620
                if eff_bus(i).stf = '0' then        -- and pg request
621
                  n.pgf_pif(i) := '1';                -- set pif flag
622
                else                                -- and st request
623
                  n.stf_sif(i) := '1';                -- set sif flag
624
                end if;
625
              end if;
626
            end if; -- act_ibit='1'
627
 
628
            if act_bbit = '1' then              -- boot request
629
              if r.msk_bm(i) = '1' then           -- if msk disabled
630
                n.exc_ui(i) := '1';                 -- set ui flag
631
              else                                -- if msk enabled
632
                if r.mtc_dsbt = '0' then            -- if mtc enabled
633
                  n.req_lock := '0';                  -- release lock
634
                  n.req_boot := '1';                  -- request boot
635
                end if;
636
                if eff_bus(i).stf = '0' then        -- and pg request
637
                  n.pgf_pbf(i) := '1';                -- set pbf flag
638
                else                                -- and st request
639
                  n.stf_sbf(i) := '1';                -- set sbf flag
640
                end if;
641
              end if;
642
            end if; -- act_bbit='1'
643
 
644
          end if;
645
 
646
        end if;
647
      end if;
648
    end loop;
649
 
650
    -- process cpu->iist responses
651
    if IIST_SRES.ack_lock = '1' then
652
      n.req_lock := '0';
653
    end if;
654
    if IIST_SRES.ack_boot = '1' then
655
      n.req_boot := '0';
656
    end if;
657
 
658
    N_REGS <= n;
659
 
660
    IB_SRES.dout <= idout;
661
    IB_SRES.ack  <= ibsel;
662
    IB_SRES.busy <= ibbusy;
663
 
664
    EI_REQ <= r.pgc_ie and int_or;
665
 
666
    if r.mtc_dsdrv = '1' then           -- if driver disconnected
667
      iout.dcf := '1';                    -- set dcf flag
668
      iout.req := '0';                    -- suppress requests
669
    end if;
670
    IIST_OUT <= iout;                   -- and finally send it out...
671
 
672
    IIST_MREQ.lock <= r.req_lock;
673
    IIST_MREQ.boot <= r.req_boot;
674
 
675
  end process proc_next;
676
 
677
 
678
end syn;

powered by: WebSVN 2.1.0

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