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

Subversion Repositories modular_oscilloscope

[/] [modular_oscilloscope/] [trunk/] [hdl/] [ctrl/] [ctrl.vhd] - Blame information for rev 48

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 budinero
-------------------------------------------------------------------------------------------------100
2
--| Modular Oscilloscope
3
--| UNSL - Argentine
4
--|
5
--| File: ctrl.vhd
6
--| Version: 0.1
7
--| Tested in: Actel A3PE1500
8
--|   Board: RVI Prototype Board + LP Data Conversion Daughter Board
9
--|-------------------------------------------------------------------------------------------------
10
--| Description:
11
--|   CONTROL - Control system
12
--|   This is the tom modules in the folder.
13
--|   
14
--|-------------------------------------------------------------------------------------------------
15
--| File history:
16
--|   0.1   | aug-2009 | First testing
17
----------------------------------------------------------------------------------------------------
18 48 budinero
--| Copyright © 2009, Facundo Aguilera (budinero at gmail.com).
19 38 budinero
--|
20
--| This VHDL design file is an open design; you can redistribute it and/or
21
--| modify it and/or implement it after contacting the author.
22
----------------------------------------------------------------------------------------------------
23
 
24
 
25
--==================================================================================================
26
-- TO DO
27 48 budinero
-- · clean
28 38 budinero
--==================================================================================================
29
library IEEE;
30
use IEEE.STD_LOGIC_1164.ALL;
31 48 budinero
use IEEE.STD_LOGIC_UNSIGNED.ALL;
32 38 budinero
use ieee.math_real.all;
33
 
34
use work.ctrl_pkg.all;
35
 
36
entity ctrl is
37
  port(
38
    ------------------------------------------------------------------------------------------------
39
    -- From port
40
    DAT_I_port: in  std_logic_vector (15 downto 0);
41
    DAT_O_port: out std_logic_vector (15 downto 0);
42
    ADR_I_port: in  std_logic_vector (3 downto 0);
43
    CYC_I_port: in  std_logic;
44
    STB_I_port: in  std_logic;
45
    ACK_O_port: out std_logic ;
46
    WE_I_port:  in  std_logic;
47
    CLK_I_port: in std_logic;
48
    RST_I_port: in std_logic;
49
 
50
    ------------------------------------------------------------------------------------------------
51
    -- To ADC
52
    DAT_I_daq: in  std_logic_vector (15 downto 0);
53
    DAT_O_daq: out std_logic_vector (15 downto 0);
54 48 budinero
    ADR_O_daq: out std_logic_vector (1 downto 0);
55 38 budinero
    CYC_O_daq: out std_logic;
56
    STB_O_daq: out std_logic;
57
    ACK_I_daq: in  std_logic ;
58
    WE_O_daq:  out std_logic;
59
 
60
    CLK_I_daq: in std_logic;
61
    RST_I_daq: in std_logic;
62
 
63
    ------------------------------------------------------------------------------------------------
64
    -- To memory, A (writing) interface (Higer prioriry)
65
    --DAT_I_memw: in  std_logic_vector (15 downto 0);
66
    DAT_O_memw: out std_logic_vector (15 downto 0);
67
    ADR_O_memw: out  std_logic_vector (13 downto 0);
68
    CYC_O_memw: out  std_logic;
69
    STB_O_memw: out  std_logic;
70
    ACK_I_memw: in std_logic ;
71
    WE_O_memw:  out  std_logic;
72
 
73
    ------------------------------------------------------------------------------------------------
74
    -- To memory, B (reading) interface
75
    DAT_I_memr: in  std_logic_vector (15 downto 0);
76
    --DAT_O_memr: out std_logic_vector (15 downto 0);
77
    ADR_O_memr: out  std_logic_vector (13 downto 0);
78
    CYC_O_memr: out  std_logic;
79
    STB_O_memr: out  std_logic;
80
    ACK_I_memr: in std_logic ;
81
    WE_O_memr:  out  std_logic
82
 
83
  );
84
end entity ctrl;
85
 
86
 
87
 
88
architecture WSM of ctrl is
89 48 budinero
  -- machine
90 38 budinero
  type StateType is (
91
          ST_IDLE,
92
          ST_INIT,
93 48 budinero
          ST_RUNNING,
94
          ST_ADCWRITE_INIT,
95
          ST_ADCWRITE
96 38 budinero
          );
97
  signal next_state, present_state: StateType;
98
 
99
 
