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 38

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
--| Copyright © 2009, Facundo Aguilera.
19
--|
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
-- · ...
28
--==================================================================================================
29
library IEEE;
30
use IEEE.STD_LOGIC_1164.ALL;
31
use ieee.math_real.all;
32
 
33
use work.ctrl_pkg.all;
34
 
35
entity ctrl is
36
  port(
37
    ------------------------------------------------------------------------------------------------
38
    -- From port
39
    DAT_I_port: in  std_logic_vector (15 downto 0);
40
    DAT_O_port: out std_logic_vector (15 downto 0);
41
    ADR_I_port: in  std_logic_vector (3 downto 0);
42
    CYC_I_port: in  std_logic;
43
    STB_I_port: in  std_logic;
44
    ACK_O_port: out std_logic ;
45
    WE_I_port:  in  std_logic;
46
    CLK_I_port: in std_logic;
47
    RST_I_port: in std_logic;
48
 
49
    ------------------------------------------------------------------------------------------------
50
    -- To ADC
51
    DAT_I_daq: in  std_logic_vector (15 downto 0);
52
    DAT_O_daq: out std_logic_vector (15 downto 0);
53
    ADR_O_daq: out std_logic_vector (3 downto 0);
54
    CYC_O_daq: out std_logic;
55
    STB_O_daq: out std_logic;
56
    ACK_I_daq: in  std_logic ;
57
    WE_O_daq:  out std_logic;
58
 
59
    CLK_I_daq: in std_logic;
60
    RST_I_daq: in std_logic;
61
 
62
    ------------------------------------------------------------------------------------------------
63
    -- To memory, A (writing) interface (Higer prioriry)
64
    --DAT_I_memw: in  std_logic_vector (15 downto 0);
65
    DAT_O_memw: out std_logic_vector (15 downto 0);
66
    ADR_O_memw: out  std_logic_vector (13 downto 0);
67
    CYC_O_memw: out  std_logic;
68
    STB_O_memw: out  std_logic;
69
    ACK_I_memw: in std_logic ;
70
    WE_O_memw:  out  std_logic;
71
 
72
    ------------------------------------------------------------------------------------------------
73
    -- To memory, B (reading) interface
74
    DAT_I_memr: in  std_logic_vector (15 downto 0);
75
    --DAT_O_memr: out std_logic_vector (15 downto 0);
76
    ADR_O_memr: out  std_logic_vector (13 downto 0);
77
    CYC_O_memr: out  std_logic;
78
    STB_O_memr: out  std_logic;
79
    ACK_I_memr: in std_logic ;
80
    WE_O_memr:  out  std_logic
81
 
82
  );
83
end entity ctrl;
84
 
85
 
86
 
87
architecture WSM of ctrl is
88
  type StateType is (
89
          ST_IDLE,
90
          ST_INIT,
91
          ST_RUNNING
92
          );
93
  signal next_state, present_state: StateType;
94
 
95
  --------------------------------------------------------------------------------------------------
96
  -- Interconnections
97
 
98
 
99
 
100
 
101
 
102
 
103
 
104
 
105
 
106
 
107
  -- internal wb
108
  signal cyc_to_outmgr:       std_logic;
109
  signal stb_to_outmgr:       std_logic;
110
  signal ack_from_outmgr:     std_logic;
111
  signal dat_from_outmgr:     std_logic_vector(15 downto 0);
112
 
113
  -- trigger
114
  signal trigger_reset:           std_logic;
115
  signal trigger_en:              std_logic;
116
  signal trigger_out_adr:             std_logic;
117
  signal reg_trigger_en:          std_logic;
118
  signal reg_trigger_edge:        std_logic;
119
  signal reg_trigger_level:       std_logic_vector(9 downto 0);
120
  signal reg_trigger_offset:      std_logic_vector(14 downto 0);
121
  signal reg_trigger_channel:     std_logic;
122
 
123
  -- channels
124
  signal reg_channels_selection:  std_logic_vector(1 downto 0);
125
  signal chsel_first_channel:     std_logic;
126
  signal chsel_channel:           std_logic_vector(3 downto 0);
127
  signal chsel_reset:             std_logic;
128
  signal chsel_en:                std_logic;
129
 
130
  -- address
131
  signal buffer_size:         std_logic_vector(13 downto 0);
132
 
133
  -- skipper
134
  signal dskip_en:         std_logic;
135
  signal dskip_reset:      std_logic;
136
  signal dskip_out_ack:      std_logic;
137
  signal dskip_in_stb:      std_logic;
138
 
139
  -- Memory writer
140
  signal memwr_en:          std_logic;
141
  signal memwr_reset:       std_logic;
142
  signal memwr_stb:         std_logic;
143
  signal memwr_ack:         std_logic;
144
  signal memwr_continuous:  std_logic;
145
  signal memwr_out_adr:     std_logic_vector (14 downto 0);
146
  signal memwr_in_dat:      std_logic_vector (15 downto 0);
147
 
148
  -- outmgr
149
  signal outmgr_reset:        std_logic;
150
  signal outmgr_en:           std_logic;
