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

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