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 55

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 55 budinero
  signal memwr_out_cyc_daq: std_logic;
136 48 budinero
  signal memwr_out_adr:     std_logic_vector (13 downto 0);
137 38 budinero
  signal memwr_in_dat:      std_logic_vector (15 downto 0);
138 55 budinero
  signal memwr_out_dat:     std_logic_vector (15 downto 0);
139 38 budinero
 
140 48 budinero
  -- Outmgr
141
  --signal outmgr_reset:       std_logic;
142
  signal outmgr_en:          std_logic;
143
  signal outmgr_load:        std_logic;
144
  signal outmgr_initial_adr: std_logic_vector(13 downto 0);
145 38 budinero
  --signal outmgr_pause_adr:    std_logic; -- ??
146 48 budinero
  signal outmgr_finish:      std_logic;
147
  signal outmgr_in_cyc:      std_logic;
148
  signal outmgr_in_stb:      std_logic;
149
  signal outmgr_out_akc:     std_logic;
150
  signal outmgr_out_dat:     std_logic_vector(15 downto 0);
151 38 budinero
 
152 48 budinero
  --------------------------------------------------------------------------------------------------
153
  -- DAQ config
154
  signal dat_to_adc: std_logic_vector(15 downto 0);
155
  signal strobe_adc: std_logic;
156
  signal write_in_adc: std_logic;
157 38 budinero
 
158
 
159
  --------------------------------------------------------------------------------------------------
160
  -- Flags
161
  signal running: std_logic;
162
  signal stop: std_logic;
163
  signal start: std_logic;
164
  signal continuous: std_logic;
165 48 budinero
 
166
 
167 38 budinero
 
168
 
169
 
170
 
171
begin
172
  --------------------------------------------------------------------------------------------------
173
  -- Instances
174
 
175
  U_OUTMGR0: ctrl_output_manager
176
  generic map(
177
      MEM_ADD_WIDTH => 14 --: integer :=  14
178
    )
179
    port map(
180
      -- MASTER (to memory) 
181
      DAT_I_mem => DAT_I_memr, -- direct
182
      ADR_O_mem => ADR_O_memr, -- direct
183
      CYC_O_mem => CYC_O_memr, -- direct
184
      STB_O_mem => STB_O_memr, -- direct
185
      ACK_I_mem => ACK_I_memr, -- direct
186
      WE_O_mem  => WE_O_memr, -- direct
187
      -- SLAVE (to I/O ports) 
188 48 budinero
      DAT_O_port => outmgr_out_dat,
189
      CYC_I_port => outmgr_in_cyc,
190
      STB_I_port => outmgr_in_stb,
191
      ACK_O_port => outmgr_out_akc,
192 38 budinero
      WE_I_port  => '0',
193
      -- Common signals 
194
      RST_I      => RST_I_port, -- direct
195
      CLK_I      => CLK_I_port, -- direct
196
      -- Internal
197
      load_I            => outmgr_load,
198
      enable_I          => outmgr_en,
199
      initial_address_I => outmgr_initial_adr,
200 48 budinero
      biggest_address_I => reg_buffer_size,
201
      pause_address_I   => memwr_out_adr,
202 38 budinero
      finish_O          => outmgr_finish
203
    );
204
 
205
  U_CTRL_MEMWR0: ctrl_memory_writer
206
    generic map(
207
      MEM_ADD_WIDTH => 14--: integer :=  14
208
    )
209
    port map(
210
      -- to memory
211 55 budinero
      DAT_O_mem => memwr_out_dat,  -- direct
212 48 budinero
      ADR_O_mem => memwr_out_adr,
213
      CYC_O_mem => CYC_O_memw,  -- direct
214
      STB_O_mem => STB_O_memw,  -- direct
215
      ACK_I_mem => memwr_in_ack_mem,  -- direct
216
      WE_O_mem  => WE_O_memw,   -- direct
217 38 budinero
      -- to acquistion module
218 48 budinero
      DAT_I_adc => memwr_in_dat,
219
      CYC_O_adc => memwr_out_cyc_daq,   -- direct
220
      STB_O_adc => memwr_out_stb_daq,   -- direct
221
      ACK_I_adc => dskip_out_ack,
222 38 budinero
      -- Common signals 
223 48 budinero
      RST_I => RST_I_daq,       -- direct
224
      CLK_I => CLK_I_daq,       -- direct
225 38 budinero
      -- Internal
226
      reset_I         => memwr_reset,
227
      enable_I        => memwr_en,
228 48 budinero
      final_address_I => reg_buffer_size,
229
      finished_O      => open,            -- !
230
      continuous_I    => reg_trigger_en
231 38 budinero
    );
