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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.74/] [rtl/] [w11a/] [pdp11_dpath.vhd] - Blame information for rev 40

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

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

powered by: WebSVN 2.1.0

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