100
  -- trigger
101
  signal trigger_reset:           std_logic;
102
  signal trigger_en:              std_logic;
103 48 budinero
  signal trigger_out_adr:         std_logic_vector(13 downto 0);
104
  signal trigger_act:              std_logic;
105 38 budinero
  signal reg_trigger_en:          std_logic;
106
  signal reg_trigger_edge:        std_logic;
107
  signal reg_trigger_level:       std_logic_vector(9 downto 0);
108
  signal reg_trigger_offset:      std_logic_vector(14 downto 0);
109 48 budinero
  signal reg_trigger_channel:     std_logic_vector(0 downto 0);
110 38 budinero
 
111
  -- channels
112
  signal reg_channels_selection:  std_logic_vector(1 downto 0);
113
  signal chsel_first_channel:     std_logic;
114 48 budinero
  signal chsel_channel:           std_logic_vector(0 downto 0);
115 38 budinero
  signal chsel_reset:             std_logic;
116 48 budinero
  --signal chsel_en:                std_logic;
117 38 budinero
 
118
  -- address
119 48 budinero
  signal reg_buffer_size:         std_logic_vector(13 downto 0);
120 38 budinero
 
121
  -- skipper
122 48 budinero
  --signal dskip_en:         std_logic;
123
  signal dskip_reset:        std_logic;
124 38 budinero
  signal dskip_out_ack:      std_logic;
125 48 budinero
  signal reg_time_scale:     std_logic_vector(4 downto 0);
126
  signal reg_time_scale_en:  std_logic;
127 38 budinero
 
128
  -- Memory writer
129
  signal memwr_en:          std_logic;
130
  signal memwr_reset:       std_logic;
131 48 budinero
  --signal memwr_ack:         std_logic;
132
  --signal memwr_continuous:  std_logic;
133
  signal memwr_out_stb_daq: std_logic;
134
  signal memwr_in_ack_mem:  std_logic;
135
  signal memwr_out_cyc_daq:  std_logic;
136
  signal memwr_out_adr:     std_logic_vector (13 downto 0);
137 38 budinero
  signal memwr_in_dat:      std_logic_vector (15 downto 0);
138
 
139 48 budinero
  -- Outmgr
140
  --signal outmgr_reset:       std_logic;
141
  signal outmgr_en:          std_logic;
142
  signal outmgr_load:        std_logic;
143
  signal outmgr_initial_adr: std_logic_vector(13 downto 0);
144 38 budinero
  --signal outmgr_pause_adr:    std_logic; -- ??
145 48 budinero
  signal outmgr_finish:      std_logic;
146
  signal outmgr_in_cyc:      std_logic;
147
  signal outmgr_in_stb:      std_logic;
148
  signal outmgr_out_akc:     std_logic;
149
  signal outmgr_out_dat:     std_logic_vector(15 downto 0);
150 38 budinero
 
151 48 budinero
  --------------------------------------------------------------------------------------------------
152
  -- DAQ config
153
  signal dat_to_adc: std_logic_vector(15 downto 0);
154
  signal strobe_adc: std_logic;
155
  signal write_in_adc: std_logic;
156 38 budinero
 
157
 
158
  --------------------------------------------------------------------------------------------------
159
  -- Flags
160
  signal running: std_logic;
161
  signal stop: std_logic;
162
  signal start: std_logic;
163
  signal continuous: std_logic;
164 48 budinero
 
165
 
166 38 budinero
 
167
 
168
 
169
 
170
begin
171
  --------------------------------------------------------------------------------------------------
172
  -- Instances
173
 
174
  U_OUTMGR0: ctrl_output_manager
175
  generic map(
176
      MEM_ADD_WIDTH => 14 --: integer :=  14
177
    )
178
    port map(
179
      -- MASTER (to memory) 
180
      DAT_I_mem => DAT_I_memr, -- direct
181
      ADR_O_mem => ADR_O_memr, -- direct
182
      CYC_O_mem => CYC_O_memr, -- direct
183
      STB_O_mem => STB_O_memr, -- direct
184
      ACK_I_mem => ACK_I_memr, -- direct
185
      WE_O_mem  => WE_O_memr, -- direct
186
      -- SLAVE (to I/O ports) 
187 48 budinero
      DAT_O_port => outmgr_out_dat,
188
      CYC_I_port => outmgr_in_cyc,
189
      STB_I_port => outmgr_in_stb,
190
      ACK_O_port => outmgr_out_akc,
191 38 budinero
      WE_I_port  => '0',
192
      -- Common signals 
193
      RST_I      => RST_I_port, -- direct
194
      CLK_I      => CLK_I_port, -- direct
195
      -- Internal
196
      load_I            => outmgr_load,
197
      enable_I          => outmgr_en,
198
      initial_address_I => outmgr_initial_adr,
199 48 budinero
      biggest_address_I => reg_buffer_size,
200
      pause_address_I   => memwr_out_adr,
201 38 budinero
      finish_O          => outmgr_finish
202
    );