151
  signal outmgr_load:         std_logic;
152
  signal outmgr_initial_adr:  std_logic;
153
  --signal outmgr_pause_adr:    std_logic; -- ??
154
  signal outmgr_finish:       std_logic;
155
 
156
 
157
  signal time_scale:          std_logic_vector(4 downto 0);
158
  signal time_scale_en:       std_logic;
159
 
160
 
161
  --------------------------------------------------------------------------------------------------
162
  -- Flags
163
  signal running: std_logic;
164
  signal stop: std_logic;
165
  signal start: std_logic;
166
  signal continuous: std_logic;
167
 
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
      ----------------------------------------------------------------------------------------------
181
      -- MASTER (to memory) 
182
      DAT_I_mem => DAT_I_memr, -- direct
183
      ADR_O_mem => ADR_O_memr, -- direct
184
      CYC_O_mem => CYC_O_memr, -- direct
185
      STB_O_mem => STB_O_memr, -- direct
186
      ACK_I_mem => ACK_I_memr, -- direct
187
      WE_O_mem  => WE_O_memr, -- direct
188
      ----------------------------------------------------------------------------------------------
189
      -- SLAVE (to I/O ports) 
190
      DAT_O_port => dat_from_outmgr,
191
      CYC_I_port => cyc_to_outmgr,
192
      STB_I_port => stb_to_outmgr,
193
      ACK_O_port => ack_from_outmgr,
194
      WE_I_port  => '0',
195
      ------------------------------------------------------------------------------------------------
196
      -- Common signals 
197
      RST_I      => RST_I_port, -- direct
198
      CLK_I      => CLK_I_port, -- direct
199
      ------------------------------------------------------------------------------------------------
200
      -- Internal
201
      load_I            => outmgr_load,
202
      enable_I          => outmgr_en,
203
      initial_address_I => outmgr_initial_adr,
204
      biggest_address_I => buffer_size,
205
      pause_address_I   => memwr_out_adr, -- define
206
      finish_O          => outmgr_finish
207
    );
208
 
209
  U_CTRL_MEMWR0: ctrl_memory_writer
210
    generic map(
211
      MEM_ADD_WIDTH => 14--: integer :=  14
212
    )
213
    port map(
214
      -- to memory
215
      DAT_O_mem => DAT_O_memw, -- direct
216
      ADR_O_mem => memwr_out_adr,   --!
217
      CYC_O_mem => CYC_O_memw, -- direct
218
      STB_O_mem => STB_O_memw, -- direct
219
      ACK_I_mem => ACK_I_memw, -- direct
220
      WE_O_mem  => WE_O_memw, -- direct
221
      -- to acquistion module
222
      DAT_I_adc => memwr_in_dat,    --!
223
      CYC_O_adc => CYC_O_adc, -- direct
224
      STB_O_adc => memwr_stb,
225
      ACK_I_adc => memwr_ack,
226
      WE_O_adc  => WE_O_adc, -- direct
227
      -- Common signals 
228
      RST_I => RST_I_daq, -- direct
229
      CLK_I => CLK_I_daq, -- direct
230
      -- Internal
231
      reset_I         => memwr_reset,
232
      enable_I        => memwr_en,
233
      final_address_I => buffer_size,
234
      finished_O      => memwr_finish,
235
      continuous_I    => memwr_continuous
236
    );
237
 
238
 
239
  U_CTRL_DSKIP0: ctrl_data_skipper
240
    generic map(
241
      SELECTOR_WIDTH    => 5,--: integer := 5 
242
    )
243
    port map(
244
      ack_O             => dskip_out_ack,
245
      ack_I             => ACK_I_daq,
246
      stb_I             => dskip_in_stb,
247
      selector_I        => reg_time_scale,
248
      enable_skipper_I  => reg_time_scale_en,
249
      reset_I           => RST_I_daq,
250
      clk_I             => CLK_I_daq,
251
      first_channel_I   => chsel_first_channel
252
    );
253
 
254
 
255
  U_CTRL_CHSEL0: ctrl_channel_selector
256
    generic map(
257
      CHANNEL_WIDTH     => 4 --: integer := 4 -- number of channels 2**CHANNEL_WIDTH, max. 4
258
    )
259
    port map(
260
      channels_I        => reg_channels_selection,
261
      channel_number_O  => chsel_channel,
262
      first_channel_O   => chsel_first_channel,
263
      clk_I             => CLK_I_daq,
264
      enable_I          => chsel_en,
265
      reset_I           => chsel_reset
266
    );
267
 
268
 
269
 
270
  U_CTRL_TRIGGER0: ctrl_trigger_manager
271
    generic map(
272
      MEM_ADD_WIDTH   => 14,--:  integer := 14;
273
      DATA_WIDTH      => 10,--:     integer := 10;
274
      CHANNELS_WIDTH  => 1--: integer := 4
275
    )
