can_controller.vhd


1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity can_controller is
5
port(
6
  --- can ctrl input ---
7
  clk      : in std_logic; -- clock
8
  reset    : in std_logic; -- low active reset
9
  can_data : inout std_logic_vector(88 downto 0); -- CAN_DATA := FRAME INFO(8)+ ID(16)+ DATA(64)
10
  can_rd  : in std_logic; -- read can message
11
  can_wr  : in std_logic; -- write can message
12
  
13
  --- can ctrl output ---
14
  -- interface for can_top enity
15
  rst   : out std_logic; -- reset
16
  ale   : out std_logic; -- adress letch enable
17
  rd     : out std_logic; -- read 8 bit
18
  wr     : out std_logic; -- write 8 bit 
19
  cs_can : out std_logic; -- chip select
20
  port_0 : inout std_logic_vector(7 downto 0) -- data buffer
21
);
22
end can_controller;
23
24
architecture beh_can_controller of can_controller is
25
type type_main_state is (IDLE,
26
                 CONFIGURE,
27
                 TRANSMIT,
28
                 RECEIVE);
29
                 
30
type type_config_state is (RESET_MODE_ON,
31
                  ACTIVE_BASIC_CONFIG,
32
                  SET_BAUD_SYNC,
33
                  SET_ACCEPTANCE_MASK,
34
                  SET_ACCEPTANCE_MASK2,
35
                  SET_BUS_TIMING,
36
                  RESET_MODE_OFF);
37
                  
38
type type_reg_read_state is ( RD_SET_CS,
39
                  RD_SET_REG_ADR,
40
                  RD_GET_reg_data_buffer);
41
                  
42
type type_can_read_state is ( FRAME_INFORMATION_RD,
43
                    IDENTIFIER_0_RD,
44
                    IDENTIFIER_1_RD,
45
                    BYTE_0_RD,
46
                     BYTE_1_RD,
47
                    BYTE_2_RD,
48
                    BYTE_3_RD,
49
                    BYTE_4_RD,
50
                    BYTE_5_RD,
51
                    BYTE_6_RD,
52
                    BYTE_7_RD);
53
54
type type_can_write_state is ( FRAME_INFORMATION_WR,
55
                     IDENTIFIER_0_WR,
56
                     IDENTIFIER_1_WR,
57
                     BYTE_0_WR,
58
                      BYTE_1_WR,
59
                     BYTE_2_WR,
60
                     BYTE_3_WR,
61
                     BYTE_4_WR,
62
                     BYTE_5_WR,
63
                     BYTE_6_WR,
64
                     BYTE_7_WR);  
65
                    
66
-- STATE HANDLER --                                  
67
signal state_main : type_main_state := IDLE;
68
signal state_config : type_config_state := RESET_MODE_ON;
69
signal state_can_rd : type_can_read_state := FRAME_INFORMATION_RD;
70
signal state_can_wr : type_can_write_state := FRAME_INFORMATION_WR;
71
72
-- CAN READY FLAGS --
73
shared variable ready_can_cfg : boolean := false;
74
shared variable ready_can_wr : boolean := false;
75
shared variable ready_can_rd : boolean := false;
76
77
-- REG READY FLAGS --
78
signal ready_reg_wr : boolean := false;
79
signal ready_reg_rd : boolean := false;
80
81
-- TEMP VARIABLES --
82
shared variable reg_data_buffer : std_logic_vector(7 downto 0); 
83
84
-- PROCEDURES
85
procedure CAN_REG_READ ( ADDRESS : in std_logic_vector(7 downto 0);
86
                 DATA : out std_logic_vector(7 downto 0);
87
                 signal READY_FLAG : out boolean ) is
88
begin
89
  cs_can <= '1';
90
  ale <= '1';
91
  port_0 <= ADDRESS; -- PORT_0 RELEVENT FOR RACE CONDITION
92
  ale <= '0';
93
  rd <= '1';
94
  DATA := port_0; 