203
 
204
  U_CTRL_MEMWR0: ctrl_memory_writer
205
    generic map(
206
      MEM_ADD_WIDTH => 14--: integer :=  14
207
    )
208
    port map(
209
      -- to memory
210 48 budinero
      DAT_O_mem => DAT_O_memw,  -- direct
211
      ADR_O_mem => memwr_out_adr,
212
      CYC_O_mem => CYC_O_memw,  -- direct
213
      STB_O_mem => STB_O_memw,  -- direct
214
      ACK_I_mem => memwr_in_ack_mem,  -- direct
215
      WE_O_mem  => WE_O_memw,   -- direct
216 38 budinero
      -- to acquistion module
217 48 budinero
      DAT_I_adc => memwr_in_dat,
218
      CYC_O_adc => memwr_out_cyc_daq,   -- direct
219
      STB_O_adc => memwr_out_stb_daq,   -- direct
220
      ACK_I_adc => dskip_out_ack,
221 38 budinero
      -- Common signals 
222 48 budinero
      RST_I => RST_I_daq,       -- direct
223
      CLK_I => CLK_I_daq,       -- direct
224 38 budinero
      -- Internal
225
      reset_I         => memwr_reset,
226
      enable_I        => memwr_en,
227 48 budinero
      final_address_I => reg_buffer_size,
228
      finished_O      => open,            -- !
229
      continuous_I    => reg_trigger_en
230 38 budinero
    );
231
 
232
 
233
  U_CTRL_DSKIP0: ctrl_data_skipper
234
    generic map(
235 48 budinero
      SELECTOR_WIDTH    => 5--: integer := 5 
236 38 budinero
    )
237
    port map(
238
      ack_O             => dskip_out_ack,
239 48 budinero
      ack_I             => ACK_I_daq, -- direct
240
      stb_I             => memwr_out_stb_daq,
241 38 budinero
      selector_I        => reg_time_scale,
242
      enable_skipper_I  => reg_time_scale_en,
243 48 budinero
      reset_I           => dskip_reset,
244
      clk_I             => CLK_I_daq, -- direct
245 38 budinero
      first_channel_I   => chsel_first_channel
246
    );
247
 
248
 
249
  U_CTRL_CHSEL0: ctrl_channel_selector
250
    generic map(
251 48 budinero
      CHANNEL_WIDTH     => 1 -- number of channels 2**CHANNEL_WIDTH, max. 4 
252 38 budinero
    )
253
    port map(
254
      channels_I        => reg_channels_selection,
255
      channel_number_O  => chsel_channel,
256
      first_channel_O   => chsel_first_channel,
257
      clk_I             => CLK_I_daq,
258 48 budinero
      enable_I          => '1',
259 38 budinero
      reset_I           => chsel_reset
260
    );
261
 
262
 
263
  U_CTRL_TRIGGER0: ctrl_trigger_manager
264
    generic map(
265
      MEM_ADD_WIDTH   => 14,--:  integer := 14;
266 48 budinero
      DATA_WIDTH      => 10,--:  integer := 10;
267
      CHANNELS_WIDTH  => 1 --:   integer := 4
268 38 budinero
    )
269
    port map(
270 48 budinero
      data_I          => DAT_I_daq(9 downto 0),
271 38 budinero
      channel_I       => chsel_channel,
272
      trig_channel_I  => reg_trigger_channel,
273
      address_I       => memwr_out_adr,
274
      final_address_I => reg_buffer_size,
275
      offset_I        => reg_trigger_offset,
276
      level_I         => reg_trigger_level,
277
      falling_I       => reg_trigger_edge,
278
      clk_I           => CLK_I_daq,
279
      reset_I         => trigger_reset,
280
      enable_I        => trigger_en,
281
      trigger_O       => trigger_act,
282
      address_O       => trigger_out_adr
283
    );
284
 
285
  -- reg_: signals from conf registers
