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

Subversion Repositories avr_hp

[/] [avr_hp/] [trunk/] [rtl/] [rtl_s3_cm3/] [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_cm3 is port (
16
                cp2_cml_1 : in std_logic;
17
                cp2_cml_2 : in std_logic;
18
 
19
                                    --Clock and reset
20
                                cp2           : in std_logic;
21
                                                        cp2en         : in std_logic;
22
                            ireset        : in std_logic;
23
 
24
                            adr           : in std_logic_vector(5 downto 0);
25
                            iowe          : in std_logic;
26
                            dbusout       : in std_logic_vector(7 downto 0);
27
 
28
                            sreg_fl_in    : in std_logic_vector(7 downto 0);
29
                            sreg_out      : out std_logic_vector(7 downto 0);
30
 
31
                            sreg_fl_wr_en : in  std_logic_vector (7 downto 0);   --FLAGS WRITE ENABLE SIGNALS       
32
 
33
                            spl_out       : out std_logic_vector(7 downto 0);
34
                            sph_out       : out std_logic_vector(7 downto 0);
35
                            sp_ndown_up   : in std_logic; -- DIRECTION OF CHANGING OF STACK POINTER SPH:SPL 0->UP(+) 1->DOWN(-)
36
                            sp_en         : in std_logic; -- WRITE ENABLE(COUNT ENABLE) FOR SPH AND SPL REGISTERS
37
 
38
                            rampz_out    : out std_logic_vector(7 downto 0));
39
end io_reg_file_cm3;
40
 
41
architecture rtl of io_reg_file_cm3 is
42
signal sreg    : std_logic_vector(7 downto 0);
43
signal sph     : std_logic_vector(7 downto 0);
44
signal spl     : std_logic_vector(7 downto 0);
45
signal rampz   : std_logic_vector(7 downto 0);
46
 
47
signal sp_int  : std_logic_vector(15 downto 0);
48
signal sp_intp : std_logic_vector(15 downto 0);
49
signal sp_intm : std_logic_vector(15 downto 0);
50
signal sp_res : std_logic_vector(15 downto 0);
51
 
52
 
53
signal adr_cml_2 :  std_logic_vector ( 5 downto 0 );
54
signal sreg_cml_2 :  std_logic_vector ( 7 downto 0 );
55
signal sreg_cml_1 :  std_logic_vector ( 7 downto 0 );
56
signal sph_out_cml_out :  std_logic_vector ( 7 downto 0 );
57
signal sph_cml_2 :  std_logic_vector ( 7 downto 0 );
58
signal sph_cml_1 :  std_logic_vector ( 7 downto 0 );
59
signal spl_out_cml_out :  std_logic_vector ( 7 downto 0 );
60
signal spl_cml_2 :  std_logic_vector ( 7 downto 0 );
61
signal spl_cml_1 :  std_logic_vector ( 7 downto 0 );
62
signal rampz_out_cml_out :  std_logic_vector ( 7 downto 0 );
63
signal rampz_cml_2 :  std_logic_vector ( 7 downto 0 );
64
signal rampz_cml_1 :  std_logic_vector ( 7 downto 0 );
65
 
66
begin
67
 
68
 
69
 
70
process(cp2_cml_1) begin
71
if (cp2_cml_1 = '1' and cp2_cml_1'event) then
72
        sreg_cml_1 <= sreg;
73
        sph_cml_1 <= sph;
74
        spl_cml_1 <= spl;
75
        rampz_cml_1 <= rampz;
76
end if;
77
end process;
78
 
79
process(cp2_cml_2) begin
80
if (cp2_cml_2 = '1' and cp2_cml_2'event) then
81
        adr_cml_2 <= adr;
82
        sreg_cml_2 <= sreg_cml_1;
83
        sph_cml_2 <= sph_cml_1;
84
        spl_cml_2 <= spl_cml_1;
85
        rampz_cml_2 <= rampz_cml_1;
86
end if;
87
end process;
88
sph_out <= sph_out_cml_out;
89
spl_out <= spl_out_cml_out;
90
rampz_out <= rampz_out_cml_out;
91
 
92
 
93
-- SynEDA CoreMultiplier
94
-- assignment(s): sreg
95
-- replace(s): adr, sreg
96
 
97
sreg_write:process(cp2,ireset)
98
begin
99
if ireset='0' then
100
sreg <= (others => '0');
101
elsif (cp2='1' and cp2'event) then sreg <= sreg_cml_2;
102
 if (cp2en='1') then                                                      -- Clock enable       
103
  for i in sreg'range loop
104
   if (sreg_fl_wr_en(i)='1' or (adr_cml_2=SREG_Address and iowe='1')) then    -- CLOCK ENABLE
105
    if iowe='1' then
106
     sreg(i) <= dbusout(i);                        -- FROM THE INTERNAL DATA BUS
107
    else
108
     sreg(i) <= sreg_fl_in(i);                  -- FROM ALU FLAGS
109
    end if;
110
   end if;
111
  end loop;
112
 end if;
113
end if;
114
end process;
115
 
116
sreg_out <= sreg;
117
 
118
 
119
-- SynEDA CoreMultiplier
120
-- assignment(s): sp_intp
121
-- replace(s): sph, spl
122
 
123
sp_intp<=(sph_cml_2&spl_cml_2)+1;
124
-- SynEDA CoreMultiplier
125
-- assignment(s): sp_intm
126
-- replace(s): sph, spl
127
 
128
sp_intm<=(sph_cml_2&spl_cml_2)-1;
129
sp_res<= sp_intm when sp_ndown_up='0' else sp_intp;
130
 
131
-- SynEDA CoreMultiplier
132
-- assignment(s): spl
133
-- replace(s): adr, spl
134
 
135
spl_write:process(cp2,ireset)
136
begin
137
if ireset='0' then
138
spl <= (others => '0');
139
elsif (cp2='1' and cp2'event) then spl <= spl_cml_2;
140
if (sp_en='1' or (adr_cml_2=SPL_Address and iowe='1')) then    -- CLOCK ENABLE
141
 if iowe='1' then
142
  spl <= dbusout;                                        -- FROM THE INTERNAL DATA BUS
143
   else
144
    spl <= sp_res(7 downto 0);                          -- FROM SPL BUS
145
     end if;
146
 end if;
147
 
148
end if;
149
end process;
150
 
151
-- SynEDA CoreMultiplier
152
-- assignment(s): spl_out
153
-- replace(s): spl
154
 
155
spl_out_cml_out <= spl_cml_1;
156
 
157
-- SynEDA CoreMultiplier
158
-- assignment(s): sph
159
-- replace(s): adr, sph
160
 
161
sph_write:process(cp2,ireset)
162
begin
163
if ireset='0' then
164
sph <= (others => '0');
165
elsif (cp2='1' and cp2'event) then sph <= sph_cml_2;
166
if (sp_en='1' or (adr_cml_2=SPH_Address and iowe='1')) then    -- CLOCK ENABLE
167
 if iowe='1' then
168
  sph <= dbusout;                        -- FROM THE INTERNAL DATA BUS
169
   else
170
    sph <= sp_res(15 downto 8);                          -- FROM SPH BUS
171
     end if;
172
 end if;
173
 
174
end if;
175
end process;
176
 
177
-- SynEDA CoreMultiplier
178
-- assignment(s): sph_out
179
-- replace(s): sph
180
 
181
sph_out_cml_out <= sph_cml_1;
182
 
183
 
184
-- SynEDA CoreMultiplier
185
-- assignment(s): rampz
186
-- replace(s): adr, rampz
187
 
188
rampz_write:process(cp2,ireset)
189
begin
190
if ireset='0' then
191
rampz <= (others => '0');
192
elsif (cp2='1' and cp2'event) then rampz <= rampz_cml_2;
193
if (adr_cml_2=RAMPZ_Address and iowe='1') then    -- CLOCK ENABLE
194
  rampz <= dbusout;                      -- FROM THE INTERNAL DATA BUS
195
 end if;
196
end if;
197
end process;
198
 
199
-- SynEDA CoreMultiplier
200
-- assignment(s): rampz_out
201
-- replace(s): rampz
202
 
203
rampz_out_cml_out <= rampz_cml_1;
204
 
205
end rtl;

powered by: WebSVN 2.1.0

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