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

Subversion Repositories avr_hp

[/] [avr_hp/] [trunk/] [rtl/] [rtl_v5_cm4/] [io_reg_file.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobil
--************************************************************************************************
2
-- Internal I/O registers (implemented inside the core) decoder/multiplexer 
3
-- for AVR core
4
-- Version 1.3 (Special version for the JTAG OCD)
5
-- Designed by Ruslan Lepetenok
6
-- Modified 22.04.2004
7
--************************************************************************************************
8
 
9
library IEEE;
10
use IEEE.std_logic_1164.all;
11
use IEEE.std_logic_unsigned.all;
12
 
13
use WORK.AVRuCPackage.all;
14
 
15
entity io_reg_file_cm4 is port (
16
                cp2_cml_1 : in std_logic;
17
                cp2_cml_2 : in std_logic;
18
                cp2_cml_3 : in std_logic;
19
 
20
                                    --Clock and reset
21
                                cp2           : in std_logic;
22
                                                        cp2en         : in std_logic;
23
                            ireset        : in std_logic;
24
 
25
                            adr           : in std_logic_vector(5 downto 0);
26
                            iowe          : in std_logic;
27
                            dbusout       : in std_logic_vector(7 downto 0);
28
 
29
                            sreg_fl_in    : in std_logic_vector(7 downto 0);
30
                            sreg_out      : out std_logic_vector(7 downto 0);
31
 
32
                            sreg_fl_wr_en : in  std_logic_vector (7 downto 0);   --FLAGS WRITE ENABLE SIGNALS       
33
 
34
                            spl_out       : out std_logic_vector(7 downto 0);
35
                            sph_out       : out std_logic_vector(7 downto 0);
36
                            sp_ndown_up   : in std_logic; -- DIRECTION OF CHANGING OF STACK POINTER SPH:SPL 0->UP(+) 1->DOWN(-)
37
                            sp_en         : in std_logic; -- WRITE ENABLE(COUNT ENABLE) FOR SPH AND SPL REGISTERS
38
 
39
                            rampz_out    : out std_logic_vector(7 downto 0));
40
end io_reg_file_cm4;
41
 
42
architecture rtl of io_reg_file_cm4 is
43
signal sreg    : std_logic_vector(7 downto 0);
44
signal sph     : std_logic_vector(7 downto 0);
45
signal spl     : std_logic_vector(7 downto 0);
46
signal rampz   : std_logic_vector(7 downto 0);
47
 
48
signal sp_int  : std_logic_vector(15 downto 0);
49
signal sp_intp : std_logic_vector(15 downto 0);
50
signal sp_intm : std_logic_vector(15 downto 0);
51
signal sp_res : std_logic_vector(15 downto 0);
52
 
53
 
54
signal adr_cml_3 :  std_logic_vector ( 5 downto 0 );
55
signal adr_cml_2 :  std_logic_vector ( 5 downto 0 );
56
signal sreg_cml_3 :  std_logic_vector ( 7 downto 0 );
57
signal sreg_cml_2 :  std_logic_vector ( 7 downto 0 );
58
signal sreg_cml_1 :  std_logic_vector ( 7 downto 0 );
59
signal sph_out_cml_out :  std_logic_vector ( 7 downto 0 );
60
signal sph_cml_3 :  std_logic_vector ( 7 downto 0 );
61
signal sph_cml_2 :  std_logic_vector ( 7 downto 0 );
62
signal sph_cml_1 :  std_logic_vector ( 7 downto 0 );
63
signal spl_out_cml_out :  std_logic_vector ( 7 downto 0 );
64
signal spl_cml_3 :  std_logic_vector ( 7 downto 0 );
65
signal spl_cml_2 :  std_logic_vector ( 7 downto 0 );
66
signal spl_cml_1 :  std_logic_vector ( 7 downto 0 );
67
signal rampz_out_cml_out :  std_logic_vector ( 7 downto 0 );
68
signal rampz_cml_3 :  std_logic_vector ( 7 downto 0 );
69
signal rampz_cml_2 :  std_logic_vector ( 7 downto 0 );
70
signal rampz_cml_1 :  std_logic_vector ( 7 downto 0 );
71
 
72
begin
73
 
74
 
75
 
76
process(cp2_cml_1) begin
77
if (cp2_cml_1 = '1' and cp2_cml_1'event) then
78
        sreg_cml_1 <= sreg;
79
        sph_cml_1 <= sph;
80
        spl_cml_1 <= spl;
81
        rampz_cml_1 <= rampz;
82
end if;
83
end process;
84
 
85
process(cp2_cml_2) begin
86
if (cp2_cml_2 = '1' and cp2_cml_2'event) then
87
        adr_cml_2 <= adr;
88
        sreg_cml_2 <= sreg_cml_1;
89
        sph_cml_2 <= sph_cml_1;
90
        spl_cml_2 <= spl_cml_1;
91
        rampz_cml_2 <= rampz_cml_1;
92
end if;
93
end process;
94
 
95
process(cp2_cml_3) begin
96
if (cp2_cml_3 = '1' and cp2_cml_3'event) then
97
        adr_cml_3 <= adr_cml_2;
98
        sreg_cml_3 <= sreg_cml_2;
99
        sph_cml_3 <= sph_cml_2;
100
        spl_cml_3 <= spl_cml_2;
101
        rampz_cml_3 <= rampz_cml_2;
102
end if;
103
end process;
104
sph_out <= sph_out_cml_out;
105
spl_out <= spl_out_cml_out;
106
rampz_out <= rampz_out_cml_out;
107
 
108
 
109
-- SynEDA CoreMultiplier
110
-- assignment(s): sreg
111
-- replace(s): adr, sreg
112
 
113
sreg_write:process(cp2,ireset)
114
begin
115
if ireset='0' then
116
sreg <= (others => '0');
117
elsif (cp2='1' and cp2'event) then sreg <= sreg_cml_3;
118
 if (cp2en='1') then                                                      -- Clock enable       
119
  for i in sreg'range loop
120
   if (sreg_fl_wr_en(i)='1' or (adr_cml_3=SREG_Address and iowe='1')) then    -- CLOCK ENABLE
121
    if iowe='1' then
122
     sreg(i) <= dbusout(i);                        -- FROM THE INTERNAL DATA BUS
123
    else
124
     sreg(i) <= sreg_fl_in(i);                  -- FROM ALU FLAGS
125
    end if;
126
   end if;
127
  end loop;
128
 end if;
129
end if;
130
end process;
131
 
132
sreg_out <= sreg;
133
 
134
 
135
-- SynEDA CoreMultiplier
136
-- assignment(s): sp_intp
137
-- replace(s): sph, spl
138
 
139
sp_intp<=(sph_cml_3&spl_cml_3)+1;
140
-- SynEDA CoreMultiplier
141
-- assignment(s): sp_intm
142
-- replace(s): sph, spl
143
 
144
sp_intm<=(sph_cml_3&spl_cml_3)-1;
145
sp_res<= sp_intm when sp_ndown_up='0' else sp_intp;
146
 
147
-- SynEDA CoreMultiplier
148
-- assignment(s): spl
149
-- replace(s): adr, spl
150
 
151
spl_write:process(cp2,ireset)
152
begin
153
if ireset='0' then
154
spl <= (others => '0');
155
elsif (cp2='1' and cp2'event) then spl <= spl_cml_3;
156
if (sp_en='1' or (adr_cml_3=SPL_Address and iowe='1')) then    -- CLOCK ENABLE
157
 if iowe='1' then
158
  spl <= dbusout;                                        -- FROM THE INTERNAL DATA BUS
159
   else
160
    spl <= sp_res(7 downto 0);                          -- FROM SPL BUS
161
     end if;
162
 end if;
163
 
164
end if;
165
end process;
166
 
167
-- SynEDA CoreMultiplier
168
-- assignment(s): spl_out
169
-- replace(s): spl
170
 
171
spl_out_cml_out <= spl_cml_1;
172
 
173
-- SynEDA CoreMultiplier
174
-- assignment(s): sph
175
-- replace(s): adr, sph
176
 
177
sph_write:process(cp2,ireset)
178
begin
179
if ireset='0' then
180
sph <= (others => '0');
181
elsif (cp2='1' and cp2'event) then sph <= sph_cml_3;
182
if (sp_en='1' or (adr_cml_3=SPH_Address and iowe='1')) then    -- CLOCK ENABLE
183
 if iowe='1' then
184
  sph <= dbusout;                        -- FROM THE INTERNAL DATA BUS
185
   else
186
    sph <= sp_res(15 downto 8);                          -- FROM SPH BUS
187
     end if;
188
 end if;
189
 
190
end if;
191
end process;
192
 
193
-- SynEDA CoreMultiplier
194
-- assignment(s): sph_out
195
-- replace(s): sph
196
 
197
sph_out_cml_out <= sph_cml_1;
198
 
199
 
200
-- SynEDA CoreMultiplier
201
-- assignment(s): rampz
202
-- replace(s): adr, rampz
203
 
204
rampz_write:process(cp2,ireset)
205
begin
206
if ireset='0' then
207
rampz <= (others => '0');
208
elsif (cp2='1' and cp2'event) then rampz <= rampz_cml_3;
209
if (adr_cml_3=RAMPZ_Address and iowe='1') then    -- CLOCK ENABLE
210
  rampz <= dbusout;                      -- FROM THE INTERNAL DATA BUS
211
 end if;
212
end if;
213
end process;
214
 
215
-- SynEDA CoreMultiplier
216
-- assignment(s): rampz_out
217
-- replace(s): rampz
218
 
219
rampz_out_cml_out <= rampz_cml_1;
220
 
221
end rtl;

powered by: WebSVN 2.1.0

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