source: firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/control_manager_beha.vhd @ 10072

Last change on this file since 10072 was 10072, checked in by neise, 9 years ago
block to block communication debugged - part 1
File size: 5.3 KB
Line 
1--
2-- VHDL Architecture FACT_FAD_lib.controlRAM_manager.beha
3--
4-- Created:
5--          by - Benjamin Krumm.UNKNOWN (EEPC8)
6--          at - 14:35:46 14.04.2010
7--
8-- using Mentor Graphics HDL Designer(TM) 2009.1 (Build 12)
9--
10LIBRARY ieee;
11USE ieee.std_logic_1164.ALL;
12USE ieee.std_logic_arith.ALL;
13USE ieee.std_logic_unsigned.ALL;
14LIBRARY FACT_FAD_LIB;
15USE FACT_FAD_LIB.fad_definitions.ALL;
16
17ENTITY control_manager IS
18   GENERIC( 
19      NO_OF_ROI  : integer := 36;
20      NO_OF_DAC  : integer := 8;
21      ADDR_WIDTH : integer := 8
22   );
23   PORT( 
24      clk               : IN     std_logic;
25      ram_data_out      : IN     std_logic_vector (15 DOWNTO 0);
26      config_ready, config_started : OUT    std_logic := '0';
27      config_start      : IN     std_logic;
28      config_data       : INOUT  std_logic_vector (15 DOWNTO 0) := (others => 'Z');
29      config_addr       : IN     std_logic_vector (ADDR_WIDTH - 1 DOWNTO 0);
30      config_wr_en      : IN     std_logic;
31      config_rd_en      : IN     std_logic;
32      config_data_valid : OUT    std_logic := '0';
33      config_busy       : OUT    std_logic := '0';
34      -- --
35      config_rw_ack, config_rw_ready : out std_logic := '0';
36      -- --
37      ram_addr          : OUT    std_logic_vector (ADDR_WIDTH - 1 DOWNTO 0);
38      ram_data_in       : OUT    std_logic_vector (15 DOWNTO 0);
39      ram_write_en      : OUT    std_logic_vector (0 DOWNTO 0);
40      dac_array         : OUT    dac_array_type;
41      roi_array         : OUT    roi_array_type
42   );
43
44-- Declarations
45
46END control_manager ;
47
48ARCHITECTURE beha OF control_manager IS
49 
50  type TYPE_CTRL_STATE is (CTRL_INIT, CTRL_IDLE, CTRL_WAIT_IDLE, CTRL_WRITE, CTRL_WRITE_READY,
51                           CTRL_LOAD_ADDR, CTRL_LOAD_WAIT, CTRL_LOAD_DATA, 
52                           CTRL_READ_ADDR, CTRL_READ_WAIT, CTRL_READ_DATA);
53 
54  signal ctrl_state : TYPE_CTRL_STATE := CTRL_INIT;
55  signal addr_cntr : integer range 0 to 2**ADDR_WIDTH - 1 := 0;
56  signal int_dac_array : dac_array_type := DEFAULT_DAC;
57  signal int_roi_array : roi_array_type := DEFAULT_ROI;
58
59BEGIN
60 
61  control_fsm_proc: process (clk)
62  begin
63   
64    if rising_edge(clk) then
65
66      config_busy <= '1';     -- is always busy except in idle mode
67     
68      case ctrl_state is
69       
70        when CTRL_INIT =>
71          -- WRITES DEFAULT VALUES IN config ram
72          addr_cntr <= addr_cntr + 1;
73          ram_addr <= conv_std_logic_vector(addr_cntr, ADDR_WIDTH);
74          config_data_valid <= '0';
75          config_ready <= '0';
76          ctrl_state <= CTRL_INIT;
77          ram_write_en <= "1";
78          if (addr_cntr < NO_OF_ROI) then
79            ram_data_in <= conv_std_logic_vector(int_roi_array(addr_cntr ), 16);
80          elsif (addr_cntr < NO_OF_ROI + NO_OF_DAC) then
81            ram_data_in <= conv_std_logic_vector(int_dac_array(addr_cntr - NO_OF_ROI), 16);
82          else
83            ram_write_en <= "0"; 
84            ctrl_state <= CTRL_IDLE;
85          end if;
86     
87        when CTRL_IDLE =>
88          addr_cntr <= 0;
89          ram_write_en <= "0";
90          config_busy <= '0';
91          if (config_start = '1') then
92            config_started <= '1';
93            config_ready <= '0';
94            config_data_valid <= '0';
95            ctrl_state <= CTRL_LOAD_ADDR;
96          end if;
97          if (config_wr_en = '1') then
98            config_busy <= '1';
99            config_rw_ack <= '1';
100            config_rw_ready <= '0';
101            config_data <= (others => 'Z');
102            ctrl_state <= CTRL_WRITE;
103          end if;
104          if (config_rd_en = '1') then
105            ram_addr <= config_addr;
106            config_data_valid <= '0';
107--            ctrl_state <= CTRL_READ_ADDR;
108            ctrl_state <= CTRL_READ_WAIT;
109          end if; 
110
111        when CTRL_WAIT_IDLE =>
112          ctrl_state <= CTRL_IDLE; 
113         
114        when CTRL_LOAD_ADDR =>
115          ram_addr <= conv_std_logic_vector(addr_cntr, ADDR_WIDTH);
116          ctrl_state <= CTRL_LOAD_WAIT;
117        when CTRL_LOAD_WAIT =>
118          ctrl_state <= CTRL_LOAD_DATA;
119        when CTRL_LOAD_DATA =>
120          addr_cntr <= addr_cntr + 1;
121          if (addr_cntr < NO_OF_ROI) then
122            roi_array(addr_cntr) <= conv_integer(ram_data_out);
123            ctrl_state <= CTRL_LOAD_ADDR;
124          elsif (addr_cntr < NO_OF_ROI + NO_OF_DAC) then
125            dac_array(addr_cntr - NO_OF_ROI) <= conv_integer(ram_data_out);
126            ctrl_state <= CTRL_LOAD_ADDR;
127          else
128            addr_cntr <= 0;
129            config_started <= '0';
130            config_ready <= '1';
131            ctrl_state <= CTRL_WAIT_IDLE;
132          end if;
133       
134        when CTRL_WRITE =>
135          ram_data_in <= config_data;
136          ram_addr <= config_addr;
137          ram_write_en <= "1";
138          ctrl_state <= CTRL_WRITE_READY;
139        when CTRL_WRITE_READY =>
140          config_rw_ack <= '0';
141          config_rw_ready <= '1';
142          if (config_wr_en = '0') then
143            ctrl_state <= CTRL_IDLE;
144          end if;
145       
146        -- *** IMPORTANT ***
147        -- read address must remain two clock cycles
148        when CTRL_READ_ADDR =>
149          ctrl_state <= CTRL_READ_WAIT;
150        when CTRL_READ_WAIT =>
151          ctrl_state <= CTRL_READ_DATA;
152        when CTRL_READ_DATA =>
153          config_data <= ram_data_out;
154          config_data_valid <= '1';
155          ctrl_state <= CTRL_IDLE;
156       
157        end case;
158       
159    end if;
160   
161  end process control_fsm_proc;
162
163END ARCHITECTURE beha;
164
Note: See TracBrowser for help on using the repository browser.