286 48 budinero
  U_CTRL_ADDALLOC0: ctrl_address_allocation
287 38 budinero
    port map(
288
      -- From port
289
      DAT_I_port        => DAT_I_port,
290
      DAT_O_port        => DAT_O_port,
291
      ADR_I_port        => ADR_I_port,
292
      CYC_I_port        => CYC_I_port,
293
      STB_I_port        => STB_I_port,
294
      ACK_O_port        => ACK_O_port,
295
      WE_I_port         => WE_I_port,
296
      RST_I             => RST_I_port,
297
      CLK_I             => CLK_I_port,
298
      -- To internal 
299 48 budinero
      CYC_O_int         => outmgr_in_cyc,
300
      STB_O_int         => outmgr_in_stb,
301
      ACK_I_int         => outmgr_out_akc,
302
      DAT_I_int         => outmgr_out_dat,
303
      -- Internal
304 38 budinero
      time_scale_O      => reg_time_scale,
305
      time_scale_en_O   => reg_time_scale_en,
306
      channels_sel_O    => reg_channels_selection,
307
      buffer_size_O     => reg_buffer_size,
308
 
309
      trigger_en_O      => reg_trigger_en,
310
      trigger_edge_O    => reg_trigger_edge,
311
      trigger_level_O   => reg_trigger_level,
312
      trigger_offset_O  => reg_trigger_offset,
313
      trigger_channel_O => reg_trigger_channel,
314
 
315 48 budinero
      error_number_I    => "000", -- not implemented yet
316 38 budinero
      error_flag_I      => '0',   -- not implemented yet
317
 
318 48 budinero
      adc_conf_O        => dat_to_adc,
319
 
320 38 budinero
      start_O           => start,
321
      continuous_O      => continuous,
322
      running_I         => running,
323 48 budinero
      write_in_adc_O    => write_in_adc,
324 38 budinero
      stop_O            => stop
325
    );
326
 
327
  ------------------------------------------------------------------------------------------------
328 48 budinero
  -- Assignments
329
  ADR_O_memw <= memwr_out_adr;
330
  ADR_O_daq <= '0' & chsel_channel(0) when strobe_adc = '0'
331
               else "10";
332
  DAT_O_daq <= dat_to_adc;
333
  CYC_O_daq <= strobe_adc or memwr_out_cyc_daq;
334
  STB_O_daq <= strobe_adc or memwr_out_stb_daq;
335
  WE_O_daq <= strobe_adc ;
336
 
337
 
338
  memwr_in_dat <= (15 downto 11 => '0') &  chsel_channel & DAT_I_daq(9 downto 0);
339
  memwr_in_ack_mem <= ACK_I_memw;
340
 
341
  ------------------------------------------------------------------------------------------------
342 38 budinero
  -- Machine
343 48 budinero
  P_sm_comb: process (present_state, reg_trigger_en, trigger_out_adr, memwr_out_adr, reg_trigger_en,
344
  memwr_in_ack_mem, outmgr_finish, continuous, ack_i_daq)
345 38 budinero
  begin
346 48 budinero
    -- signals from output manager are described in next process
347 38 budinero
    case present_state is
348
      when ST_INIT =>
349
 
350
        memwr_reset       <= '1';
351 48 budinero
        memwr_en          <= '-';
352 38 budinero
 
353
        dskip_reset   <= '1';
354
 
355 48 budinero
        chsel_reset   <= '0';
356 38 budinero
 
357
        trigger_reset <= '1';
358 48 budinero
        trigger_en    <= '-';
359 38 budinero
 
360 48 budinero
        running <= '1';
361 38 budinero
 
362 48 budinero
        strobe_adc <= '0';
363 38 budinero
 
364 48 budinero
        -- -- -- --
365 38 budinero
        next_state    <= ST_RUNNING;
366
 
367
 
368 48 budinero
      when ST_RUNNING =>
369
 
370 38 budinero
        memwr_reset       <= '0';
371 48 budinero
        if reg_trigger_en = '1' and trigger_out_adr = memwr_out_adr then
372
          memwr_en        <= '0';
373
        else
374
          memwr_en        <= '1';
375
        end if;
376 38 budinero
 
377
        dskip_reset   <= '0';
378
 
379
        chsel_reset   <= '0';
380
 
381
        trigger_reset <= '0';
382 48 budinero
        trigger_en    <= reg_trigger_en and memwr_in_ack_mem;
383 38 budinero
 
