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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [rtl/] [w11a/] [pdp11_dpath.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: pdp11_dpath.vhd 314 2010-07-09 17:38:41Z mueller $
2
--
3
-- Copyright 2006-2010 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:    pdp11_dpath - syn
16
-- Description:    pdp11: CPU datapath
17
--
18
-- Dependencies:   pdp11_gpr
19
--                 pdp11_psr
20
--                 pdp11_abox
21
--                 pdp11_dbox
22
--                 pdp11_lbox
23
--                 pdp11_mbox
24
--
25
-- Test bench:     tb/tb_pdp11_core (implicit)
26
-- Target Devices: generic
27
-- Tool versions:  xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
28
-- Revision History: 
29
-- Date         Rev Version  Comment
30
-- 2010-06-13   305   1.2    rename CPDIN -> CP_DIN; add CP_DOUT out port;
31
--                           remove CPADDR out port; drop R_CPADDR, proc_cpaddr;
32
--                           added R_CPDOUT, proc_cpdout
33
-- 2009-05-30   220   1.1.6  final removal of snoopers (were already commented)
34
-- 2008-12-14   177   1.1.5  fill gpr_* fields in DM_STAT_DP
35
-- 2008-08-22   161   1.1.4  rename ubf_ -> ibf_; use iblib
36
-- 2008-04-19   137   1.1.3  add DM_STAT_DP port
37
-- 2008-03-02   121   1.1.2  remove snoopers
38
-- 2008-02-24   119   1.1.1  add CPADDR register, remove R_MDIN (not needed)
39
-- 2007-12-30   107   1.1    use IB_MREQ/IB_SRES interface now (for psr access)
40
-- 2007-06-14    56   1.0.1  Use slvtypes.all
41
-- 2007-05-12    26   1.0    Initial version 
42
------------------------------------------------------------------------------
43
 
44
library ieee;
45
use ieee.std_logic_1164.all;
46
use ieee.std_logic_arith.all;
47
 
48
use work.slvtypes.all;
49
use work.iblib.all;
50
use work.pdp11.all;
51
 
52
-- ----------------------------------------------------------------------------
53
 
54
entity pdp11_dpath is                   -- CPU datapath
55
  port (
56
    CLK : in slbit;                     -- clock
57
    CRESET : in slbit;                  -- console reset
58
    CNTL : in dpath_cntl_type;          -- control interface
59
    STAT : out dpath_stat_type;         -- status interface
60
    CP_DIN : in slv16;                  -- console port data in
61
    CP_DOUT : out slv16;                -- console port data out
62
    PSWOUT : out psw_type;              -- current psw
63
    PCOUT : out slv16;                  -- current pc
64
    IREG : out slv16;                   -- ireg out
65
    VM_ADDR : out slv16;                -- virt. memory address
66
    VM_DOUT : in slv16;                 -- virt. memory data out
67
    VM_DIN : out slv16;                 -- virt. memory data in
68
    IB_MREQ : in ib_mreq_type;          -- ibus request
69
    IB_SRES : out ib_sres_type;         -- ibus response    
70
    DM_STAT_DP : out dm_stat_dp_type    -- debug and monitor status
71
  );
72
end pdp11_dpath;
73
 
74
architecture syn of pdp11_dpath is
75
 
76
  signal R_DSRC : slv16 := (others=>'0');  -- SRC register
77
  signal R_DDST : slv16 := (others=>'0');  -- DST register
78
  signal R_DTMP : slv16 := (others=>'0');  -- TMP register
79
 
80
  signal R_IREG : slv16 := (others=>'0');  -- IREG register
81
 
82
  signal R_CPDOUT : slv16 := (others=>'0'); -- cp dout buffer
83
 
84
  signal GPR_DSRC : slv16 := (others=>'0');  -- 
85
  signal GPR_DDST : slv16 := (others=>'0');  -- 
86
  signal GPR_PC : slv16 := (others=>'0');    -- 
87
 
88
  signal PSW : psw_type := psw_init;     --
89
  signal CCIN : slv4 := (others=>'0');   -- cc input to xbox's
90
  signal CCOUT : slv4 := (others=>'0');  -- cc output from xbox's
91
 
92
  signal DRES : slv16 := (others=>'0');  -- result bus
93
  signal DRESE : slv16 := (others=>'0'); -- result bus extra
94
 
95
  signal ABOX_DOUT : slv16 := (others=>'0'); -- result abox
96
  signal DBOX_DOUT : slv16 := (others=>'0'); -- result dbox
97
  signal LBOX_DOUT : slv16 := (others=>'0'); -- result lbox
98
  signal MBOX_DOUT : slv16 := (others=>'0'); -- result mbox
99
 
100
  signal ABOX_NZOUT : slv2 := (others=>'0'); -- nz flags abox
101
  signal ABOX_CCOUT : slv4 := (others=>'0'); -- cc flags abox
102
  signal DBOX_CCOUT : slv4 := (others=>'0'); -- cc flags dbox
103
  signal LBOX_CCOUT : slv4 := (others=>'0'); -- cc flags lbox
104
  signal MBOX_CCOUT : slv4 := (others=>'0'); -- cc flags mbox
105
 
106
  subtype  lal_ibf_addr  is integer range 15 downto 1;
107
  subtype  lah_ibf_addr  is integer range  5 downto 0;
108
  constant lah_ibf_ena_22bit: integer :=  6;
109
  constant lah_ibf_ena_ubmap: integer :=  7;
110
 
111
begin
112
 
113
  GPR : pdp11_gpr port map (
114
    CLK   => CLK,
115
    DIN   => DRES,
116
    ASRC  => CNTL.gpr_asrc,
117
    ADST  => CNTL.gpr_adst,
118
    MODE  => CNTL.gpr_mode,
119
    RSET  => CNTL.gpr_rset,
120
    WE    => CNTL.gpr_we,
121
    BYTOP => CNTL.gpr_bytop,
122
    PCINC => CNTL.gpr_pcinc,
123
    DSRC  => GPR_DSRC,
124
    DDST  => GPR_DDST,
125
    PC    => GPR_PC
126
  );
127
 
128
  PSR : pdp11_psr port map(
129
    CLK     => CLK,
130
    CRESET  => CRESET,
131
    DIN     => DRES,
132
    CCIN    => CCOUT,
133
    CCWE    => CNTL.psr_ccwe,
134
    WE      => CNTL.psr_we,
135
    FUNC    => CNTL.psr_func,
136
    PSW     => PSW,
137
    IB_MREQ => IB_MREQ,
138
    IB_SRES => IB_SRES
139
  );
140
 
141
  ABOX : pdp11_abox port map (
142
    DSRC   => R_DSRC,
143
    DDST   => R_DDST,
144
    DTMP   => R_DTMP,
145
    PC     => GPR_PC,
146
    ASEL   => CNTL.abox_asel,
147
    AZERO  => CNTL.abox_azero,
148
    IREG8  => R_IREG(7 downto 0),
149
    VMDOUT => VM_DOUT,
150
    CONST  => CNTL.abox_const,
151
    BSEL   => CNTL.abox_bsel,
152
    OPSUB  => CNTL.abox_opsub,
153
    DOUT   => ABOX_DOUT,
154
    NZOUT  => ABOX_NZOUT
155
  );
156
 
157
  DBOX : pdp11_dbox port map (
158
    DSRC   => R_DSRC,
159
    DDST   => R_DDST,
160
    CI     => CCIN(0),
161
    SRCMOD => CNTL.dbox_srcmod,
162
    DSTMOD => CNTL.dbox_dstmod,
163
    CIMOD  => CNTL.dbox_cimod,
164
    CC1OP  => CNTL.dbox_cc1op,
165
    CCMODE => CNTL.dbox_ccmode,
166
    BYTOP  => CNTL.dbox_bytop,
167
    DOUT   => DBOX_DOUT,
168
    CCOUT  => DBOX_CCOUT
169
  );
170
 
171
  LBOX : pdp11_lbox port map (
172
    DSRC  => R_DSRC,
173
    DDST  => R_DDST,
174
    CCIN  => CCIN,
175
    FUNC  => CNTL.lbox_func,
176
    BYTOP => CNTL.lbox_bytop,
177
    DOUT  => LBOX_DOUT,
178
    CCOUT => LBOX_CCOUT
179
  );
180
 
181
  MBOX : pdp11_mbox port map (
182
    CLK       => CLK,
183
    DSRC      => R_DSRC,
184
    DDST      => R_DDST,
185
    DTMP      => R_DTMP,
186
    GPR_DSRC  => GPR_DSRC,
187
    FUNC      => CNTL.mbox_func,
188
    S_DIV     => CNTL.mbox_s_div,
189
    S_DIV_CN  => CNTL.mbox_s_div_cn,
190
    S_DIV_CR  => CNTL.mbox_s_div_cr,
191
    S_ASH     => CNTL.mbox_s_ash,
192
    S_ASH_CN  => CNTL.mbox_s_ash_cn,
193
    S_ASHC    => CNTL.mbox_s_ashc,
194
    S_ASHC_CN => CNTL.mbox_s_ashc_cn,
195
    SHC_TC    => STAT.shc_tc,
196
    DIV_CR    => STAT.div_cr,
197
    DIV_CQ    => STAT.div_cq,
198
    DIV_ZERO  => STAT.div_zero,
199
    DIV_OVFL  => STAT.div_ovfl,
200
    DOUT      => MBOX_DOUT,
201
    DOUTE     => DRESE,
202
    CCOUT     => MBOX_CCOUT
203
  );
204
 
205
  CCIN <= PSW.cc;
206
 
207
  ABOX_CCOUT <= ABOX_NZOUT & "0" & CCIN(0); -- clear v, keep c
208
 
209
  proc_dres_sel: process (ABOX_DOUT, DBOX_DOUT, LBOX_DOUT, MBOX_DOUT,
210
                          VM_DOUT, R_IREG, CP_DIN, CNTL)
211
  begin
212
    case CNTL.dres_sel is
213
      when c_dpath_res_abox   => DRES <= ABOX_DOUT;
214
      when c_dpath_res_dbox   => DRES <= DBOX_DOUT;
215
      when c_dpath_res_lbox   => DRES <= LBOX_DOUT;
216
      when c_dpath_res_mbox   => DRES <= MBOX_DOUT;
217
      when c_dpath_res_vmdout => DRES <= VM_DOUT;
218
      when c_dpath_res_fpdout => DRES <= (others=>'0');
219
      when c_dpath_res_ireg   => DRES <= R_IREG;
220
      when c_dpath_res_cpdin  => DRES <= CP_DIN;
221
      when others => null;
222
    end case;
223
  end process proc_dres_sel;
224
 
225
  proc_cres_sel: process (ABOX_CCOUT, DBOX_CCOUT, LBOX_CCOUT, MBOX_CCOUT,
226
                          CCIN, CNTL)
227
  begin
228
    case CNTL.cres_sel is
229
      when c_dpath_res_abox   => CCOUT <= ABOX_CCOUT;
230
      when c_dpath_res_dbox   => CCOUT <= DBOX_CCOUT;
231
      when c_dpath_res_lbox   => CCOUT <= LBOX_CCOUT;
232
      when c_dpath_res_mbox   => CCOUT <= MBOX_CCOUT;
233
      when c_dpath_res_vmdout => CCOUT <= CCIN;
234
      when c_dpath_res_fpdout => CCOUT <= "0000";
235
      when c_dpath_res_ireg   => CCOUT <= CCIN;
236
      when c_dpath_res_cpdin  => CCOUT <= CCIN;
237
      when others => null;
238
    end case;
239
  end process proc_cres_sel;
240
 
241
  proc_dregs: process (CLK)
242
  begin
243
 
244
    if CLK'event and CLK='1' then
245
 
246
      if CNTL.dsrc_we = '1' then
247
        if CNTL.dsrc_sel = '0' then
248
          R_DSRC <= GPR_DSRC;
249
        else
250
          R_DSRC <= DRES;
251
        end if;
252
      end if;
253
 
254
      if CNTL.ddst_we = '1' then
255
        if CNTL.ddst_sel = '0' then
256
          R_DDST <= GPR_DDST;
257
        else
258
          R_DDST <= DRES;
259
        end if;
260
      end if;
261
 
262
      if CNTL.dtmp_we = '1' then
263
        case CNTL.dtmp_sel is
264
          when c_dpath_dtmp_dsrc  => R_DTMP <= GPR_DSRC;
265
          when c_dpath_dtmp_psw   =>
266
            R_DTMP <= (others=>'0');
267
            R_DTMP(psw_ibf_cmode) <= PSW.cmode;
268
            R_DTMP(psw_ibf_pmode) <= PSW.pmode;
269
            R_DTMP(psw_ibf_rset)  <= PSW.rset;
270
            R_DTMP(psw_ibf_pri)   <= PSW.pri;
271
            R_DTMP(psw_ibf_tflag) <= PSW.tflag;
272
            R_DTMP(psw_ibf_cc)    <= PSW.cc;
273
          when c_dpath_dtmp_dres  => R_DTMP <= DRES;
274
          when c_dpath_dtmp_drese => R_DTMP <= DRESE;
275
          when others => null;
276
        end case;
277
      end if;
278
 
279
    end if;
280
 
281
  end process proc_dregs;
282
 
283
  proc_mregs: process (CLK)
284
  begin
285
 
286
    if CLK'event and CLK='1' then
287
 
288
      if CNTL.ireg_we = '1' then
289
        R_IREG <= VM_DOUT;
290
      end if;
291
 
292
    end if;
293
  end process proc_mregs;
294
 
295
  proc_cpdout: process (CLK)
296
  begin
297
    if CLK'event and CLK='1'then
298
      if CRESET = '1' then
299
        R_CPDOUT <= (others=>'0');
300
      else
301
        if CNTL.cpdout_we = '1' then
302
          R_CPDOUT <= DRES;
303
        end if;
304
      end if;
305
    end if;
306
  end process proc_cpdout;
307
 
308
  proc_vmaddr_sel: process (R_DSRC, R_DDST, R_DTMP, GPR_PC, CNTL)
309
  begin
310
    case CNTL.vmaddr_sel is
311
      when c_dpath_vmaddr_dsrc => VM_ADDR <= R_DSRC;
312
      when c_dpath_vmaddr_ddst => VM_ADDR <= R_DDST;
313
      when c_dpath_vmaddr_dtmp => VM_ADDR <= R_DTMP;
314
      when c_dpath_vmaddr_pc   => VM_ADDR <= GPR_PC;
315
      when others => null;
316
    end case;
317
  end process proc_vmaddr_sel;
318
 
319
  STAT.ccout_z <= CCOUT(2);             -- current Z cc flag
320
 
321
  PSWOUT  <= PSW;
322
  PCOUT   <= GPR_PC;
323
  IREG    <= R_IREG;
324
  VM_DIN  <= DRES;
325
  CP_DOUT <= R_CPDOUT;
326
 
327
  DM_STAT_DP.pc        <= GPR_PC;
328
  DM_STAT_DP.psw       <= PSW;
329
  DM_STAT_DP.ireg      <= R_IREG;
330
  DM_STAT_DP.ireg_we   <= CNTL.ireg_we;
331
  DM_STAT_DP.dsrc      <= R_DSRC;
332
  DM_STAT_DP.ddst      <= R_DDST;
333
  DM_STAT_DP.dtmp      <= R_DTMP;
334
  DM_STAT_DP.dres      <= DRES;
335
  DM_STAT_DP.gpr_adst  <= CNTL.gpr_adst;
336
  DM_STAT_DP.gpr_mode  <= CNTL.gpr_mode;
337
  DM_STAT_DP.gpr_bytop <= CNTL.gpr_bytop;
338
  DM_STAT_DP.gpr_we    <= CNTL.gpr_we;
339
 
340
end syn;

powered by: WebSVN 2.1.0

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