w11 - vhd 0.792
W11 CPU core and support modules
pdp11_gpr.vhd
Go to the documentation of this file.
1-- $Id: pdp11_gpr.vhd 1203 2019-08-19 21:41:03Z mueller $
2-- SPDX-License-Identifier: GPL-3.0-or-later
3-- Copyright 2006-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4--
5------------------------------------------------------------------------------
6-- Module Name: pdp11_gpr - syn
7-- Description: pdp11: general purpose registers
8--
9-- Dependencies: memlib/ram_1swar_1ar_gen
10--
11-- Test bench: tb/tb_pdp11_core (implicit)
12-- Target Devices: generic
13-- Tool versions: ise 8.2-14.7; viv 2014.4-2019.1; ghdl 0.18-0.36
14-- Revision History:
15-- Date Rev Version Comment
16-- 2019-08-17 1203 1.0.2 fix for ghdl V0.36 -Whide warnings
17-- 2011-11-18 427 1.0.4 now numeric_std clean
18-- 2008-08-22 161 1.0.3 rename ubf_ -> ibf_; use iblib
19-- 2007-12-30 108 1.0.2 use ubf_byte[01]
20-- 2007-06-14 56 1.0.1 Use slvtypes.all
21-- 2007-05-12 26 1.0 Initial version
22------------------------------------------------------------------------------
23
24library ieee;
25use ieee.std_logic_1164.all;
26use ieee.numeric_std.all;
27
28use work.slvtypes.all;
29use work.memlib.all;
30use work.iblib.all;
31use work.pdp11.all;
32
33-- ----------------------------------------------------------------------------
34
35entity pdp11_gpr is -- general purpose registers
36 port (
37 CLK : in slbit; -- clock
38 DIN : in slv16; -- input data
39 ASRC : in slv3; -- source register number
40 ADST : in slv3; -- destination register number
41 MODE : in slv2; -- processor mode (k=>00,s=>01,u=>11)
42 RSET : in slbit; -- register set
43 WE : in slbit; -- write enable
44 BYTOP : in slbit; -- byte operation (write low byte only)
45 PCINC : in slbit; -- increment PC
46 DSRC : out slv16; -- source register data
47 DDST : out slv16; -- destination register data
48 PC : out slv16 -- current PC value
49 );
50end pdp11_gpr;
51
52architecture syn of pdp11_gpr is
53
54-- --------------------------------------
55-- the register map determines the internal register file storage address
56-- of a register. The mapping is
57-- ADDR RNUM SET MODE
58-- 0000 000 0 -- R0 set 0
59-- 0001 001 0 -- R1 set 0
60-- 0010 010 0 -- R2 set 0
61-- 0011 011 0 -- R3 set 0
62-- 0100 100 0 -- R4 set 0
63-- 0101 101 0 -- R5 set 0
64-- 0110 110 - 00 SP kernel mode
65-- 0111 110 - 01 SP supervisor mode
66-- 1000 000 1 -- R0 set 1
67-- 1001 001 1 -- R1 set 1
68-- 1010 010 1 -- R2 set 1
69-- 1011 011 1 -- R3 set 1
70-- 1100 100 1 -- R4 set 1
71-- 1101 101 1 -- R5 set 1
72-- 1110 111 - -- PC
73-- 1111 110 - 11 SP user mode
74
75 procedure do_regmap (
76 signal PRNUM : in slv3; -- register number
77 signal PMODE : in slv2; -- processor mode (k=>00,s=>01,u=>11)
78 signal PRSET : in slbit; -- register set
79 signal PADDR : out slv4 -- internal address in regfile
80 ) is
81 begin
82 if PRNUM = c_gpr_pc then
83 PADDR <= "1110";
84 elsif PRNUM = c_gpr_sp then
85 PADDR <= PMODE(1) & "11" & PMODE(0);
86 else
87 PADDR <= PRSET & PRNUM;
88 end if;
89 end procedure do_regmap;
90
91-- --------------------------------------
92
93 signal MASRC : slv4 := (others=>'0'); -- mapped source register address
94 signal MADST : slv4 := (others=>'0'); -- mapped destination register address
95 signal WE1 : slbit := '0'; -- write enable high byte
96 signal MEMSRC : slv16 := (others=>'0');-- source reg data from memory
97 signal MEMDST : slv16 := (others=>'0');-- destination reg data from memory
98 signal R_PC : slv16 := (others=>'0'); -- PC register
99
100begin
101
102 do_regmap(PRNUM => ASRC, PMODE => MODE, PRSET => RSET, PADDR => MASRC);
103 do_regmap(PRNUM => ADST, PMODE => MODE, PRSET => RSET, PADDR => MADST);
104
105 WE1 <= WE and not BYTOP;
106
107 GPR_LOW : ram_1swar_1ar_gen
108 generic map (
109 AWIDTH => 4,
110 DWIDTH => 8)
111 port map (
112 CLK => CLK,
113 WE => WE,
114 ADDRA => MADST,
115 ADDRB => MASRC,
116 DI => DIN(ibf_byte0),
117 DOA => MEMDST(ibf_byte0),
118 DOB => MEMSRC(ibf_byte0));
119
120 GPR_HIGH : ram_1swar_1ar_gen
121 generic map (
122 AWIDTH => 4,
123 DWIDTH => 8)
124 port map (
125 CLK => CLK,
126 WE => WE1,
127 ADDRA => MADST,
128 ADDRB => MASRC,
129 DI => DIN(ibf_byte1),
130 DOA => MEMDST(ibf_byte1),
131 DOB => MEMSRC(ibf_byte1));
132
133 proc_pc : process (CLK)
134 alias R_PC15 : slv15 is R_PC(15 downto 1); -- upper 15 bit of PC
135 begin
136 if rising_edge(CLK) then
137 if WE='1' and ADST=c_gpr_pc then
138 R_PC(ibf_byte0) <= DIN(ibf_byte0);
139 if BYTOP = '0' then
140 R_PC(ibf_byte1) <= DIN(ibf_byte1);
141 end if;
142 elsif PCINC = '1' then
143 R_PC15 <= slv(unsigned(R_PC15) + 1);
144 end if;
145 end if;
146 end process proc_pc;
147
148 DSRC <= R_PC when ASRC=c_gpr_pc else MEMSRC;
149 DDST <= R_PC when ADST=c_gpr_pc else MEMDST;
150 PC <= R_PC;
151
152end syn;
Definition: iblib.vhd:33
slv4 :=( others => '0') MASRC
Definition: pdp11_gpr.vhd:93
slv16 :=( others => '0') MEMSRC
Definition: pdp11_gpr.vhd:96
slv16 :=( others => '0') MEMDST
Definition: pdp11_gpr.vhd:97
slv16 :=( others => '0') R_PC
Definition: pdp11_gpr.vhd:98
do_regmapPRNUM,PMODE,PRSET,PADDR,
Definition: pdp11_gpr.vhd:75
slbit := '0' WE1
Definition: pdp11_gpr.vhd:95
slv4 :=( others => '0') MADST
Definition: pdp11_gpr.vhd:94
in MODE slv2
Definition: pdp11_gpr.vhd:41
out DSRC slv16
Definition: pdp11_gpr.vhd:46
out DDST slv16
Definition: pdp11_gpr.vhd:47
in CLK slbit
Definition: pdp11_gpr.vhd:37
in ADST slv3
Definition: pdp11_gpr.vhd:40
in DIN slv16
Definition: pdp11_gpr.vhd:38
in RSET slbit
Definition: pdp11_gpr.vhd:42
in ASRC slv3
Definition: pdp11_gpr.vhd:39
in BYTOP slbit
Definition: pdp11_gpr.vhd:44
in WE slbit
Definition: pdp11_gpr.vhd:43
in PCINC slbit
Definition: pdp11_gpr.vhd:45
out PC slv16
Definition: pdp11_gpr.vhd:49
Definition: pdp11.vhd:108
AWIDTH positive := 4
in DI slv( DWIDTH- 1 downto 0)
in ADDRB slv( AWIDTH- 1 downto 0)
in ADDRA slv( AWIDTH- 1 downto 0)
out DOB slv( DWIDTH- 1 downto 0)
out DOA slv( DWIDTH- 1 downto 0)
DWIDTH positive := 16
std_logic_vector( 14 downto 0) slv15
Definition: slvtypes.vhd:47
std_logic_vector( 3 downto 0) slv4
Definition: slvtypes.vhd:36
std_logic_vector( 2 downto 0) slv3
Definition: slvtypes.vhd:35
std_logic_vector( 15 downto 0) slv16
Definition: slvtypes.vhd:48
std_logic slbit
Definition: slvtypes.vhd:30
std_logic_vector( 1 downto 0) slv2
Definition: slvtypes.vhd:34
std_logic_vector slv
Definition: slvtypes.vhd:31