95
  rd <= '0';
96
  cs_can <= '0';
97
  READY_FLAG <= true;
98
end procedure CAN_REG_READ;
99
100
procedure CAN_REG_WRITE( ADDRESS : in std_logic_vector(7 downto 0);
101
                 DATA : in std_logic_vector(7 downto 0);
102
                 signal READY_FLAG : out boolean ) is
103
begin
104
  cs_can <= '1';
105
  ale <= '1';
106
  port_0 <= ADDRESS;
107
  ale <= '0';
108
  wr <= '1';
109
  port_0 <= DATA;
110
  wr <= '0';
111
  cs_can <= '0';
112
end procedure CAN_REG_WRITE;
113
114
begin 
115
  process(clk,reset) -- MAIN STATEMACHINE
116
  begin
117
    if reset = '0' then -- aktive low
118
      state_main <= CONFIGURE;
119
    elsif rising_edge(clk) and ready_can_cfg then
120
      if can_rd = '1' then
121
        state_main <= RECEIVE;
122
      elsif can_wr = '1' then
123
        state_main <= TRANSMIT;
124
      end if;
125
    end if;
126
  end process;
127
  
128
  config : process(clk) -- CONFIGURE STATEMACHINE
129
  begin
130
    if state_main = CONFIGURE then
131
      case state_config is
132
        when RESET_MODE_ON =>
133
          ready_can_cfg := false;
134
          CAN_REG_WRITE(x"00",x"01",ready_reg_wr);
135
          if ready_reg_wr = true then
136
            ready_reg_wr <= false;
137
            state_config <= ACTIVE_BASIC_CONFIG;
138
          end if;
139
        when ACTIVE_BASIC_CONFIG =>
140
          --CAN_REG_WRITE(x"1F",x"07",ready_reg_wr);
141
          if ready_reg_wr = true then
142
            ready_reg_wr <= false;
143
            state_config <= SET_BAUD_SYNC;
144
          end if;
145
        when SET_BAUD_SYNC =>
146
          --CAN_REG_WRITE(x"06",x"01",ready_reg_wr);
147
          if ready_reg_wr = true then
148
            ready_reg_wr <= false;
149
            state_config <= SET_ACCEPTANCE_MASK;
150
          end if;
151
        when SET_ACCEPTANCE_MASK =>
152
          --CAN_REG_WRITE(x"04",x"00",ready_reg_wr);          
153
          if ready_reg_wr = true then
154
            ready_reg_wr <= false;
155
            state_config <= SET_ACCEPTANCE_MASK2;
156
          end if;
157
        when SET_ACCEPTANCE_MASK2 =>
158
          --CAN_REG_WRITE(x"05",x"00",ready_reg_wr);          
159
          if ready_reg_wr = true then
160
            ready_reg_wr <= false;
161
            state_config <= SET_BUS_TIMING;
162
          end if;      
163
        when SET_BUS_TIMING =>
164
          --CAN_REG_WRITE(x"07",x"7F",ready_reg_wr);          
165
          if ready_reg_wr = true then
166
            ready_reg_wr <= false;
167
            state_config <= RESET_MODE_OFF;
168
          end if;
169
        when RESET_MODE_OFF =>
170
          --CAN_REG_WRITE(x"00",x"00",ready_reg_wr);          
171
          if ready_reg_wr = true then
172
            ready_reg_wr <= false;
173
            state_config <= RESET_MODE_ON;
174
          end if;
175
          ready_can_cfg := true;
176
      end case;
177
    end if;
178
  end process config;
179
180
  can_read : process(clk) -- CAN READ STATEMACHINE -> READS 88Bit
181
  begin
182
    if state_main = RECEIVE then
183
      case state_can_rd is
184
        when FRAME_INFORMATION_RD =>
185
          ready_can_rd := false;
186
          CAN_REG_READ(x"10", reg_data_buffer, ready_reg_rd);
187
          if ready_reg_rd then
