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

Subversion Repositories neural_net_perceptron

[/] [neural_net_perceptron/] [trunk/] [rtl/] [vhdl/] [p0300_m00026_s_v02_rd_wr_fsm.vhd] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 fpga_is_fu
-- COPYRIGHT (C) 2022 by Jens Gutschmidt / VIVARE GmbH Switzerland
2
-- (email: opencores@vivare-services.com)
3
-- 
4
-- This program is free software: you can redistribute it and/or modify it
5
-- under the terms of the GNU General Public License as published by
6
-- the Free Software Foundation, either version 3 of the License, or any
7
-- 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
11
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
-- See the GNU General Public License for more details.
13
-- 
14
-- You should have received a copy of the GNU General Public License
15
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
-- 
17
-- 
18
LIBRARY ieee;
19
USE ieee.std_logic_1164.all;
20
USE ieee.std_logic_arith.all;
21
--USE ieee.numeric_std.all;
22
LIBRARY work;
23
USE work.memory_vhd_v03_pkg.ALL;
24
 
25
ENTITY p0300_m00026_s_v02_rd_wr_fsm IS
26
   PORT(
27
      clk_i             : IN     std_logic;
28
      cnti_end_i        : IN     std_logic;
29
      cntj_end_i        : IN     std_logic;
30
      ctrl_din_i        : IN     DATA_T;
31
      ctrl_rd_vec_i     : IN     MEM_WR_LINES_T;
32
      ctrl_rdlat_i      : IN     MEM_LAT_CNT_WIDTH_T;
33
      ctrl_rdy7_i       : IN     std_logic;
34
      ctrl_start_i      : IN     std_logic;
35
      ctrl_wr_vec_i     : IN     MEM_WR_LINES_T;
36
      ctrl_wrlat_i      : IN     MEM_LAT_CNT_WIDTH_T;
37
      dbias_i           : IN     DATA_T;
38
      ds_i              : IN     DATA_T;
39
      dt_i              : IN     DATA_T;
40
      dw_i              : IN     DATA_T;
41
      dy_i              : IN     DATA_T;
42
      rst_n_i           : IN     std_logic;
43
      cnteni_o          : OUT    std_logic;
44
      cntenj_o          : OUT    std_logic;
45
      ctrl_complete_o   : OUT    std_logic;
46
      ctrl_dout_o       : OUT    DATA_T;
47
      ctrl_dout_valid_o : OUT    std_logic;
48
      ctrl_rdy_o        : OUT    std_logic;
49
      dout_o            : OUT    DATA_T;
50
      we_bias_o         : OUT    std_logic;
51
      we_s_o            : OUT    std_logic;
52
      we_t_o            : OUT    std_logic;
53
      we_w_o            : OUT    std_logic;
54
      we_y_o            : OUT    std_logic
55
   );
56
 
57
-- Declarations
58
 
59
END p0300_m00026_s_v02_rd_wr_fsm ;
60
-- COPYRIGHT (C) 2022 Jens Gutschmidt /
61
-- VIVARE GmbH Switzerland
62
-- (email: opencores@vivare-services.com)
63
-- 
64
-- Versions:
65
-- Revision 2.0  2022/07/02
66
-- - Introduced latency for write
67
-- Revision 1.0  2022/06/09
68
-- -- First draft
69
-- 
70
LIBRARY ieee;
71
USE ieee.std_logic_1164.all;
72
USE ieee.std_logic_arith.all;
73
--USE ieee.numeric_std.all;
74
LIBRARY work;
75
USE work.memory_vhd_v03_pkg.ALL;
76
 
77
ARCHITECTURE fsm OF p0300_m00026_s_v02_rd_wr_fsm IS
78
 
79
   -- Architecture Declarations
80
   SIGNAL ctrl_complete_reg : std_logic;
81
   SIGNAL ctrl_dout_reg : DATA_T;
82
   SIGNAL ctrl_dout_valid_reg : std_logic;
83
   SIGNAL ctrl_rdlat_reg : MEM_LAT_CNT_WIDTH_T;
84
   SIGNAL ctrl_start_reg : std_logic;
85
   SIGNAL ctrl_wrlat_reg : MEM_LAT_CNT_WIDTH_T;
86
 
87
   TYPE STATE_TYPE IS (
88
      S01,
89
      S02,
90
      S12,
91
      S22,
92
      S32,
93
      S42,
94
      S03,
95
      S00
96
   );
97
 
98
   -- Declare current and next state signals