276
    port map(
277
      data_I          => DAT_I_daq,
278
      channel_I       => chsel_channel,
279
      trig_channel_I  => reg_trigger_channel,
280
      address_I       => memwr_out_adr,
281
      final_address_I => reg_buffer_size,
282
      offset_I        => reg_trigger_offset,
283
      level_I         => reg_trigger_level,
284
      falling_I       => reg_trigger_edge,
285
      clk_I           => CLK_I_daq,
286
      reset_I         => trigger_reset,
287
      enable_I        => trigger_en,
288
      trigger_O       => trigger_act,
289
      address_O       => trigger_out_adr
290
    );
291
 
292
  -- reg_: signals from conf registers
293
  U_CTRL_ADDASSMNT0: ctrl_address_assignments
294
    port map(
295
      -- From port
296
      DAT_I_port        => DAT_I_port,
297
      DAT_O_port        => DAT_O_port,
298
      ADR_I_port        => ADR_I_port,
299
      CYC_I_port        => CYC_I_port,
300
      STB_I_port        => STB_I_port,
301
      ACK_O_port        => ACK_O_port,
302
      WE_I_port         => WE_I_port,
303
      RST_I             => RST_I_port,
304
      CLK_I             => CLK_I_port,
305
      -- To internal 
306
      CYC_O_int         => cyc_to_outmgr,
307
      STB_O_int         => stb_to_outmgr,
308
      ACK_I_int         => ack_from_outmgr,
309
      DAT_I_int         => dat_from_outmgr,
310
      -- Internal          
311
      time_scale_O      => reg_time_scale,
312
      time_scale_en_O   => reg_time_scale_en,
313
      channels_sel_O    => reg_channels_selection,
314
      buffer_size_O     => reg_buffer_size,
315
 
316
      trigger_en_O      => reg_trigger_en,
317
      trigger_edge_O    => reg_trigger_edge,
318
      trigger_level_O   => reg_trigger_level,
319
      trigger_offset_O  => reg_trigger_offset,
320
      trigger_channel_O => reg_trigger_channel,
321
 
322
      error_number_I    => "0000", -- not implemented yet
323
      data_channel_I    => data_channel_r,
324
      error_flag_I      => '0',   -- not implemented yet
325
 
326
      start_O           => start,
327
      continuous_O      => continuous,
328
      running_I         => running,
329
      stop_O            => stop
330
    );
331
 
332
  ------------------------------------------------------------------------------------------------
333
  -- Machine
334
  P_sm_comb: process ()
335
  begin
336
    case present_state is
337
      when ST_INIT =>
338
 
339
        memwr_reset       <= '1';
340
        memwr_en          <= '0';
341
        memwr_continuous  <= '-';
342
 
343
        dskip_reset   <= '1';
344
        dskip_en      <= '0';
345
 
346
        chsel_reset   <= '1';
347
        chsel_en      <= '0';
348
 
349
        trigger_reset <= '1';
350
        trigger_en    <= '0';
351
 
352
 
353
 
354
 
355
        next_state    <= ST_RUNNING;
356
 
357
 
358
      when ST_RUNNING =>
359
        memwr_reset       <= '0';
360
        memwr_en          <= ;
361
        memwr_continuous  <= ;
362
 
363
        dskip_reset   <= '0';
364
        dskip_en      <= reg_time_scale_en;
365
 
366
        chsel_reset   <= '0';
367
        chsel_en      <= dskip_out_ack;
368
 
369
        trigger_reset <= '0';
370
        trigger_en    <= reg_trigger_en and memwr_ack;
371
 
372
 
373
 
374
 
375
 
376
 
377
 
378
 
379
 
380
 
381
      when others =>  --ST_IDLE
382
 
383
 
384
    end case;
385
 
386
  end process;
387
 
388
 
389
 
390
  P_sm_clkd: process ()
391
  begin
392
 
393
    if RST_I_daq = '1' or stop = '1' then
394
      present_state <= ST_IDLE;
395
    elsif start = '1' then
396
      present_state <= ST_INIT;
397
    elsif CLK_I_daq'ecent and clk_I = '1' then
398
      present_state <= next_state;
399
    end if;
400
 
401
 
402
  end process;
403
 
404
 
405
 
406
 
407
  ------------------------------------------------------------------------------------------------
408
  -- Output
409
 
410
  P_OUTMGR: process (RST_I_port, stop, CLK_I_port, CLK_I_port, present_state, trigger_act,
411
  reg_trigger_en, memwr_out_adr, outmgr_en)
412
    if RST_I_port = '1' or present_state = IDLE or present_state = INIT then
413
      outmgr_load <= '0';
414
      outmgr_en   <=  '0';
415
    elsif CLK_I_port'event and CLK_I_port = '1' then
416
      if present_state = ST_RUNNING and trigger_act = '1' or (reg_trigger_en = '0' and
417
      memwr_out_adr != conv_integer(0) ) then
418
        outmgr_load <=  '1';
419
        outmgr_en   <=  '1';
420
        -- load must be set only one cycle
421
      elsif outmgr_en = '1' then
422
        load <= '0';
423
      end if;
424
    end if;
425
  end process;
426
 
427
  outmgr_initial_adr <= trigger_out_adr     when reg_trigger_en = '1' else
428
                        (others => '0');
429
 
430
end architecture;
431
 

powered by: WebSVN 2.1.0

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