188
            can_data(7 downto 0) <= reg_data_buffer(7 downto 0);
189
            ready_reg_rd <= false;
190
            state_can_rd <= IDENTIFIER_0_RD;
191
          end if;
192
        when IDENTIFIER_0_RD =>
193
          CAN_REG_READ(x"11", reg_data_buffer, ready_reg_rd);
194
          if ready_reg_rd then
195
            can_data(15 downto 8) <= reg_data_buffer(7 downto 0);
196
            ready_reg_rd <= false;
197
            state_can_rd <= IDENTIFIER_1_RD;
198
          end if;
199
        when IDENTIFIER_1_RD =>
200
          CAN_REG_READ(x"12", reg_data_buffer, ready_reg_rd);
201
          if ready_reg_rd then
202
            can_data(23 downto 16) <= reg_data_buffer(7 downto 0);
203
            ready_reg_rd <= false;
204
            state_can_rd <= BYTE_0_RD;
205
          end if;
206
        when BYTE_0_RD =>
207
          CAN_REG_READ(x"13", reg_data_buffer, ready_reg_rd);
208
          if ready_reg_rd then
209
            can_data(31 downto 24) <= reg_data_buffer(7 downto 0);
210
            ready_reg_rd <= false;
211
            state_can_rd <= BYTE_1_RD;
212
          end if;
213
        when BYTE_1_RD =>
214
          CAN_REG_READ(x"14", reg_data_buffer, ready_reg_rd);
215
          if ready_reg_rd then
216
            can_data(39 downto 32) <= reg_data_buffer(7 downto 0);
217
            ready_reg_rd <= false;
218
            state_can_rd <= BYTE_2_RD;
219
          end if;
220
        when BYTE_2_RD =>
221
          CAN_REG_READ(x"15", reg_data_buffer, ready_reg_rd);
222
          if ready_reg_rd then
223
            can_data(47 downto 40) <= reg_data_buffer(7 downto 0);
224
            ready_reg_rd <= false;
225
            state_can_rd <= BYTE_3_RD;
226
          end if;
227
        when BYTE_3_RD =>
228
          CAN_REG_READ(x"16", reg_data_buffer, ready_reg_rd);
229
          if ready_reg_rd then
230
            can_data(55 downto 48) <= reg_data_buffer(7 downto 0);
231
            ready_reg_rd <= false;
232
            state_can_rd <= BYTE_4_RD;
233
          end if;
234
        when BYTE_4_RD =>
235
          CAN_REG_READ(x"17", reg_data_buffer, ready_reg_rd);
236
          if ready_reg_rd then
237
            can_data(63 downto 56) <= reg_data_buffer(7 downto 0);
238
            ready_reg_rd <= false;
239
            state_can_rd <= BYTE_5_RD;
240
          end if;
241
        when BYTE_5_RD =>
242
          CAN_REG_READ(x"18", reg_data_buffer, ready_reg_rd);
243
          if ready_reg_rd then
244
            can_data(71 downto 64) <= reg_data_buffer(7 downto 0);
245
            ready_reg_rd <= false;
246
            state_can_rd <= BYTE_6_RD;
247
          end if;
248
        when BYTE_6_RD =>
249
          CAN_REG_READ(x"19", reg_data_buffer, ready_reg_rd);
250
          if ready_reg_rd then
251
            can_data(79 downto 72) <= reg_data_buffer(7 downto 0);
252
            ready_reg_rd <= false;
253
            state_can_rd <= BYTE_7_RD;
254
          end if;
255
        when BYTE_7_RD =>
256
          CAN_REG_READ(x"1A", reg_data_buffer, ready_reg_rd);
257
          if ready_reg_rd then
258
            can_data(87 downto 80) <= reg_data_buffer(7 downto 0);
259
            ready_reg_rd <= false;
260
            state_can_rd <= FRAME_INFORMATION_RD;
261
          end if;
262
          ready_can_rd := true;
263
      end case;