99
   SIGNAL current_state : STATE_TYPE;
100
   SIGNAL next_state : STATE_TYPE;
101
 
102
BEGIN
103
 
104
   -----------------------------------------------------------------
105
   clocked_proc : PROCESS (
106
      clk_i
107
   )
108
   -----------------------------------------------------------------
109
   BEGIN
110
      IF (clk_i'EVENT AND clk_i = '1') THEN
111
         IF (rst_n_i = '0') THEN
112
            current_state <= S00;
113
            -- Default Reset Values
114
            ctrl_complete_reg <= '0';
115
            ctrl_dout_reg <= (others => '0');
116
            ctrl_dout_valid_reg <= '0';
117
            ctrl_rdlat_reg <= (others => '0');
118
            ctrl_start_reg <= '0';
119
            ctrl_wrlat_reg <= (others => '0');
120
         ELSE
121
            current_state <= next_state;
122
            -- Default Assignment To Internals
123
            ctrl_complete_reg <= '0';
124
            ctrl_dout_reg <= ctrl_dout_reg;
125
            ctrl_dout_valid_reg <= '0';
126
            ctrl_rdlat_reg <= ctrl_rdlat_reg;
127
            ctrl_start_reg <= ctrl_start_i;
128
            ctrl_wrlat_reg <= ctrl_wrlat_reg;
129
 
130
            -- Combined Actions
131
            CASE current_state IS
132
               -- Wait for next
133
               -- RD/WR.
134
               WHEN S01 =>
135
                  ctrl_rdlat_reg <= ctrl_rdlat_i;
136
                  ctrl_wrlat_reg <= ctrl_wrlat_i;
137
               -- RD/WR W
138
               WHEN S02 =>
139
                  ctrl_dout_reg <= dw_i;
140
                  ctrl_dout_valid_reg <= '1';
141
                  ctrl_complete_reg <= cnti_end_i AND cntj_end_i;
142
               -- RD/WR S
143
               WHEN S12 =>
144
                  ctrl_dout_reg <= ds_i;
145
                  ctrl_dout_valid_reg <= '1';
146
                  ctrl_complete_reg <= cnti_end_i;
147
               -- RD/WR Y
148
               WHEN S22 =>
149
                  ctrl_dout_reg <= dy_i;
150
                  ctrl_dout_valid_reg <= '1';
151
                  ctrl_complete_reg <= cntj_end_i;
152
               -- RD/WR BIAS
153
               WHEN S32 =>
154
                  ctrl_dout_reg <= dbias_i;
155
                  ctrl_dout_valid_reg <= '1';
156
                  ctrl_complete_reg <= cntj_end_i;
157
               -- RD/WR T
158
               WHEN S42 =>
159
                  ctrl_dout_reg <= dt_i;
160
                  ctrl_dout_valid_reg <= '1';
161
                  ctrl_complete_reg <= cntj_end_i;
162
               -- Dummy cycles to
163
               -- equalize latency.
164
               WHEN S03 =>
165
                  ctrl_rdlat_reg <= '0' & ctrl_rdlat_reg ( MEM_LAT_CNT_WIDTH - 1 downto 1 );
166
                  ctrl_wrlat_reg <= '0' & ctrl_wrlat_reg ( MEM_LAT_CNT_WIDTH - 1 downto 1 );
167
               WHEN OTHERS =>
168
                  NULL;
169
            END CASE;
170
         END IF;
171
      END IF;
172
   END PROCESS clocked_proc;
173
 
174
   -----------------------------------------------------------------
175
   nextstate_proc : PROCESS (
176
      ctrl_rd_vec_i,
177
      ctrl_rdlat_reg,
178
      ctrl_rdy7_i,
179
      ctrl_start_reg,
180
      ctrl_wrlat_reg,
181
      current_state
182
   )
183
   -----------------------------------------------------------------
184
   BEGIN
185
      CASE current_state IS
186
         -- Wait for next
187
         -- RD/WR.
188
         WHEN S01 =>
189
            IF (ctrl_start_reg = '1' AND
190
                 (ctrl_rd_vec_i( MEM_W_BITPOS ) = '1')) THEN
191
               next_state <= S02;
192
            ELSIF (ctrl_start_reg = '1' AND
193
                    (ctrl_rd_vec_i( MEM_S_BITPOS ) = '1')) THEN
194
               next_state <= S12;
195
            ELSIF (ctrl_start_reg = '1' AND
196
                    (ctrl_rd_vec_i( MEM_Y_BITPOS ) = '1')) THEN
197
               next_state <= S22;
198
            ELSIF (ctrl_start_reg = '1' AND
199
                    (ctrl_rd_vec_i( MEM_BIAS_BITPOS ) = '1')) THEN
200
               next_state <= S32;
201
            ELSIF (ctrl_start_reg = '1' AND
202
                    (ctrl_rd_vec_i( MEM_T_BITPOS ) = '1')) THEN
203
               next_state <= S42;
204
            ELSE
205
               next_state <= S01;
206
            END IF;
207
         -- RD/WR W
208
         WHEN S02 =>
209
            next_state <= S03;
210
         -- RD/WR S
211
         WHEN S12 =>
212
            next_state <= S03;
213
         -- RD/WR Y
214
         WHEN S22 =>
215
            next_state <= S03;
216
         -- RD/WR BIAS
217
         WHEN S32 =>
218
            next_state <= S03;
219
         -- RD/WR T
220
         WHEN S42 =>
221
            next_state <= S03;
222
         -- Dummy cycles to
223
         -- equalize latency.
224
         WHEN S03 =>
225
            IF (unsigned ( ctrl_rdlat_reg ) <= 3 AND
226
                unsigned ( ctrl_wrlat_reg ) <= 3) THEN
227
               next_state <= S01;
228
            ELSE
229
               next_state <= S03;
230
            END IF;
231
         -- Reset state
232
         WHEN S00 =>
233
            IF (ctrl_rdy7_i = '1') THEN
234
               next_state <= S01;
235
            ELSE
236
               next_state <= S00;
237
            END IF;
238
         WHEN OTHERS =>
239
            next_state <= S00;
240
      END CASE;
241
   END PROCESS nextstate_proc;
242
 
243
   -----------------------------------------------------------------
244
   output_proc : PROCESS (
245
      cnti_end_i,
246
      ctrl_complete_reg,
247
      ctrl_din_i,
248
      ctrl_dout_reg,
249
      ctrl_dout_valid_reg,
250
      ctrl_wr_vec_i,
251
      current_state
252
   )
253
   -----------------------------------------------------------------
254
   BEGIN
255
      -- Default Assignment
256
      cnteni_o <= '0';
257
      cntenj_o <= '0';
258
      ctrl_complete_o <= ctrl_complete_reg;
259
      ctrl_dout_o <= ctrl_dout_reg;
260
      ctrl_dout_valid_o <= ctrl_dout_valid_reg;
261
      ctrl_rdy_o <= '0';
262
      dout_o <= (others => '0');
263
      we_bias_o <= '0';
264
      we_s_o <= '0';
265
      we_t_o <= '0';
266
      we_w_o <= '0';
267
      we_y_o <= '0';
268
 
269
      -- Combined Actions
270
      CASE current_state IS
271
         -- Wait for next
272
         -- RD/WR.
273
         WHEN S01 =>
274
            ctrl_rdy_o <= '1';
275
         -- RD/WR W
276
         WHEN S02 =>
277
            cnteni_o <= '1';
278
            cntenj_o <= cnti_end_i;
279
            dout_o <= ctrl_din_i;
280
            we_w_o <= ctrl_wr_vec_i( MEM_W_BITPOS );
281
         -- RD/WR S
282
         WHEN S12 =>
283
            cnteni_o <= '1';
284
            dout_o <= ctrl_din_i;
285
            we_s_o <= ctrl_wr_vec_i( MEM_S_BITPOS );
286
         -- RD/WR Y
287
         WHEN S22 =>
288
            cntenj_o <= '1';
289
            dout_o <= ctrl_din_i;
290
            we_y_o <= ctrl_wr_vec_i( MEM_Y_BITPOS );
291
         -- RD/WR BIAS
292
         WHEN S32 =>
293
            cntenj_o <= '1';
294
            dout_o <= ctrl_din_i;
295
            we_bias_o <= ctrl_wr_vec_i( MEM_BIAS_BITPOS );
296
         -- RD/WR T
297
         WHEN S42 =>
298
            cntenj_o <= '1';
299
            dout_o <= ctrl_din_i;
300
            we_t_o <= ctrl_wr_vec_i( MEM_T_BITPOS );
301
         WHEN OTHERS =>
302
            NULL;
303
      END CASE;
304
   END PROCESS output_proc;
305
 
306
END fsm;

powered by: WebSVN 2.1.0

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