232
 
233
 
234
  U_CTRL_DSKIP0: ctrl_data_skipper
235
    generic map(
236 48 budinero
      SELECTOR_WIDTH    => 5--: integer := 5 
237 38 budinero
    )
238
    port map(
239
      ack_O             => dskip_out_ack,
240 48 budinero
      ack_I             => ACK_I_daq, -- direct
241
      stb_I             => memwr_out_stb_daq,
242 38 budinero
      selector_I        => reg_time_scale,
243
      enable_skipper_I  => reg_time_scale_en,
244 48 budinero
      reset_I           => dskip_reset,
245
      clk_I             => CLK_I_daq, -- direct
246 38 budinero
      first_channel_I   => chsel_first_channel
247
    );
248
 
249
 
250
  U_CTRL_CHSEL0: ctrl_channel_selector
251
    generic map(
252 48 budinero
      CHANNEL_WIDTH     => 1 -- number of channels 2**CHANNEL_WIDTH, max. 4 
253 38 budinero
    )
254
    port map(
255
      channels_I        => reg_channels_selection,
256
      channel_number_O  => chsel_channel,
257
      first_channel_O   => chsel_first_channel,
258
      clk_I             => CLK_I_daq,
259 48 budinero
      enable_I          => '1',
260 38 budinero
      reset_I           => chsel_reset
261
    );
262
 
263
 
264
  U_CTRL_TRIGGER0: ctrl_trigger_manager
265
    generic map(
266
      MEM_ADD_WIDTH   => 14,--:  integer := 14;
267 48 budinero
      DATA_WIDTH      => 10,--:  integer := 10;
268
      CHANNELS_WIDTH  => 1 --:   integer := 4
269 38 budinero
    )
270
    port map(
271 55 budinero
      data_I          => memwr_out_dat(9 downto 0),  -- values beign writed in memory
272
      channel_I       => memwr_out_dat(10 downto 10),
273 38 budinero
      trig_channel_I  => reg_trigger_channel,
274
      address_I       => memwr_out_adr,
275
      final_address_I => reg_buffer_size,
276
      offset_I        => reg_trigger_offset,
277
      level_I         => reg_trigger_level,
278
      falling_I       => reg_trigger_edge,
279
      clk_I           => CLK_I_daq,
280
      reset_I         => trigger_reset,
281
      enable_I        => trigger_en,
282
      trigger_O       => trigger_act,
283
      address_O       => trigger_out_adr
284
    );
285
 
286
  -- reg_: signals from conf registers
287 48 budinero
  U_CTRL_ADDALLOC0: ctrl_address_allocation
288 38 budinero
    port map(
289
      -- From port
290
      DAT_I_port        => DAT_I_port,
291
      DAT_O_port        => DAT_O_port,
292
      ADR_I_port        => ADR_I_port,
293
      CYC_I_port        => CYC_I_port,
294
      STB_I_port        => STB_I_port,
295
      ACK_O_port        => ACK_O_port,
296
      WE_I_port         => WE_I_port,
297
      RST_I             => RST_I_port,
298
      CLK_I             => CLK_I_port,
299
      -- To internal 
300 48 budinero
      CYC_O_int         => outmgr_in_cyc,
301
      STB_O_int         => outmgr_in_stb,
302
      ACK_I_int         => outmgr_out_akc,
303
      DAT_I_int         => outmgr_out_dat,
304
      -- Internal
305 38 budinero
      time_scale_O      => reg_time_scale,
306
      time_scale_en_O   => reg_time_scale_en,
307
      channels_sel_O    => reg_channels_selection,
308
      buffer_size_O     => reg_buffer_size,
309
 
310
      trigger_en_O      => reg_trigger_en,
311
      trigger_edge_O    => reg_trigger_edge,
312
      trigger_level_O   => reg_trigger_level,
313
      trigger_offset_O  => reg_trigger_offset,
314
      trigger_channel_O => reg_trigger_channel,
315
 
316 48 budinero
      error_number_I    => "000", -- not implemented yet
317 38 budinero
      error_flag_I      => '0',   -- not implemented yet
318
 
319 48 budinero
      adc_conf_O        => dat_to_adc,
320
 
321 38 budinero
      start_O           => start,
322
      continuous_O      => continuous,
323
      running_I         => running,
324 48 budinero
      write_in_adc_O    => write_in_adc,
325 38 budinero
      stop_O            => stop
326
    );
