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 8

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

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

powered by: WebSVN 2.1.0

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