264
    end if;
265
  end process can_read;
266
267
--  can_write: process(clk) -- CAN WRITE STATEMACHINE -> WRITE 88Bit
268
--  begin
269
--    if state_main = TRANSMIT then
270
--      case state_can_wr is
271
--        when FRAME_INFORMATION_WR =>
272
--          ready_can_wr := false;
273
--          --CAN_REG_WRITE(x"10", can_data(7 downto 0), ready_reg_wr);
274
--          if ready_reg_wr = true then
275
--            ready_reg_wr <= false;
276
--            state_can_wr <= IDENTIFIER_0_WR;
277
--          end if;
278
--        when IDENTIFIER_0_WR =>
279
--          --CAN_REG_WRITE(x"11", can_data(15 downto 8), ready_reg_wr);
280
--          if ready_reg_wr = true then
281
--            ready_reg_wr <= false;
282
--            state_can_wr <= IDENTIFIER_1_WR;
283
--          end if;
284
--        when IDENTIFIER_1_WR =>
285
--          --CAN_REG_WRITE(x"12", can_data(23 downto 16), ready_reg_wr);
286
--          if ready_reg_wr = true then
287
--            ready_reg_wr <= false;
288
--            state_can_wr <= BYTE_0_WR;
289
--          end if;
290
--        when BYTE_0_WR =>
291
--          --CAN_REG_WRITE(x"13", can_data(31 downto 24), ready_reg_wr);
292
--          if ready_reg_wr = true then
293
--            ready_reg_wr <= false;
294
--            state_can_wr <= BYTE_1_WR;
295
--          end if;
296
--        when BYTE_1_WR =>
297
--          --CAN_REG_WRITE(x"14", can_data(39 downto 32), ready_reg_wr);
298
--          if ready_reg_wr = true then
299
--            ready_reg_wr <= false;
300
--            state_can_wr <= BYTE_2_WR;
301
--          end if;
302
--        when BYTE_2_WR =>
303
--          --CAN_REG_WRITE(x"15", can_data(47 downto 40), ready_reg_wr);
304
--          if ready_reg_wr = true then
305
--            ready_reg_wr <= false;
306
--            state_can_wr <= BYTE_3_WR;
307
--          end if;
308
--        when BYTE_3_WR =>
309
--          --CAN_REG_WRITE(x"16", can_data(55 downto 48), ready_reg_wr);
310
--          if ready_reg_wr = true then
311
--            ready_reg_wr <= false;
312
--            state_can_wr <= BYTE_4_WR;
313
--          end if;
314
--        when BYTE_4_WR =>
315
--          --CAN_REG_WRITE(x"17", can_data(63 downto 56), ready_reg_wr);
316
--          if ready_reg_wr = true then
317
--            ready_reg_wr <= false;
318
--            state_can_wr <= BYTE_5_WR;
319
--          end if;
320
--        when BYTE_5_WR =>
321
--          --CAN_REG_WRITE(x"18", can_data(71 downto 64), ready_reg_wr);
322
--          if ready_reg_wr = true then
323
--            ready_reg_wr <= false;
324
--            state_can_wr <= BYTE_6_WR;
325
--          end if;
326
--        when BYTE_6_WR =>
327
--          --CAN_REG_WRITE(x"19", can_data(79 downto 72), ready_reg_wr);
328
--          if ready_reg_wr = true then
329
--            ready_reg_wr <= false;
330
--            state_can_wr <= BYTE_7_WR;
331
--          end if;
332
--        when BYTE_7_WR =>
333
--          --CAN_REG_WRITE(x"1A", can_data(87 downto 80), ready_reg_wr);
334
--          if ready_reg_wr = true then
335
--            ready_reg_wr <= false;
336
--            state_can_wr <= FRAME_INFORMATION_WR;
337
--          end if;
338
--          ready_can_wr := true;
339
--      end case;
340
--    end if;
341
--  end process can_write;
342
343
end beh_can_controller;