327
 
328
  ------------------------------------------------------------------------------------------------
329 48 budinero
  -- Assignments
330
  ADR_O_memw <= memwr_out_adr;
331 55 budinero
  DAT_O_memw <= memwr_out_dat;
332
 
333 48 budinero
  ADR_O_daq <= '0' & chsel_channel(0) when strobe_adc = '0'
334 55 budinero
          else "10";
335 48 budinero
  DAT_O_daq <= dat_to_adc;
336
  CYC_O_daq <= strobe_adc or memwr_out_cyc_daq;
337
  STB_O_daq <= strobe_adc or memwr_out_stb_daq;
338
  WE_O_daq <= strobe_adc ;
339
 
340
 
341
  memwr_in_dat <= (15 downto 11 => '0') &  chsel_channel & DAT_I_daq(9 downto 0);
342
  memwr_in_ack_mem <= ACK_I_memw;
343
 
344
  ------------------------------------------------------------------------------------------------
345 38 budinero
  -- Machine
346 54 budinero
  P_sm_comb: process (present_state, reg_trigger_en, trigger_out_adr, memwr_out_adr,
347 48 budinero
  memwr_in_ack_mem, outmgr_finish, continuous, ack_i_daq)
348 38 budinero
  begin
349 48 budinero
    -- signals from output manager are described in next process
350 38 budinero
    case present_state is
351
      when ST_INIT =>
352
 
353
        memwr_reset       <= '1';
354 48 budinero
        memwr_en          <= '-';
355 38 budinero
 
356
        dskip_reset   <= '1';
357
 
358 48 budinero
        chsel_reset   <= '0';
359 38 budinero
 
360
        trigger_reset <= '1';
361 48 budinero
        trigger_en    <= '-';
362 38 budinero
 
363 48 budinero
        running <= '1';
364 38 budinero
 
365 48 budinero
        strobe_adc <= '0';
366 38 budinero
 
367 48 budinero
        -- -- -- --
368 38 budinero
        next_state    <= ST_RUNNING;
369
 
370
 
371 48 budinero
      when ST_RUNNING =>
372
 
373 38 budinero
        memwr_reset       <= '0';
374 55 budinero
        if reg_trigger_en = '1' and trigger_out_adr = memwr_out_adr and trigger_act = '1' then
375 48 budinero
          memwr_en        <= '0';
376
        else
377
          memwr_en        <= '1';
378
        end if;
379 38 budinero
 
380
        dskip_reset   <= '0';
381
 
382
        chsel_reset   <= '0';
383
 
384
        trigger_reset <= '0';
385 48 budinero
        trigger_en    <= reg_trigger_en and memwr_in_ack_mem;
386 38 budinero
 
387 48 budinero
        running <= '1';
388 38 budinero
 
389 48 budinero
        strobe_adc <= '0';
390 38 budinero
 
391 48 budinero
        -- -- -- --
392
        if outmgr_finish = '1' then
393
          if continuous = '1' then
394
            next_state <= ST_INIT;
395
          else
396
            next_state <= ST_IDLE;
397
          end if;
398
        else
399
          next_state <= ST_RUNNING;
400
        end if;
401
 
402
      when ST_ADCWRITE_INIT =>
403
        memwr_reset       <= '1';