384 48 budinero
        running <= '1';
385 38 budinero
 
386 48 budinero
        strobe_adc <= '0';
387 38 budinero
 
388 48 budinero
        -- -- -- --
389
        if outmgr_finish = '1' then
390
          if continuous = '1' then
391
            next_state <= ST_INIT;
392
          else
393
            next_state <= ST_IDLE;
394
          end if;
395
        else
396
          next_state <= ST_RUNNING;
397
        end if;
398
 
399
      when ST_ADCWRITE_INIT =>
400
        memwr_reset       <= '1';
401
        memwr_en          <= '-';
402
 
403
        dskip_reset   <= '1';
404
 
405
        chsel_reset   <= '1';
406
 
407
        trigger_reset <= '1';
408
        trigger_en    <= '-';
409
 
410
        running <= '1';
411
 
412
        strobe_adc <= '0';
413
 
414
        -- -- -- --
415
        next_state <= ST_ADCWRITE;
416 38 budinero
 
417
 
418 48 budinero
      when ST_ADCWRITE =>
419
        memwr_reset       <= '1';
420
        memwr_en          <= '-';
421
 
422
        dskip_reset   <= '1';
423
 
424
        chsel_reset   <= '1';
425
 
426
        trigger_reset <= '1';
427
        trigger_en    <= '-';
428
 
429
        running <= '1';
430
 
431
        strobe_adc <= '1';
432
 
433
        -- -- -- --
434
        if ACK_I_daq = '1' then
435
          next_state <= ST_IDLE;
436
        else
437
          next_state <= ST_ADCWRITE;
438
        end if;
439 38 budinero
 
440
      when others =>  --ST_IDLE
441 48 budinero
 
442
        memwr_reset       <= '1';
443
        memwr_en          <= '-';
444
 
445
        dskip_reset   <= '1';
446
 
447
        chsel_reset   <= '1';
448
 
449
        trigger_reset <= '1';
450
        trigger_en    <= '-';
451
 
452
        running <= '1';
453
 
454
        strobe_adc <= '0';
455
 
456
        -- -- -- --
457
        next_state    <= ST_IDLE;
458 38 budinero
    end case;
459
 
460
  end process;
461
 
462
 
463
 
464 48 budinero
  P_sm_clkd: process (RST_I_daq, stop, start, CLK_I_daq, next_state, write_in_adc)
465 38 budinero
  begin
466
 
467
    if RST_I_daq = '1' or stop = '1' then
468
      present_state <= ST_IDLE;
469 48 budinero
    elsif write_in_adc = '1' then
470
      present_state <= ST_ADCWRITE_INIT;
471
    elsif start = '1' and present_state /= ST_ADCWRITE and present_state /= ST_ADCWRITE_INIT then
472 38 budinero
      present_state <= ST_INIT;
473 48 budinero
    elsif CLK_I_daq'event and CLK_I_daq = '1' then
474 38 budinero
      present_state <= next_state;
475
    end if;
476
 
477
 
478
  end process;
479
 
480
 
481
 
482
  ------------------------------------------------------------------------------------------------
483
  -- Output
484
 
485
  P_OUTMGR: process (RST_I_port, stop, CLK_I_port, CLK_I_port, present_state, trigger_act,
486
  reg_trigger_en, memwr_out_adr, outmgr_en)
487 48 budinero
  begin
488
    if RST_I_port = '1' or present_state = ST_IDLE or present_state = ST_INIT then
489 38 budinero
      outmgr_load <= '0';
490
      outmgr_en   <=  '0';
491
    elsif CLK_I_port'event and CLK_I_port = '1' then
492 48 budinero
      if stop = '1' then
493
        outmgr_load <=  '0';
494
        outmgr_en   <=  '0';
495
      elsif present_state = ST_RUNNING and ( trigger_act = '1' or (reg_trigger_en = '0' and
496
      memwr_out_adr /= 0 ) ) then
497 38 budinero
        outmgr_load <=  '1';
498
        outmgr_en   <=  '1';
499
        -- load must be set only one cycle
500
      elsif outmgr_en = '1' then
501 48 budinero
        outmgr_load <= '0';
502 38 budinero
      end if;
503
    end if;
504
  end process;
505
 
506
  outmgr_initial_adr <= trigger_out_adr     when reg_trigger_en = '1' else
507
                        (others => '0');
508
 
509
end architecture;
510
 

powered by: WebSVN 2.1.0

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