404
        memwr_en          <= '-';
405
 
406
        dskip_reset   <= '1';
407
 
408
        chsel_reset   <= '1';
409
 
410
        trigger_reset <= '1';
411
        trigger_en    <= '-';
412
 
413 54 budinero
        running <= '1'; -- aviod an ack if there is a read/write from port
414 48 budinero
 
415
        strobe_adc <= '0';
416
 
417
        -- -- -- --
418
        next_state <= ST_ADCWRITE;
419 38 budinero
 
420
 
421 48 budinero
      when ST_ADCWRITE =>
422
        memwr_reset       <= '1';
423
        memwr_en          <= '-';
424
 
425
        dskip_reset   <= '1';
426
 
427
        chsel_reset   <= '1';
428
 
429
        trigger_reset <= '1';
430
        trigger_en    <= '-';
431
 
432 54 budinero
        running <= '1'; -- aviod an ack if there is a read/write from port
433 48 budinero
 
434
        strobe_adc <= '1';
435
 
436
        -- -- -- --
437
        if ACK_I_daq = '1' then
438
          next_state <= ST_IDLE;
439
        else
440
          next_state <= ST_ADCWRITE;
441
        end if;
442 38 budinero
 
443
      when others =>  --ST_IDLE
444 48 budinero
 
445
        memwr_reset       <= '1';
446
        memwr_en          <= '-';
447
 
448
        dskip_reset   <= '1';
449
 
450
        chsel_reset   <= '1';
451
 
452
        trigger_reset <= '1';
453
        trigger_en    <= '-';
454
 
455 54 budinero
        running <= '0';
456 48 budinero
 
457
        strobe_adc <= '0';
458
 
459
        -- -- -- --
460
        next_state    <= ST_IDLE;
461 38 budinero
    end case;
462
 
463
  end process;
464
 
465
 
466
 
467 48 budinero
  P_sm_clkd: process (RST_I_daq, stop, start, CLK_I_daq, next_state, write_in_adc)
468 38 budinero
  begin
469
 
470
    if RST_I_daq = '1' or stop = '1' then
471
      present_state <= ST_IDLE;
472 48 budinero
    elsif write_in_adc = '1' then
473
      present_state <= ST_ADCWRITE_INIT;
474
    elsif start = '1' and present_state /= ST_ADCWRITE and present_state /= ST_ADCWRITE_INIT then
475 38 budinero
      present_state <= ST_INIT;
476 48 budinero
    elsif CLK_I_daq'event and CLK_I_daq = '1' then
477 38 budinero
      present_state <= next_state;
478
    end if;
479
 
480
 
481
  end process;
482
 
483
 
484
 
485
  ------------------------------------------------------------------------------------------------
486
  -- Output
487
 
488 54 budinero
  P_OUTMGR: process (RST_I_port, stop, CLK_I_port, present_state, trigger_act,
489 38 budinero
  reg_trigger_en, memwr_out_adr, outmgr_en)
490 48 budinero
  begin
491 54 budinero
    -- load must be '1' only for one cycle, enable must be set until the end
492
    if RST_I_port = '1' or present_state /= ST_RUNNING then
493 38 budinero
      outmgr_load <= '0';
494
      outmgr_en   <=  '0';
495
    elsif CLK_I_port'event and CLK_I_port = '1' then
496 48 budinero
      if stop = '1' then
497
        outmgr_load <=  '0';
498
        outmgr_en   <=  '0';
499 54 budinero
      elsif outmgr_en = '1' then
500
        outmgr_load <= '0';
501 48 budinero
      elsif present_state = ST_RUNNING and ( trigger_act = '1' or (reg_trigger_en = '0' and
502
      memwr_out_adr /= 0 ) ) then
503 38 budinero
        outmgr_load <=  '1';
504
        outmgr_en   <=  '1';
505
        -- load must be set only one cycle
506
      end if;
507
    end if;
508
  end process;
509
 
510
  outmgr_initial_adr <= trigger_out_adr     when reg_trigger_en = '1' else
511
                        (others => '0');
512
 
513
end architecture;
514
 

powered by: WebSVN 2.1.0

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