@@ -0,0 +1,190 | |||
|
1 | ||
|
2 | LIBRARY ieee; | |
|
3 | USE ieee.std_logic_1164.ALL; | |
|
4 | USE ieee.numeric_std.ALL; | |
|
5 | LIBRARY grlib; | |
|
6 | USE grlib.amba.ALL; | |
|
7 | USE grlib.stdlib.ALL; | |
|
8 | USE grlib.devices.ALL; | |
|
9 | USE GRLIB.DMA2AHB_Package.ALL; | |
|
10 | LIBRARY lpp; | |
|
11 | USE lpp.lpp_amba.ALL; | |
|
12 | USE lpp.apb_devices_list.ALL; | |
|
13 | USE lpp.lpp_memory.ALL; | |
|
14 | LIBRARY techmap; | |
|
15 | USE techmap.gencomp.ALL; | |
|
16 | ||
|
17 | ENTITY fifo_latency_correction IS | |
|
18 | ||
|
19 | PORT ( | |
|
20 | HCLK : IN STD_ULOGIC; | |
|
21 | HRESETn : IN STD_ULOGIC; | |
|
22 | ||
|
23 | fifo_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
24 | fifo_empty : IN STD_LOGIC; | |
|
25 | fifo_ren : OUT STD_LOGIC; | |
|
26 | ||
|
27 | dma_data : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
28 | dma_empty : OUT STD_LOGIC; | |
|
29 | dma_ren : IN STD_LOGIC | |
|
30 | ); | |
|
31 | ||
|
32 | END fifo_latency_correction; | |
|
33 | ||
|
34 | ARCHITECTURE beh OF fifo_latency_correction IS | |
|
35 | ||
|
36 | SIGNAL valid_s1 : STD_LOGIC; | |
|
37 | SIGNAL valid_s2 : STD_LOGIC; | |
|
38 | ||
|
39 | SIGNAL data_s1 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
40 | SIGNAL data_s2 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
41 | SIGNAL dma_data_s : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
42 | ||
|
43 | ||
|
44 | SIGNAL ren_s1 : STD_LOGIC; | |
|
45 | SIGNAL ren_s2 : STD_LOGIC; | |
|
46 | ||
|
47 | SIGNAL fifo_ren_s : STD_LOGIC; | |
|
48 | BEGIN -- beh | |
|
49 | ||
|
50 | ||
|
51 | --fifo_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
52 | --fifo_empty : IN STD_LOGIC; | |
|
53 | ||
|
54 | --dma_ren : IN STD_LOGIC | |
|
55 | ||
|
56 | ||
|
57 | PROCESS (HCLK, HRESETn) | |
|
58 | BEGIN | |
|
59 | IF HRESETn = '0' THEN | |
|
60 | ren_s1 <= '1'; | |
|
61 | ren_s2 <= '1'; | |
|
62 | ELSIF HCLK'event AND HCLK = '1' THEN | |
|
63 | ren_s1 <= fifo_ren_s; | |
|
64 | ren_s2 <= fifo_ren_s; | |
|
65 | END IF; | |
|
66 | END PROCESS; | |
|
67 | fifo_ren <= fifo_ren_s; | |
|
68 | ||
|
69 | PROCESS (HCLK, HRESETn) | |
|
70 | BEGIN | |
|
71 | IF HRESETn = '0' THEN | |
|
72 | valid_s1 <= '0'; | |
|
73 | --data_s1 <= (OTHERS => 'X'); -- TODO just for simulation | |
|
74 | data_s1 <= (OTHERS => '0'); | |
|
75 | ELSIF HCLK'event AND HCLK = '1' THEN | |
|
76 | IF valid_s1 = '0' THEN | |
|
77 | IF valid_s2 = '1' AND ren_s2 = '0' AND dma_ren = '1' THEN | |
|
78 | valid_s1 <= '1'; | |
|
79 | data_s1 <= fifo_data; | |
|
80 | END IF; | |
|
81 | ELSE | |
|
82 | IF valid_s2 = '0' THEN | |
|
83 | IF ren_s2 = '0' AND dma_ren = '1' THEN | |
|
84 | valid_s1 <= '1'; | |
|
85 | data_s1 <= fifo_data; | |
|
86 | ELSE | |
|
87 | valid_s1 <= '0'; | |
|
88 | -- data_s1 <= (OTHERS => 'X'); -- TODO just for simulation | |
|
89 | END IF; | |
|
90 | ELSE | |
|
91 | IF dma_ren = '1' THEN | |
|
92 | valid_s1 <= '1'; | |
|
93 | data_s1 <= data_s1; | |
|
94 | ELSE | |
|
95 | IF ren_s2 = '0' THEN | |
|
96 | valid_s1 <= '1'; | |
|
97 | data_s1 <= fifo_data; | |
|
98 | ELSE | |
|
99 | valid_s1 <= '0'; | |
|
100 | -- data_s1 <= (OTHERS => 'X'); -- TODO just for simulation | |
|
101 | END IF; | |
|
102 | END IF; | |
|
103 | END IF; | |
|
104 | END IF; | |
|
105 | END IF; | |
|
106 | END PROCESS; | |
|
107 | ||
|
108 | PROCESS (HCLK, HRESETn) | |
|
109 | BEGIN | |
|
110 | IF HRESETn = '0' THEN | |
|
111 | valid_s2 <= '0'; | |
|
112 | -- data_s2 <= (OTHERS => 'X'); -- TODO just for simulation | |
|
113 | data_s2 <= (OTHERS => '0'); | |
|
114 | ELSIF HCLK'event AND HCLK = '1' THEN | |
|
115 | IF valid_s2 = '0' THEN | |
|
116 | IF dma_ren = '1' THEN | |
|
117 | IF valid_s1 = '1' THEN | |
|
118 | valid_s2 <= '1'; | |
|
119 | data_s2 <= data_s1; | |
|
120 | ELSE | |
|
121 | IF ren_s2 = '0' THEN | |
|
122 | valid_s2 <= '1'; | |
|
123 | data_s2 <= fifo_data; | |
|
124 | END IF; | |
|
125 | END IF; | |
|
126 | END IF; | |
|
127 | ELSE | |
|
128 | IF dma_ren = '1' THEN | |
|
129 | valid_s2 <= '1'; | |
|
130 | data_s2 <= data_s2; | |
|
131 | ELSE | |
|
132 | IF valid_s1 = '1' THEN | |
|
133 | valid_s2 <= '1'; | |
|
134 | data_s2 <= data_s1; | |
|
135 | ELSE | |
|
136 | IF ren_s2 = '0' THEN | |
|
137 | valid_s2 <= '1'; | |
|
138 | data_s2 <= fifo_data; | |
|
139 | ELSE | |
|
140 | valid_s2 <= '0'; | |
|
141 | -- data_s2 <= (OTHERS => 'X'); -- TODO just for simulation | |
|
142 | END IF; | |
|
143 | END IF; | |
|
144 | END IF; | |
|
145 | END IF; | |
|
146 | END IF; | |
|
147 | END PROCESS; | |
|
148 | ||
|
149 | -- PROCESS (HCLK, HRESETn) | |
|
150 | -- BEGIN | |
|
151 | -- IF HRESETn = '0' THEN | |
|
152 | -- dma_data <= (OTHERS => 'X'); | |
|
153 | -- ELSIF HCLK'event AND HCLK = '1' THEN | |
|
154 | -- IF valid_s2 = '1' THEN | |
|
155 | -- dma_data <= data_s2; | |
|
156 | -- ELSIF valid_s1 = '1' THEN | |
|
157 | -- dma_data <= data_s1; | |
|
158 | -- ELSIF ren_s2 = '0' THEN | |
|
159 | -- dma_data <= fifo_data; | |
|
160 | -- ELSE | |
|
161 | -- dma_data <= (OTHERS => 'X'); | |
|
162 | -- END IF; | |
|
163 | -- END IF; | |
|
164 | -- END PROCESS; | |
|
165 | ||
|
166 | ||
|
167 | ||
|
168 | dma_data_s <= data_s2 WHEN valid_s2 = '1' ELSE | |
|
169 | data_s1 WHEN valid_s1 = '1' ELSE | |
|
170 | fifo_data; | |
|
171 | ||
|
172 | PROCESS (HCLK, HRESETn) | |
|
173 | BEGIN -- PROCESS | |
|
174 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
175 | dma_data <= (OTHERS => '0'); | |
|
176 | ELSIF HCLK'event AND HCLK = '1' THEN -- rising clock edge | |
|
177 | IF dma_ren = '0' THEN | |
|
178 | dma_data <= dma_data_s; | |
|
179 | END IF; | |
|
180 | END IF; | |
|
181 | END PROCESS; | |
|
182 | ||
|
183 | fifo_ren_s <= '1' WHEN fifo_empty = '1' ELSE | |
|
184 | -- '0' WHEN valid_s1 = '0' OR valid_s2 = '0' ELSE -- FIX test0 | |
|
185 | '0' WHEN (valid_s1 = '0' OR valid_s2 = '0') AND ren_s2 = '1' ELSE -- FIX test0 | |
|
186 | dma_ren; | |
|
187 | ||
|
188 | dma_empty <= fifo_empty AND (NOT valid_s1) AND (NOT valid_s2); | |
|
189 | ||
|
190 | END beh; |
@@ -0,0 +1,168 | |||
|
1 | ------------------------------------------------------------------------------ | |
|
2 | -- This file is a part of the LPP VHDL IP LIBRARY | |
|
3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS | |
|
4 | -- | |
|
5 | -- This program is free software; you can redistribute it and/or modify | |
|
6 | -- it under the terms of the GNU General Public License as published by | |
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |
|
8 | -- (at your option) any later version. | |
|
9 | -- | |
|
10 | -- This program is distributed in the hope that it will be useful, | |
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
13 | -- GNU General Public License for more details. | |
|
14 | -- | |
|
15 | -- You should have received a copy of the GNU General Public License | |
|
16 | -- along with this program; if not, write to the Free Software | |
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
18 | ------------------------------------------------------------------------------- | |
|
19 | -- Author : Jean-christophe Pellion | |
|
20 | -- Mail : jean-christophe.pellion@lpp.polytechnique.fr | |
|
21 | -- jean-christophe.pellion@easii-ic.com | |
|
22 | ---------------------------------------------------------------------------- | |
|
23 | LIBRARY ieee; | |
|
24 | USE ieee.std_logic_1164.ALL; | |
|
25 | LIBRARY grlib; | |
|
26 | USE grlib.amba.ALL; | |
|
27 | USE grlib.stdlib.ALL; | |
|
28 | USE grlib.devices.ALL; | |
|
29 | USE GRLIB.DMA2AHB_Package.ALL; | |
|
30 | --USE GRLIB.DMA2AHB_TestPackage.ALL; | |
|
31 | LIBRARY lpp; | |
|
32 | USE lpp.lpp_amba.ALL; | |
|
33 | USE lpp.apb_devices_list.ALL; | |
|
34 | USE lpp.lpp_memory.ALL; | |
|
35 | LIBRARY techmap; | |
|
36 | USE techmap.gencomp.ALL; | |
|
37 | ||
|
38 | ENTITY fifo_test_dma IS | |
|
39 | GENERIC ( | |
|
40 | tech : INTEGER := apa3; | |
|
41 | pindex : INTEGER := 0; | |
|
42 | paddr : INTEGER := 0; | |
|
43 | pmask : INTEGER := 16#fff# | |
|
44 | ); | |
|
45 | PORT ( | |
|
46 | -- AMBA AHB system signals | |
|
47 | HCLK : IN STD_ULOGIC; | |
|
48 | HRESETn : IN STD_ULOGIC; | |
|
49 | ||
|
50 | -- AMBA APB Slave Interface | |
|
51 | apbi : IN apb_slv_in_type; | |
|
52 | apbo : OUT apb_slv_out_type; | |
|
53 | ||
|
54 | -- FIFO Read interface | |
|
55 | fifo_data : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
56 | fifo_empty : OUT STD_LOGIC; | |
|
57 | fifo_ren : IN STD_LOGIC; | |
|
58 | ||
|
59 | -- header | |
|
60 | header : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
61 | header_val : OUT STD_LOGIC; | |
|
62 | header_ack : IN STD_LOGIC | |
|
63 | ); | |
|
64 | END; | |
|
65 | ||
|
66 | ARCHITECTURE Behavioral OF fifo_test_dma IS | |
|
67 | CONSTANT REVISION : INTEGER := 1; | |
|
68 | CONSTANT pconfig : apb_config_type := ( | |
|
69 | 0 => ahb_device_reg (VENDOR_LPP, 0 , 0, REVISION, 0), | |
|
70 | 1 => apb_iobar(paddr, pmask)); | |
|
71 | ||
|
72 | TYPE lpp_test_dma_regs IS RECORD | |
|
73 | tt : STD_LOGIC; | |
|
74 | END RECORD; | |
|
75 | SIGNAL reg : lpp_test_dma_regs; | |
|
76 | ||
|
77 | SIGNAL prdata : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
78 | ----------------------------------------------------------------------------- | |
|
79 | SIGNAL fifo_empty_s : STD_LOGIC; | |
|
80 | SIGNAL fifo_raddr : STD_LOGIC_VECTOR(7 DOWNTO 0); | |
|
81 | SIGNAL fifo_wen : STD_LOGIC; | |
|
82 | SIGNAL fifo_wdata : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
83 | SIGNAL fifo_full : STD_LOGIC; | |
|
84 | SIGNAL fifo_waddr : STD_LOGIC_VECTOR(7 DOWNTO 0); | |
|
85 | ----------------------------------------------------------------------------- | |
|
86 | SIGNAL fifo_nb_data : STD_LOGIC_VECTOR( 7 DOWNTO 0); | |
|
87 | SIGNAL fifo_nb_data_s : STD_LOGIC_VECTOR( 7 DOWNTO 0); | |
|
88 | ----------------------------------------------------------------------------- | |
|
89 | SIGNAL header_s : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
90 | SIGNAL header_val_s : STD_LOGIC; | |
|
91 | BEGIN | |
|
92 | ||
|
93 | lpp_fifo_i : lpp_fifo | |
|
94 | GENERIC MAP ( | |
|
95 | tech => tech, | |
|
96 | Enable_ReUse => '0', | |
|
97 | DataSz => 32, | |
|
98 | abits => 8) | |
|
99 | PORT MAP ( | |
|
100 | rstn => HRESETn, | |
|
101 | ReUse => '0', | |
|
102 | ||
|
103 | rclk => HCLK, | |
|
104 | ren => fifo_ren, | |
|
105 | rdata => fifo_data, | |
|
106 | empty => fifo_empty_s, | |
|
107 | raddr => fifo_raddr, | |
|
108 | ||
|
109 | wclk => HCLK, | |
|
110 | wen => fifo_wen, | |
|
111 | wdata => fifo_wdata, | |
|
112 | full => fifo_full, | |
|
113 | waddr => fifo_waddr); -- OUT | |
|
114 | ||
|
115 | fifo_nb_data_s(7) <= '1' WHEN (fifo_waddr < fifo_raddr) ELSE '0'; | |
|
116 | fifo_nb_data_s(6 DOWNTO 0) <= (OTHERS => '0'); | |
|
117 | fifo_nb_data <= (fifo_waddr - fifo_raddr) + fifo_nb_data_s; | |
|
118 | ||
|
119 | fifo_empty <= fifo_empty_s; | |
|
120 | header <= header_s; | |
|
121 | header_val <= header_val_s; | |
|
122 | ----------------------------------------------------------------------------- | |
|
123 | ||
|
124 | apb_reg_p : PROCESS (HCLK, HRESETn) | |
|
125 | VARIABLE paddr : STD_LOGIC_VECTOR(7 DOWNTO 2); | |
|
126 | BEGIN -- PROCESS lpp_dma_top | |
|
127 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
128 | prdata <= (OTHERS => '0'); | |
|
129 | fifo_wdata <= (OTHERS => '0'); | |
|
130 | fifo_wen <= '1'; | |
|
131 | header_val_s <= '0'; | |
|
132 | header_s <= (OTHERS => '0'); | |
|
133 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge | |
|
134 | paddr := "000000"; | |
|
135 | paddr(7 DOWNTO 2) := apbi.paddr(7 DOWNTO 2); | |
|
136 | fifo_wen <= '1'; | |
|
137 | header_val_s <= header_val_s AND (NOT header_ack); | |
|
138 | IF (apbi.psel(pindex)) = '1' THEN | |
|
139 | -- APB DMA READ -- | |
|
140 | CASE paddr(7 DOWNTO 2) IS | |
|
141 | WHEN "000000" => prdata( 7 DOWNTO 0) <= fifo_waddr; | |
|
142 | prdata(15 DOWNTO 8) <= fifo_raddr; | |
|
143 | prdata(23 DOWNTO 16) <= fifo_nb_data; | |
|
144 | prdata(24) <= fifo_full; | |
|
145 | prdata(25) <= fifo_empty_s; | |
|
146 | WHEN "000001" => prdata(31 DOWNTO 0) <= header_s; | |
|
147 | ||
|
148 | WHEN OTHERS => prdata <= (OTHERS => '0'); | |
|
149 | END CASE; | |
|
150 | IF (apbi.pwrite AND apbi.penable) = '1' THEN | |
|
151 | -- APB DMA WRITE -- | |
|
152 | CASE paddr(7 DOWNTO 2) IS | |
|
153 | WHEN "000000" => fifo_wdata <= apbi.pwdata; | |
|
154 | fifo_wen <= '0'; | |
|
155 | WHEN "000001" => header_s <= apbi.pwdata; | |
|
156 | header_val_s <= '1'; | |
|
157 | WHEN OTHERS => NULL; | |
|
158 | END CASE; | |
|
159 | END IF; | |
|
160 | END IF; | |
|
161 | END IF; | |
|
162 | END PROCESS apb_reg_p; | |
|
163 | apbo.pirq <= (OTHERS => '0'); | |
|
164 | apbo.pindex <= pindex; | |
|
165 | apbo.pconfig <= pconfig; | |
|
166 | apbo.prdata <= prdata; | |
|
167 | ||
|
168 | END Behavioral; |
@@ -0,0 +1,366 | |||
|
1 | ------------------------------------------------------------------------------ | |
|
2 | -- This file is a part of the LPP VHDL IP LIBRARY | |
|
3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS | |
|
4 | -- | |
|
5 | -- This program is free software; you can redistribute it and/or modify | |
|
6 | -- it under the terms of the GNU General Public License as published by | |
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |
|
8 | -- (at your option) any later version. | |
|
9 | -- | |
|
10 | -- This program is distributed in the hope that it will be useful, | |
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
13 | -- GNU General Public License for more details. | |
|
14 | -- | |
|
15 | -- You should have received a copy of the GNU General Public License | |
|
16 | -- along with this program; if not, write to the Free Software | |
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
18 | ------------------------------------------------------------------------------- | |
|
19 | -- Author : Jean-christophe Pellion | |
|
20 | -- Mail : jean-christophe.pellion@lpp.polytechnique.fr | |
|
21 | -- jean-christophe.pellion@easii-ic.com | |
|
22 | ---------------------------------------------------------------------------- | |
|
23 | LIBRARY ieee; | |
|
24 | USE ieee.std_logic_1164.ALL; | |
|
25 | USE ieee.numeric_std.ALL; | |
|
26 | LIBRARY grlib; | |
|
27 | USE grlib.amba.ALL; | |
|
28 | USE grlib.stdlib.ALL; | |
|
29 | USE grlib.devices.ALL; | |
|
30 | USE GRLIB.DMA2AHB_Package.ALL; | |
|
31 | --USE GRLIB.DMA2AHB_TestPackage.ALL; | |
|
32 | LIBRARY lpp; | |
|
33 | USE lpp.lpp_amba.ALL; | |
|
34 | USE lpp.apb_devices_list.ALL; | |
|
35 | USE lpp.lpp_memory.ALL; | |
|
36 | USE lpp.lpp_dma_pkg.ALL; | |
|
37 | LIBRARY techmap; | |
|
38 | USE techmap.gencomp.ALL; | |
|
39 | ||
|
40 | ||
|
41 | ENTITY lpp_dma IS | |
|
42 | GENERIC ( | |
|
43 | tech : INTEGER := inferred; | |
|
44 | hindex : INTEGER := 2; | |
|
45 | pindex : INTEGER := 4; | |
|
46 | paddr : INTEGER := 4; | |
|
47 | pmask : INTEGER := 16#fff#; | |
|
48 | pirq : INTEGER := 0); | |
|
49 | PORT ( | |
|
50 | -- AMBA AHB system signals | |
|
51 | HCLK : IN STD_ULOGIC; | |
|
52 | HRESETn : IN STD_ULOGIC; | |
|
53 | ||
|
54 | -- AMBA APB Slave Interface | |
|
55 | apbi : IN apb_slv_in_type; | |
|
56 | apbo : OUT apb_slv_out_type; | |
|
57 | ||
|
58 | -- AMBA AHB Master Interface | |
|
59 | AHB_Master_In : IN AHB_Mst_In_Type; | |
|
60 | AHB_Master_Out : OUT AHB_Mst_Out_Type; | |
|
61 | ||
|
62 | -- fifo interface | |
|
63 | fifo_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
64 | fifo_empty : IN STD_LOGIC; | |
|
65 | fifo_ren : OUT STD_LOGIC; | |
|
66 | ||
|
67 | -- header | |
|
68 | header : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
69 | header_val : IN STD_LOGIC; | |
|
70 | header_ack : OUT STD_LOGIC | |
|
71 | ); | |
|
72 | END; | |
|
73 | ||
|
74 | ARCHITECTURE Behavioral OF lpp_dma IS | |
|
75 | ----------------------------------------------------------------------------- | |
|
76 | SIGNAL DMAIn : DMA_In_Type; | |
|
77 | SIGNAL header_dmai : DMA_In_Type; | |
|
78 | SIGNAL component_dmai : DMA_In_Type; | |
|
79 | SIGNAL DMAOut : DMA_OUt_Type; | |
|
80 | ||
|
81 | SIGNAL ready_matrix_f0_0 : STD_LOGIC; | |
|
82 | SIGNAL ready_matrix_f0_1 : STD_LOGIC; | |
|
83 | SIGNAL ready_matrix_f1 : STD_LOGIC; | |
|
84 | SIGNAL ready_matrix_f2 : STD_LOGIC; | |
|
85 | SIGNAL error_anticipating_empty_fifo : STD_LOGIC; | |
|
86 | SIGNAL error_bad_component_error : STD_LOGIC; | |
|
87 | ||
|
88 | SIGNAL config_active_interruption_onNewMatrix : STD_LOGIC; | |
|
89 | SIGNAL config_active_interruption_onError : STD_LOGIC; | |
|
90 | SIGNAL status_ready_matrix_f0_0 : STD_LOGIC; | |
|
91 | SIGNAL status_ready_matrix_f0_1 : STD_LOGIC; | |
|
92 | SIGNAL status_ready_matrix_f1 : STD_LOGIC; | |
|
93 | SIGNAL status_ready_matrix_f2 : STD_LOGIC; | |
|
94 | SIGNAL status_error_anticipating_empty_fifo : STD_LOGIC; | |
|
95 | SIGNAL status_error_bad_component_error : STD_LOGIC; | |
|
96 | SIGNAL addr_matrix_f0_0 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
97 | SIGNAL addr_matrix_f0_1 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
98 | SIGNAL addr_matrix_f1 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
99 | SIGNAL addr_matrix_f2 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
100 | ----------------------------------------------------------------------------- | |
|
101 | ||
|
102 | ----------------------------------------------------------------------------- | |
|
103 | ----------------------------------------------------------------------------- | |
|
104 | TYPE state_DMAWriteBurst IS (IDLE, | |
|
105 | TRASH_FIFO, | |
|
106 | WAIT_HEADER_ACK, | |
|
107 | SEND_DATA, | |
|
108 | WAIT_DATA_ACK, | |
|
109 | CHECK_LENGTH | |
|
110 | ); | |
|
111 | SIGNAL state : state_DMAWriteBurst := IDLE; | |
|
112 | ||
|
113 | SIGNAL nbSend : INTEGER; | |
|
114 | SIGNAL matrix_type : STD_LOGIC_VECTOR(1 DOWNTO 0); | |
|
115 | SIGNAL component_type : STD_LOGIC_VECTOR(3 DOWNTO 0); | |
|
116 | SIGNAL component_type_pre : STD_LOGIC_VECTOR(3 DOWNTO 0); | |
|
117 | SIGNAL header_check_ok : STD_LOGIC; | |
|
118 | SIGNAL address_matrix : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
119 | SIGNAL send_matrix : STD_LOGIC; | |
|
120 | SIGNAL request : STD_LOGIC; | |
|
121 | SIGNAL remaining_data_request : INTEGER; | |
|
122 | SIGNAL Address : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
123 | ----------------------------------------------------------------------------- | |
|
124 | ----------------------------------------------------------------------------- | |
|
125 | SIGNAL header_select : STD_LOGIC; | |
|
126 | ||
|
127 | SIGNAL header_send : STD_LOGIC; | |
|
128 | SIGNAL header_data : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
129 | SIGNAL header_send_ok : STD_LOGIC; | |
|
130 | SIGNAL header_send_ko : STD_LOGIC; | |
|
131 | ||
|
132 | SIGNAL component_send : STD_LOGIC; | |
|
133 | SIGNAL component_send_ok : STD_LOGIC; | |
|
134 | SIGNAL component_send_ko : STD_LOGIC; | |
|
135 | ----------------------------------------------------------------------------- | |
|
136 | SIGNAL fifo_ren_trash : STD_LOGIC; | |
|
137 | SIGNAL component_fifo_ren : STD_LOGIC; | |
|
138 | ||
|
139 | BEGIN | |
|
140 | ||
|
141 | ----------------------------------------------------------------------------- | |
|
142 | -- DMA to AHB interface | |
|
143 | ----------------------------------------------------------------------------- | |
|
144 | ||
|
145 | DMA2AHB_1 : DMA2AHB | |
|
146 | GENERIC MAP ( | |
|
147 | hindex => hindex, | |
|
148 | vendorid => VENDOR_LPP, | |
|
149 | deviceid => 0, | |
|
150 | version => 0, | |
|
151 | syncrst => 1, | |
|
152 | boundary => 0) | |
|
153 | PORT MAP ( | |
|
154 | HCLK => HCLK, | |
|
155 | HRESETn => HRESETn, | |
|
156 | DMAIn => DMAIn, | |
|
157 | DMAOut => DMAOut, | |
|
158 | AHBIn => AHB_Master_In, | |
|
159 | AHBOut => AHB_Master_Out); | |
|
160 | ||
|
161 | matrix_type <= header(1 DOWNTO 0); | |
|
162 | component_type <= header(5 DOWNTO 2); | |
|
163 | ||
|
164 | send_matrix <= '1' WHEN matrix_type = "00" AND status_ready_matrix_f0_0 = '0' ELSE | |
|
165 | '1' WHEN matrix_type = "01" AND status_ready_matrix_f0_1 = '0' ELSE | |
|
166 | '1' WHEN matrix_type = "10" AND status_ready_matrix_f1 = '0' ELSE | |
|
167 | '1' WHEN matrix_type = "11" AND status_ready_matrix_f2 = '0' ELSE | |
|
168 | '0'; | |
|
169 | ||
|
170 | header_check_ok <= '0' WHEN component_type = "1111" ELSE | |
|
171 | '1' WHEN component_type = "0000" AND component_type_pre = "1110" ELSE | |
|
172 | '1' WHEN component_type = component_type_pre + "0001" ELSE | |
|
173 | '0'; | |
|
174 | ||
|
175 | address_matrix <= addr_matrix_f0_0 WHEN matrix_type = "00" ELSE | |
|
176 | addr_matrix_f0_1 WHEN matrix_type = "01" ELSE | |
|
177 | addr_matrix_f1 WHEN matrix_type = "10" ELSE | |
|
178 | addr_matrix_f2 WHEN matrix_type = "11" ELSE | |
|
179 | (OTHERS => '0'); | |
|
180 | ||
|
181 | ----------------------------------------------------------------------------- | |
|
182 | -- DMA control | |
|
183 | ----------------------------------------------------------------------------- | |
|
184 | DMAWriteFSM_p : PROCESS (HCLK, HRESETn) | |
|
185 | BEGIN -- PROCESS DMAWriteBurst_p | |
|
186 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
187 | state <= IDLE; | |
|
188 | header_ack <= '0'; | |
|
189 | ready_matrix_f0_0 <= '0'; | |
|
190 | ready_matrix_f0_1 <= '0'; | |
|
191 | ready_matrix_f1 <= '0'; | |
|
192 | ready_matrix_f2 <= '0'; | |
|
193 | error_anticipating_empty_fifo <= '0'; | |
|
194 | error_bad_component_error <= '0'; | |
|
195 | component_type_pre <= "1110"; | |
|
196 | fifo_ren_trash <= '1'; | |
|
197 | component_send <= '0'; | |
|
198 | address <= (OTHERS => '0'); | |
|
199 | header_select <= '0'; | |
|
200 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge | |
|
201 | ||
|
202 | CASE state IS | |
|
203 | WHEN IDLE => | |
|
204 | ready_matrix_f0_0 <= '0'; | |
|
205 | ready_matrix_f0_1 <= '0'; | |
|
206 | ready_matrix_f1 <= '0'; | |
|
207 | ready_matrix_f2 <= '0'; | |
|
208 | error_bad_component_error <= '0'; | |
|
209 | header_select <= '1'; | |
|
210 | IF header_val = '1' AND fifo_empty = '0' AND send_matrix = '1' THEN | |
|
211 | IF header_check_ok = '1' THEN | |
|
212 | header_data <= header; | |
|
213 | component_type_pre <= header(5 DOWNTO 2); | |
|
214 | header_ack <= '1'; | |
|
215 | -- | |
|
216 | header_send <= '1'; | |
|
217 | IF component_type = "0000" THEN | |
|
218 | address <= address_matrix; | |
|
219 | END IF; | |
|
220 | header_data <= header; | |
|
221 | -- | |
|
222 | state <= WAIT_HEADER_ACK; | |
|
223 | ELSE | |
|
224 | error_bad_component_error <= '1'; | |
|
225 | component_type_pre <= "1110"; | |
|
226 | header_ack <= '1'; | |
|
227 | state <= TRASH_FIFO; | |
|
228 | END IF; | |
|
229 | END IF; | |
|
230 | ||
|
231 | WHEN TRASH_FIFO => | |
|
232 | error_bad_component_error <= '0'; | |
|
233 | error_anticipating_empty_fifo <= '0'; | |
|
234 | IF fifo_empty = '1' THEN | |
|
235 | state <= IDLE; | |
|
236 | fifo_ren_trash <= '1'; | |
|
237 | ELSE | |
|
238 | fifo_ren_trash <= '0'; | |
|
239 | END IF; | |
|
240 | ||
|
241 | WHEN WAIT_HEADER_ACK => | |
|
242 | header_send <= '0'; | |
|
243 | IF header_send_ko = '1' THEN | |
|
244 | state <= TRASH_FIFO; | |
|
245 | error_anticipating_empty_fifo <= '1'; | |
|
246 | -- TODO : error sending header | |
|
247 | ELSIF header_send_ok = '1' THEN | |
|
248 | header_select <= '0'; | |
|
249 | state <= SEND_DATA; | |
|
250 | address <= address + 4; | |
|
251 | END IF; | |
|
252 | ||
|
253 | WHEN SEND_DATA => | |
|
254 | IF fifo_empty = '1' THEN | |
|
255 | state <= IDLE; | |
|
256 | IF component_type = "1110" THEN | |
|
257 | CASE matrix_type IS | |
|
258 | WHEN "00" => ready_matrix_f0_0 <= '1'; | |
|
259 | WHEN "01" => ready_matrix_f0_1 <= '1'; | |
|
260 | WHEN "10" => ready_matrix_f1 <= '1'; | |
|
261 | WHEN "11" => ready_matrix_f2 <= '1'; | |
|
262 | WHEN OTHERS => NULL; | |
|
263 | END CASE; | |
|
264 | END IF; | |
|
265 | ELSE | |
|
266 | component_send <= '1'; | |
|
267 | address <= address; | |
|
268 | state <= WAIT_DATA_ACK; | |
|
269 | END IF; | |
|
270 | ||
|
271 | WHEN WAIT_DATA_ACK => | |
|
272 | component_send <= '0'; | |
|
273 | IF component_send_ok = '1' THEN | |
|
274 | address <= address + 64; | |
|
275 | state <= SEND_DATA; | |
|
276 | ELSIF component_send_ko = '1' THEN | |
|
277 | error_anticipating_empty_fifo <= '0'; | |
|
278 | state <= TRASH_FIFO; | |
|
279 | END IF; | |
|
280 | ||
|
281 | WHEN CHECK_LENGTH => | |
|
282 | state <= IDLE; | |
|
283 | WHEN OTHERS => NULL; | |
|
284 | END CASE; | |
|
285 | ||
|
286 | END IF; | |
|
287 | END PROCESS DMAWriteFSM_p; | |
|
288 | ||
|
289 | ----------------------------------------------------------------------------- | |
|
290 | -- SEND 1 word by DMA | |
|
291 | ----------------------------------------------------------------------------- | |
|
292 | lpp_dma_send_1word_1 : lpp_dma_send_1word | |
|
293 | PORT MAP ( | |
|
294 | HCLK => HCLK, | |
|
295 | HRESETn => HRESETn, | |
|
296 | DMAIn => header_dmai, | |
|
297 | DMAOut => DMAOut, | |
|
298 | ||
|
299 | send => header_send, | |
|
300 | address => address, | |
|
301 | data => header_data, | |
|
302 | send_ok => header_send_ok, | |
|
303 | send_ko => header_send_ko | |
|
304 | ); | |
|
305 | ||
|
306 | ----------------------------------------------------------------------------- | |
|
307 | -- SEND 16 word by DMA (in burst mode) | |
|
308 | ----------------------------------------------------------------------------- | |
|
309 | lpp_dma_send_16word_1 : lpp_dma_send_16word | |
|
310 | PORT MAP ( | |
|
311 | HCLK => HCLK, | |
|
312 | HRESETn => HRESETn, | |
|
313 | DMAIn => component_dmai, | |
|
314 | DMAOut => DMAOut, | |
|
315 | ||
|
316 | send => component_send, | |
|
317 | address => address, | |
|
318 | data => fifo_data, | |
|
319 | ren => component_fifo_ren, | |
|
320 | send_ok => component_send_ok, | |
|
321 | send_ko => component_send_ko); | |
|
322 | ||
|
323 | DMAIn <= header_dmai WHEN header_select = '1' ELSE component_dmai; | |
|
324 | fifo_ren <= fifo_ren_trash WHEN header_select = '1' ELSE component_fifo_ren; | |
|
325 | ||
|
326 | ||
|
327 | ----------------------------------------------------------------------------- | |
|
328 | -- APB REGISTER | |
|
329 | ----------------------------------------------------------------------------- | |
|
330 | ||
|
331 | lpp_dma_apbreg_2 : lpp_dma_apbreg | |
|
332 | GENERIC MAP ( | |
|
333 | pindex => pindex, | |
|
334 | paddr => paddr, | |
|
335 | pmask => pmask, | |
|
336 | pirq => pirq) | |
|
337 | PORT MAP ( | |
|
338 | HCLK => HCLK, | |
|
339 | HRESETn => HRESETn, | |
|
340 | apbi => apbi, | |
|
341 | apbo => apbo, | |
|
342 | -- IN | |
|
343 | ready_matrix_f0_0 => ready_matrix_f0_0, | |
|
344 | ready_matrix_f0_1 => ready_matrix_f0_1, | |
|
345 | ready_matrix_f1 => ready_matrix_f1, | |
|
346 | ready_matrix_f2 => ready_matrix_f2, | |
|
347 | error_anticipating_empty_fifo => error_anticipating_empty_fifo, | |
|
348 | error_bad_component_error => error_bad_component_error, | |
|
349 | -- OUT | |
|
350 | status_ready_matrix_f0_0 => status_ready_matrix_f0_0, | |
|
351 | status_ready_matrix_f0_1 => status_ready_matrix_f0_1, | |
|
352 | status_ready_matrix_f1 => status_ready_matrix_f1, | |
|
353 | status_ready_matrix_f2 => status_ready_matrix_f2, | |
|
354 | status_error_anticipating_empty_fifo => status_error_anticipating_empty_fifo, | |
|
355 | status_error_bad_component_error => status_error_bad_component_error, | |
|
356 | config_active_interruption_onNewMatrix => config_active_interruption_onNewMatrix, -- TODO | |
|
357 | config_active_interruption_onError => config_active_interruption_onError, -- TODO | |
|
358 | addr_matrix_f0_0 => addr_matrix_f0_0, | |
|
359 | addr_matrix_f0_1 => addr_matrix_f0_1, | |
|
360 | addr_matrix_f1 => addr_matrix_f1, | |
|
361 | addr_matrix_f2 => addr_matrix_f2); | |
|
362 | ||
|
363 | ----------------------------------------------------------------------------- | |
|
364 | ||
|
365 | END Behavioral; | |
|
366 |
@@ -0,0 +1,193 | |||
|
1 | ------------------------------------------------------------------------------ | |
|
2 | -- This file is a part of the LPP VHDL IP LIBRARY | |
|
3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS | |
|
4 | -- | |
|
5 | -- This program is free software; you can redistribute it and/or modify | |
|
6 | -- it under the terms of the GNU General Public License as published by | |
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |
|
8 | -- (at your option) any later version. | |
|
9 | -- | |
|
10 | -- This program is distributed in the hope that it will be useful, | |
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
13 | -- GNU General Public License for more details. | |
|
14 | -- | |
|
15 | -- You should have received a copy of the GNU General Public License | |
|
16 | -- along with this program; if not, write to the Free Software | |
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
18 | ------------------------------------------------------------------------------- | |
|
19 | -- Author : Jean-christophe Pellion | |
|
20 | -- Mail : jean-christophe.pellion@lpp.polytechnique.fr | |
|
21 | -- jean-christophe.pellion@easii-ic.com | |
|
22 | ---------------------------------------------------------------------------- | |
|
23 | LIBRARY ieee; | |
|
24 | USE ieee.std_logic_1164.ALL; | |
|
25 | USE ieee.numeric_std.ALL; | |
|
26 | LIBRARY grlib; | |
|
27 | USE grlib.amba.ALL; | |
|
28 | USE grlib.stdlib.ALL; | |
|
29 | USE grlib.devices.ALL; | |
|
30 | LIBRARY lpp; | |
|
31 | USE lpp.lpp_amba.ALL; | |
|
32 | USE lpp.apb_devices_list.ALL; | |
|
33 | USE lpp.lpp_memory.ALL; | |
|
34 | LIBRARY techmap; | |
|
35 | USE techmap.gencomp.ALL; | |
|
36 | ENTITY lpp_dma_apbreg IS | |
|
37 | GENERIC ( | |
|
38 | pindex : INTEGER := 4; | |
|
39 | paddr : INTEGER := 4; | |
|
40 | pmask : INTEGER := 16#fff#; | |
|
41 | pirq : INTEGER := 0); | |
|
42 | PORT ( | |
|
43 | -- AMBA AHB system signals | |
|
44 | HCLK : IN STD_ULOGIC; | |
|
45 | HRESETn : IN STD_ULOGIC; | |
|
46 | ||
|
47 | -- AMBA APB Slave Interface | |
|
48 | apbi : IN apb_slv_in_type; | |
|
49 | apbo : OUT apb_slv_out_type; | |
|
50 | ||
|
51 | -- IN | |
|
52 | ready_matrix_f0_0 : IN STD_LOGIC; | |
|
53 | ready_matrix_f0_1 : IN STD_LOGIC; | |
|
54 | ready_matrix_f1 : IN STD_LOGIC; | |
|
55 | ready_matrix_f2 : IN STD_LOGIC; | |
|
56 | error_anticipating_empty_fifo : IN STD_LOGIC; | |
|
57 | error_bad_component_error : IN STD_LOGIC; | |
|
58 | ||
|
59 | -- OUT | |
|
60 | status_ready_matrix_f0_0 : OUT STD_LOGIC; | |
|
61 | status_ready_matrix_f0_1 : OUT STD_LOGIC; | |
|
62 | status_ready_matrix_f1 : OUT STD_LOGIC; | |
|
63 | status_ready_matrix_f2 : OUT STD_LOGIC; | |
|
64 | status_error_anticipating_empty_fifo : OUT STD_LOGIC; | |
|
65 | status_error_bad_component_error : OUT STD_LOGIC; | |
|
66 | ||
|
67 | config_active_interruption_onNewMatrix : OUT STD_LOGIC; | |
|
68 | config_active_interruption_onError : OUT STD_LOGIC; | |
|
69 | addr_matrix_f0_0 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
70 | addr_matrix_f0_1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
71 | addr_matrix_f1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
72 | addr_matrix_f2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) | |
|
73 | ); | |
|
74 | ||
|
75 | END lpp_dma_apbreg; | |
|
76 | ||
|
77 | ARCHITECTURE beh OF lpp_dma_apbreg IS | |
|
78 | ||
|
79 | CONSTANT REVISION : INTEGER := 1; | |
|
80 | ||
|
81 | CONSTANT pconfig : apb_config_type := ( | |
|
82 | 0 => ahb_device_reg (VENDOR_LPP, LPP_DMA_TYPE, 0, REVISION, pirq), | |
|
83 | 1 => apb_iobar(paddr, pmask)); | |
|
84 | ||
|
85 | TYPE lpp_dma_regs IS RECORD | |
|
86 | config_active_interruption_onNewMatrix : STD_LOGIC; | |
|
87 | config_active_interruption_onError : STD_LOGIC; | |
|
88 | status_ready_matrix_f0_0 : STD_LOGIC; | |
|
89 | status_ready_matrix_f0_1 : STD_LOGIC; | |
|
90 | status_ready_matrix_f1 : STD_LOGIC; | |
|
91 | status_ready_matrix_f2 : STD_LOGIC; | |
|
92 | status_error_anticipating_empty_fifo : STD_LOGIC; | |
|
93 | status_error_bad_component_error : STD_LOGIC; | |
|
94 | addr_matrix_f0_0 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
95 | addr_matrix_f0_1 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
96 | addr_matrix_f1 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
97 | addr_matrix_f2 : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
98 | END RECORD; | |
|
99 | ||
|
100 | SIGNAL reg : lpp_dma_regs; | |
|
101 | ||
|
102 | SIGNAL prdata : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
103 | ||
|
104 | BEGIN -- beh | |
|
105 | ||
|
106 | status_ready_matrix_f0_0 <= reg.status_ready_matrix_f0_0; | |
|
107 | status_ready_matrix_f0_1 <= reg.status_ready_matrix_f0_1; | |
|
108 | status_ready_matrix_f1 <= reg.status_ready_matrix_f1; | |
|
109 | status_ready_matrix_f2 <= reg.status_ready_matrix_f2; | |
|
110 | status_error_anticipating_empty_fifo <= reg.status_error_anticipating_empty_fifo; | |
|
111 | status_error_bad_component_error <= reg.status_error_bad_component_error; | |
|
112 | ||
|
113 | config_active_interruption_onNewMatrix <= reg.config_active_interruption_onNewMatrix; | |
|
114 | config_active_interruption_onError <= reg.config_active_interruption_onError; | |
|
115 | addr_matrix_f0_0 <= reg.addr_matrix_f0_0; | |
|
116 | addr_matrix_f0_1 <= reg.addr_matrix_f0_1; | |
|
117 | addr_matrix_f1 <= reg.addr_matrix_f1; | |
|
118 | addr_matrix_f2 <= reg.addr_matrix_f2; | |
|
119 | ||
|
120 | lpp_dma_apbreg : PROCESS (HCLK, HRESETn) | |
|
121 | VARIABLE paddr : STD_LOGIC_VECTOR(7 DOWNTO 2); | |
|
122 | BEGIN -- PROCESS lpp_dma_top | |
|
123 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
124 | reg.config_active_interruption_onNewMatrix <= '0'; | |
|
125 | reg.config_active_interruption_onError <= '0'; | |
|
126 | reg.status_ready_matrix_f0_0 <= '0'; | |
|
127 | reg.status_ready_matrix_f0_1 <= '0'; | |
|
128 | reg.status_ready_matrix_f1 <= '0'; | |
|
129 | reg.status_ready_matrix_f2 <= '0'; | |
|
130 | reg.status_error_anticipating_empty_fifo <= '0'; | |
|
131 | reg.status_error_bad_component_error <= '0'; | |
|
132 | reg.addr_matrix_f0_0 <= (OTHERS => '0'); | |
|
133 | reg.addr_matrix_f0_1 <= (OTHERS => '0'); | |
|
134 | reg.addr_matrix_f1 <= (OTHERS => '0'); | |
|
135 | reg.addr_matrix_f2 <= (OTHERS => '0'); | |
|
136 | prdata <= (OTHERS => '0'); | |
|
137 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge | |
|
138 | ||
|
139 | reg.status_ready_matrix_f0_0 <= reg.status_ready_matrix_f0_0 OR ready_matrix_f0_0; | |
|
140 | reg.status_ready_matrix_f0_1 <= reg.status_ready_matrix_f0_1 OR ready_matrix_f0_1; | |
|
141 | reg.status_ready_matrix_f1 <= reg.status_ready_matrix_f1 OR ready_matrix_f1; | |
|
142 | reg.status_ready_matrix_f2 <= reg.status_ready_matrix_f2 OR ready_matrix_f2; | |
|
143 | ||
|
144 | reg.status_error_anticipating_empty_fifo <= reg.status_error_anticipating_empty_fifo OR error_anticipating_empty_fifo; | |
|
145 | reg.status_error_bad_component_error <= reg.status_error_bad_component_error OR error_bad_component_error; | |
|
146 | ||
|
147 | paddr := "000000"; | |
|
148 | paddr(7 DOWNTO 2) := apbi.paddr(7 DOWNTO 2); | |
|
149 | prdata <= (OTHERS => '0'); | |
|
150 | IF apbi.psel(pindex) = '1' THEN | |
|
151 | -- APB DMA READ -- | |
|
152 | CASE paddr(7 DOWNTO 2) IS | |
|
153 | WHEN "000000" => prdata(0) <= reg.config_active_interruption_onNewMatrix; | |
|
154 | prdata(1) <= reg.config_active_interruption_onError; | |
|
155 | WHEN "000001" => prdata(0) <= reg.status_ready_matrix_f0_0; | |
|
156 | prdata(1) <= reg.status_ready_matrix_f0_1; | |
|
157 | prdata(2) <= reg.status_ready_matrix_f1; | |
|
158 | prdata(3) <= reg.status_ready_matrix_f2; | |
|
159 | prdata(4) <= reg.status_error_anticipating_empty_fifo; | |
|
160 | prdata(5) <= reg.status_error_bad_component_error; | |
|
161 | WHEN "000010" => prdata <= reg.addr_matrix_f0_0; | |
|
162 | WHEN "000011" => prdata <= reg.addr_matrix_f0_1; | |
|
163 | WHEN "000100" => prdata <= reg.addr_matrix_f1; | |
|
164 | WHEN "000101" => prdata <= reg.addr_matrix_f2; | |
|
165 | WHEN OTHERS => NULL; | |
|
166 | END CASE; | |
|
167 | IF (apbi.pwrite AND apbi.penable) = '1' THEN | |
|
168 | -- APB DMA WRITE -- | |
|
169 | CASE paddr(7 DOWNTO 2) IS | |
|
170 | WHEN "000000" => reg.config_active_interruption_onNewMatrix <= apbi.pwdata(0); | |
|
171 | reg.config_active_interruption_onError <= apbi.pwdata(1); | |
|
172 | WHEN "000001" => reg.status_ready_matrix_f0_0 <= apbi.pwdata(0); | |
|
173 | reg.status_ready_matrix_f0_1 <= apbi.pwdata(1); | |
|
174 | reg.status_ready_matrix_f1 <= apbi.pwdata(2); | |
|
175 | reg.status_ready_matrix_f2 <= apbi.pwdata(3); | |
|
176 | reg.status_error_anticipating_empty_fifo <= apbi.pwdata(4); | |
|
177 | reg.status_error_bad_component_error <= apbi.pwdata(5); | |
|
178 | WHEN "000010" => reg.addr_matrix_f0_0 <= apbi.pwdata; | |
|
179 | WHEN "000011" => reg.addr_matrix_f0_1 <= apbi.pwdata; | |
|
180 | WHEN "000100" => reg.addr_matrix_f1 <= apbi.pwdata; | |
|
181 | WHEN "000101" => reg.addr_matrix_f2 <= apbi.pwdata; | |
|
182 | WHEN OTHERS => NULL; | |
|
183 | END CASE; | |
|
184 | END IF; | |
|
185 | END IF; | |
|
186 | END IF; | |
|
187 | END PROCESS lpp_dma_apbreg; | |
|
188 | apbo.pirq <= (OTHERS => '0'); | |
|
189 | apbo.pindex <= pindex; | |
|
190 | apbo.pconfig <= pconfig; | |
|
191 | apbo.prdata <= prdata; | |
|
192 | ||
|
193 | END beh; |
@@ -0,0 +1,164 | |||
|
1 | ------------------------------------------------------------------------------ | |
|
2 | -- This file is a part of the LPP VHDL IP LIBRARY | |
|
3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS | |
|
4 | -- | |
|
5 | -- This program is free software; you can redistribute it and/or modify | |
|
6 | -- it under the terms of the GNU General Public License as published by | |
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |
|
8 | -- (at your option) any later version. | |
|
9 | -- | |
|
10 | -- This program is distributed in the hope that it will be useful, | |
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
13 | -- GNU General Public License for more details. | |
|
14 | -- | |
|
15 | -- You should have received a copy of the GNU General Public License | |
|
16 | -- along with this program; if not, write to the Free Software | |
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
18 | ------------------------------------------------------------------------------- | |
|
19 | -- Author : Jean-christophe Pellion | |
|
20 | -- Mail : jean-christophe.pellion@lpp.polytechnique.fr | |
|
21 | -- jean-christophe.pellion@easii-ic.com | |
|
22 | ---------------------------------------------------------------------------- | |
|
23 | LIBRARY ieee; | |
|
24 | USE ieee.std_logic_1164.ALL; | |
|
25 | USE ieee.numeric_std.ALL; | |
|
26 | LIBRARY grlib; | |
|
27 | USE grlib.amba.ALL; | |
|
28 | USE grlib.stdlib.ALL; | |
|
29 | USE grlib.devices.ALL; | |
|
30 | LIBRARY lpp; | |
|
31 | USE lpp.lpp_amba.ALL; | |
|
32 | USE lpp.apb_devices_list.ALL; | |
|
33 | USE lpp.lpp_memory.ALL; | |
|
34 | LIBRARY techmap; | |
|
35 | USE techmap.gencomp.ALL; | |
|
36 | ||
|
37 | ENTITY lpp_dma_fsm IS | |
|
38 | PORT ( | |
|
39 | -- AMBA AHB system signals | |
|
40 | HCLK : IN STD_ULOGIC; | |
|
41 | HRESETn : IN STD_ULOGIC; | |
|
42 | ||
|
43 | -- AMBA APB Slave Interface | |
|
44 | apbi : IN apb_slv_in_type; | |
|
45 | apbo : OUT apb_slv_out_type; | |
|
46 | ||
|
47 | -- AMBA AHB Master Interface | |
|
48 | AHB_Master_In : IN AHB_Mst_In_Type; | |
|
49 | AHB_Master_Out : OUT AHB_Mst_Out_Type; | |
|
50 | ||
|
51 | -- fifo interface | |
|
52 | fifo_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
53 | fifo_empty : IN STD_LOGIC; | |
|
54 | fifo_ren : OUT STD_LOGIC; | |
|
55 | ||
|
56 | -- header | |
|
57 | header : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
58 | header_val : IN STD_LOGIC; | |
|
59 | header_ack : OUT STD_LOGIC; | |
|
60 | ||
|
61 | ||
|
62 | -- OUT | |
|
63 | ready_matrix_f0_0 : OUT STD_LOGIC; -- TODO | |
|
64 | ready_matrix_f0_1 : OUT STD_LOGIC; -- TODO | |
|
65 | ready_matrix_f1 : OUT STD_LOGIC; -- TODO | |
|
66 | ready_matrix_f2 : OUT STD_LOGIC; -- TODO | |
|
67 | error_anticipating_empty_fifo : OUT STD_LOGIC; -- TODO | |
|
68 | error_bad_component_error : OUT STD_LOGIC; -- TODO | |
|
69 | ||
|
70 | -- IN | |
|
71 | status_ready_matrix_f0_0 : IN STD_LOGIC; | |
|
72 | status_ready_matrix_f0_1 : IN STD_LOGIC; | |
|
73 | status_ready_matrix_f1 : IN STD_LOGIC; | |
|
74 | status_ready_matrix_f2 : IN STD_LOGIC; | |
|
75 | status_error_anticipating_empty_fifo : IN STD_LOGIC; -- TODO | |
|
76 | status_error_bad_component_error : IN STD_LOGIC; -- TODO | |
|
77 | ||
|
78 | config_active_interruption_onNewMatrix : IN STD_LOGIC; | |
|
79 | config_active_interruption_onError : IN STD_LOGIC; | |
|
80 | addr_matrix_f0_0 : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
81 | addr_matrix_f0_1 : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
82 | addr_matrix_f1 : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
83 | addr_matrix_f2 : IN STD_LOGIC_VECTOR(31 DOWNTO 0) | |
|
84 | ); | |
|
85 | END lpp_dma_fsm; | |
|
86 | ||
|
87 | ARCHITECTURE beh OF lpp_dma_fsm IS | |
|
88 | ----------------------------------------------------------------------------- | |
|
89 | -- HEADER check and update | |
|
90 | ----------------------------------------------------------------------------- | |
|
91 | SIGNAL send_matrix_val : STD_LOGIC; | |
|
92 | SIGNAL current_header : STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
93 | ----------------------------------------------------------------------------- | |
|
94 | SIGNAL send_matrix : STD_LOGIC; | |
|
95 | SIGNAL trash_matrix : STD_LOGIC; | |
|
96 | SIGNAL get_new_header : STD_LOGIC; | |
|
97 | ----------------------------------------------------------------------------- | |
|
98 | -- CONTROL SEND COMPONENT | |
|
99 | ----------------------------------------------------------------------------- | |
|
100 | TYPE state_fsm_send_component IS (IDLE, | |
|
101 | CHECK_HEADER, | |
|
102 | TRASH_FIFO, | |
|
103 | ||
|
104 | PACKET_IDLE,REQUEST_BUS,SEND_DATA_nextADDRESS,FAULT1,FAULT2); | |
|
105 | BEGIN -- beh | |
|
106 | ||
|
107 | ----------------------------------------------------------------------------- | |
|
108 | -- HEADER check and update | |
|
109 | ----------------------------------------------------------------------------- | |
|
110 | ||
|
111 | PROCESS (HCLK, HRESETn) | |
|
112 | BEGIN -- PROCESS | |
|
113 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
114 | current_header <= (OTHERS => '0'); | |
|
115 | header_ack <= '0'; | |
|
116 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge | |
|
117 | IF get_new_header = '1' AND header_val = '1' THEN | |
|
118 | IF send_matrix_val = '1' THEN | |
|
119 | current_header <= header; | |
|
120 | header_ack <= '1'; | |
|
121 | send_matrix <= component_val; | |
|
122 | trash_matrix <= (NOT component_val) OR (trash_matrix AND NOT (header(5 DOWNTO 2) = "0000")); | |
|
123 | END IF; | |
|
124 | ELSE | |
|
125 | current_header <= current_header; | |
|
126 | header_ack <= '0'; | |
|
127 | send_matrix <= '0'; | |
|
128 | trash_matrix <= '0'; | |
|
129 | END IF; | |
|
130 | END IF; | |
|
131 | END PROCESS; | |
|
132 | ||
|
133 | send_matrix_val <= '1' WHEN header(1 DOWNTO 0) = "00" AND status_ready_matrix_f0_0 = '0' ELSE | |
|
134 | '1' WHEN header(1 DOWNTO 0) = "01" AND status_ready_matrix_f0_1 = '0' ELSE | |
|
135 | '1' WHEN header(1 DOWNTO 0) = "10" AND status_ready_matrix_f1 = '0' ELSE | |
|
136 | '1' WHEN header(1 DOWNTO 0) = "11" AND status_ready_matrix_f2 = '0' ELSE | |
|
137 | '0'; | |
|
138 | ||
|
139 | component_val <= '0' WHEN header(5 DOWNTO 2) = "1111" ELSE | |
|
140 | '1' WHEN header(5 DOWNTO 2) = "0000" ELSE | |
|
141 | '1' WHEN header(5 DOWNTO 2) = current_header(5 DOWNTO 2) + "0001" ELSE | |
|
142 | '0'; | |
|
143 | ||
|
144 | --OUT | |
|
145 | --send_matrix | |
|
146 | --trash_matrix | |
|
147 | ||
|
148 | --IN | |
|
149 | --get_new_header | |
|
150 | ||
|
151 | ----------------------------------------------------------------------------- | |
|
152 | -- CONTROL SEND COMPONENT | |
|
153 | ----------------------------------------------------------------------------- | |
|
154 | fsm_send_component: PROCESS (HCLK, HRESETn) | |
|
155 | BEGIN -- PROCESS fsm_send_component | |
|
156 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
157 | ||
|
158 | ELSIF HCLK'event AND HCLK = '1' THEN -- rising clock edge | |
|
159 | ||
|
160 | END IF; | |
|
161 | END PROCESS fsm_send_component; | |
|
162 | ||
|
163 | ||
|
164 | END beh; |
@@ -0,0 +1,163 | |||
|
1 | ------------------------------------------------------------------------------ | |
|
2 | -- This file is a part of the LPP VHDL IP LIBRARY | |
|
3 | -- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS | |
|
4 | -- | |
|
5 | -- This program is free software; you can redistribute it and/or modify | |
|
6 | -- it under the terms of the GNU General Public License as published by | |
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |
|
8 | -- (at your option) any later version. | |
|
9 | -- | |
|
10 | -- This program is distributed in the hope that it will be useful, | |
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
13 | -- GNU General Public License for more details. | |
|
14 | -- | |
|
15 | -- You should have received a copy of the GNU General Public License | |
|
16 | -- along with this program; if not, write to the Free Software | |
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
|
18 | ------------------------------------------------------------------------------- | |
|
19 | -- Author : Jean-christophe Pellion | |
|
20 | -- Mail : jean-christophe.pellion@lpp.polytechnique.fr | |
|
21 | -- jean-christophe.pellion@easii-ic.com | |
|
22 | ---------------------------------------------------------------------------- | |
|
23 | LIBRARY ieee; | |
|
24 | USE ieee.std_logic_1164.ALL; | |
|
25 | LIBRARY grlib; | |
|
26 | USE grlib.amba.ALL; | |
|
27 | USE std.textio.ALL; | |
|
28 | LIBRARY grlib; | |
|
29 | USE grlib.amba.ALL; | |
|
30 | USE grlib.stdlib.ALL; | |
|
31 | USE GRLIB.DMA2AHB_Package.ALL; | |
|
32 | LIBRARY techmap; | |
|
33 | USE techmap.gencomp.ALL; | |
|
34 | LIBRARY lpp; | |
|
35 | USE lpp.lpp_amba.ALL; | |
|
36 | USE lpp.apb_devices_list.ALL; | |
|
37 | USE lpp.lpp_memory.ALL; | |
|
38 | ||
|
39 | PACKAGE lpp_dma_pkg IS | |
|
40 | ||
|
41 | COMPONENT lpp_dma | |
|
42 | GENERIC ( | |
|
43 | tech : INTEGER; | |
|
44 | hindex : INTEGER; | |
|
45 | pindex : INTEGER; | |
|
46 | paddr : INTEGER; | |
|
47 | pmask : INTEGER; | |
|
48 | pirq : INTEGER); | |
|
49 | PORT ( | |
|
50 | HCLK : IN STD_ULOGIC; | |
|
51 | HRESETn : IN STD_ULOGIC; | |
|
52 | apbi : IN apb_slv_in_type; | |
|
53 | apbo : OUT apb_slv_out_type; | |
|
54 | AHB_Master_In : IN AHB_Mst_In_Type; | |
|
55 | AHB_Master_Out : OUT AHB_Mst_Out_Type; | |
|
56 | -- fifo interface | |
|
57 | fifo_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
58 | fifo_empty : IN STD_LOGIC; | |
|
59 | fifo_ren : OUT STD_LOGIC; | |
|
60 | -- header | |
|
61 | header : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
62 | header_val : IN STD_LOGIC; | |
|
63 | header_ack : OUT STD_LOGIC); | |
|
64 | END COMPONENT; | |
|
65 | ||
|
66 | COMPONENT fifo_test_dma | |
|
67 | GENERIC ( | |
|
68 | tech : INTEGER; | |
|
69 | pindex : INTEGER; | |
|
70 | paddr : INTEGER; | |
|
71 | pmask : INTEGER); | |
|
72 | PORT ( | |
|
73 | HCLK : IN STD_ULOGIC; | |
|
74 | HRESETn : IN STD_ULOGIC; | |
|
75 | apbi : IN apb_slv_in_type; | |
|
76 | apbo : OUT apb_slv_out_type; | |
|
77 | -- fifo interface | |
|
78 | fifo_data : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
79 | fifo_empty : OUT STD_LOGIC; | |
|
80 | fifo_ren : IN STD_LOGIC; | |
|
81 | -- header | |
|
82 | header : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
83 | header_val : OUT STD_LOGIC; | |
|
84 | header_ack : IN STD_LOGIC | |
|
85 | ); | |
|
86 | END COMPONENT; | |
|
87 | ||
|
88 | COMPONENT lpp_dma_apbreg | |
|
89 | GENERIC ( | |
|
90 | pindex : INTEGER; | |
|
91 | paddr : INTEGER; | |
|
92 | pmask : INTEGER; | |
|
93 | pirq : INTEGER); | |
|
94 | PORT ( | |
|
95 | HCLK : IN STD_ULOGIC; | |
|
96 | HRESETn : IN STD_ULOGIC; | |
|
97 | apbi : IN apb_slv_in_type; | |
|
98 | apbo : OUT apb_slv_out_type; | |
|
99 | -- IN | |
|
100 | ready_matrix_f0_0 : IN STD_LOGIC; | |
|
101 | ready_matrix_f0_1 : IN STD_LOGIC; | |
|
102 | ready_matrix_f1 : IN STD_LOGIC; | |
|
103 | ready_matrix_f2 : IN STD_LOGIC; | |
|
104 | error_anticipating_empty_fifo : IN STD_LOGIC; | |
|
105 | error_bad_component_error : IN STD_LOGIC; | |
|
106 | ||
|
107 | -- OUT | |
|
108 | status_ready_matrix_f0_0 : OUT STD_LOGIC; | |
|
109 | status_ready_matrix_f0_1 : OUT STD_LOGIC; | |
|
110 | status_ready_matrix_f1 : OUT STD_LOGIC; | |
|
111 | status_ready_matrix_f2 : OUT STD_LOGIC; | |
|
112 | status_error_anticipating_empty_fifo : OUT STD_LOGIC; | |
|
113 | status_error_bad_component_error : OUT STD_LOGIC; | |
|
114 | ||
|
115 | config_active_interruption_onNewMatrix : OUT STD_LOGIC; | |
|
116 | config_active_interruption_onError : OUT STD_LOGIC; | |
|
117 | addr_matrix_f0_0 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
118 | addr_matrix_f0_1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
119 | addr_matrix_f1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
120 | addr_matrix_f2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0) | |
|
121 | ); | |
|
122 | END COMPONENT; | |
|
123 | ||
|
124 | COMPONENT lpp_dma_send_1word | |
|
125 | PORT ( | |
|
126 | HCLK : IN STD_ULOGIC; | |
|
127 | HRESETn : IN STD_ULOGIC; | |
|
128 | DMAIn : OUT DMA_In_Type; | |
|
129 | DMAOut : IN DMA_OUt_Type; | |
|
130 | send : IN STD_LOGIC; | |
|
131 | address : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
132 | data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
133 | send_ok : OUT STD_LOGIC; | |
|
134 | send_ko : OUT STD_LOGIC); | |
|
135 | END COMPONENT; | |
|
136 | ||
|
137 | COMPONENT lpp_dma_send_16word | |
|
138 | PORT ( | |
|
139 | HCLK : IN STD_ULOGIC; | |
|
140 | HRESETn : IN STD_ULOGIC; | |
|
141 | DMAIn : OUT DMA_In_Type; | |
|
142 | DMAOut : IN DMA_OUt_Type; | |
|
143 | send : IN STD_LOGIC; | |
|
144 | address : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
145 | data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
146 | ren : OUT STD_LOGIC; | |
|
147 | send_ok : OUT STD_LOGIC; | |
|
148 | send_ko : OUT STD_LOGIC); | |
|
149 | END COMPONENT; | |
|
150 | ||
|
151 | COMPONENT fifo_latency_correction | |
|
152 | PORT ( | |
|
153 | HCLK : IN STD_ULOGIC; | |
|
154 | HRESETn : IN STD_ULOGIC; | |
|
155 | fifo_data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
156 | fifo_empty : IN STD_LOGIC; | |
|
157 | fifo_ren : OUT STD_LOGIC; | |
|
158 | dma_data : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
159 | dma_empty : OUT STD_LOGIC; | |
|
160 | dma_ren : IN STD_LOGIC); | |
|
161 | END COMPONENT; | |
|
162 | ||
|
163 | END; |
@@ -0,0 +1,160 | |||
|
1 | ||
|
2 | LIBRARY ieee; | |
|
3 | USE ieee.std_logic_1164.ALL; | |
|
4 | USE ieee.numeric_std.ALL; | |
|
5 | LIBRARY grlib; | |
|
6 | USE grlib.amba.ALL; | |
|
7 | USE grlib.stdlib.ALL; | |
|
8 | USE grlib.devices.ALL; | |
|
9 | USE GRLIB.DMA2AHB_Package.ALL; | |
|
10 | LIBRARY lpp; | |
|
11 | USE lpp.lpp_amba.ALL; | |
|
12 | USE lpp.apb_devices_list.ALL; | |
|
13 | USE lpp.lpp_memory.ALL; | |
|
14 | LIBRARY techmap; | |
|
15 | USE techmap.gencomp.ALL; | |
|
16 | ||
|
17 | ENTITY lpp_dma_send_16word IS | |
|
18 | PORT ( | |
|
19 | -- AMBA AHB system signals | |
|
20 | HCLK : IN STD_ULOGIC; | |
|
21 | HRESETn : IN STD_ULOGIC; | |
|
22 | ||
|
23 | -- DMA | |
|
24 | DMAIn : OUT DMA_In_Type; | |
|
25 | DMAOut : IN DMA_OUt_Type; | |
|
26 | ||
|
27 | -- | |
|
28 | send : IN STD_LOGIC; | |
|
29 | address : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
30 | data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
31 | ren : OUT STD_LOGIC; | |
|
32 | -- | |
|
33 | send_ok : OUT STD_LOGIC; | |
|
34 | send_ko : OUT STD_LOGIC | |
|
35 | ); | |
|
36 | END lpp_dma_send_16word; | |
|
37 | ||
|
38 | ARCHITECTURE beh OF lpp_dma_send_16word IS | |
|
39 | ||
|
40 | TYPE state_fsm_send_16word IS (IDLE, REQUEST_BUS, SEND_DATA, ERROR0, ERROR1,WAIT_LAST_READY); | |
|
41 | SIGNAL state : state_fsm_send_16word; | |
|
42 | ||
|
43 | SIGNAL data_counter : INTEGER; | |
|
44 | SIGNAL grant_counter : INTEGER; | |
|
45 | ||
|
46 | BEGIN -- beh | |
|
47 | ||
|
48 | DMAIn.Beat <= HINCR16; | |
|
49 | DMAIn.Size <= HSIZE32; | |
|
50 | ||
|
51 | PROCESS (HCLK, HRESETn) | |
|
52 | BEGIN -- PROCESS | |
|
53 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
54 | state <= IDLE; | |
|
55 | send_ok <= '0'; | |
|
56 | send_ko <= '0'; | |
|
57 | ||
|
58 | DMAIn.Reset <= '0'; | |
|
59 | DMAIn.Address <= (OTHERS => '0'); | |
|
60 | -- DMAIn.Data <= (others => '0'); | |
|
61 | DMAIn.Request <= '0'; | |
|
62 | DMAIn.Store <= '0'; | |
|
63 | DMAIn.Burst <= '1'; | |
|
64 | DMAIn.Lock <= '0'; | |
|
65 | data_counter <= 0; | |
|
66 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge | |
|
67 | ||
|
68 | CASE state IS | |
|
69 | WHEN IDLE => | |
|
70 | -- ren <= '1'; | |
|
71 | DMAIn.Store <= '1'; | |
|
72 | DMAIn.Request <= '0'; | |
|
73 | send_ok <= '0'; | |
|
74 | send_ko <= '0'; | |
|
75 | DMAIn.Address <= address; | |
|
76 | data_counter <= 0; | |
|
77 | DMAIn.Lock <= '0'; -- FIX test | |
|
78 | IF send = '1' THEN | |
|
79 | state <= REQUEST_BUS; | |
|
80 | DMAIn.Request <= '1'; | |
|
81 | DMAIn.Lock <= '1'; -- FIX test | |
|
82 | DMAIn.Store <= '1'; | |
|
83 | END IF; | |
|
84 | WHEN REQUEST_BUS => | |
|
85 | -- ren <= '1'; | |
|
86 | IF DMAOut.Grant='1' THEN | |
|
87 | data_counter <= 1; | |
|
88 | grant_counter <= 1; | |
|
89 | -- ren <= '0'; | |
|
90 | state <= SEND_DATA; | |
|
91 | END IF; | |
|
92 | WHEN SEND_DATA => | |
|
93 | -- ren <= '1'; | |
|
94 | ||
|
95 | IF DMAOut.Fault = '1' THEN | |
|
96 | DMAIn.Reset <= '0'; | |
|
97 | DMAIn.Address <= (others => '0'); | |
|
98 | -- DMAIn.Data <= (others => '0'); | |
|
99 | DMAIn.Request <= '0'; | |
|
100 | DMAIn.Store <= '0'; | |
|
101 | DMAIn.Burst <= '0'; | |
|
102 | state <= ERROR0; | |
|
103 | ELSE | |
|
104 | ||
|
105 | IF DMAOut.Grant = '1' THEN | |
|
106 | if grant_counter = 15 then | |
|
107 | DMAIn.Reset <= '0'; | |
|
108 | DMAIn.Request <= '0'; | |
|
109 | DMAIn.Store <= '0'; | |
|
110 | DMAIn.Burst <= '0'; | |
|
111 | else | |
|
112 | grant_counter <= grant_counter+1; | |
|
113 | end if; | |
|
114 | END IF; | |
|
115 | ||
|
116 | IF DMAOut.OKAY = '1' THEN | |
|
117 | IF data_counter = 15 THEN | |
|
118 | DMAIn.Address <= (others => '0'); | |
|
119 | state <= WAIT_LAST_READY; | |
|
120 | ELSE | |
|
121 | --DMAIn.Data <= data; | |
|
122 | data_counter <= data_counter + 1; | |
|
123 | -- ren <= '0'; | |
|
124 | END IF; | |
|
125 | END IF; | |
|
126 | END IF; | |
|
127 | ||
|
128 | ||
|
129 | WHEN WAIT_LAST_READY => | |
|
130 | -- ren <= '1'; | |
|
131 | IF DMAOut.Ready = '1' THEN | |
|
132 | IF grant_counter = 15 THEN | |
|
133 | state <= IDLE; | |
|
134 | send_ok <= '1'; | |
|
135 | send_ko <= '0'; | |
|
136 | ELSE | |
|
137 | state <= ERROR0; | |
|
138 | END IF; | |
|
139 | END IF; | |
|
140 | ||
|
141 | WHEN ERROR0 => | |
|
142 | -- ren <= '1'; | |
|
143 | state <= ERROR1; | |
|
144 | WHEN ERROR1 => | |
|
145 | send_ok <= '0'; | |
|
146 | send_ko <= '1'; | |
|
147 | -- ren <= '1'; | |
|
148 | state <= IDLE; | |
|
149 | WHEN OTHERS => NULL; | |
|
150 | END CASE; | |
|
151 | END IF; | |
|
152 | END PROCESS; | |
|
153 | ||
|
154 | DMAIn.Data <= data; | |
|
155 | ||
|
156 | ren <= '0' WHEN DMAOut.OKAY = '1' AND state = SEND_DATA ELSE | |
|
157 | '0' WHEN state = REQUEST_BUS AND DMAOut.Grant = '1' ELSE | |
|
158 | '1'; | |
|
159 | ||
|
160 | END beh; |
@@ -0,0 +1,101 | |||
|
1 | ||
|
2 | LIBRARY ieee; | |
|
3 | USE ieee.std_logic_1164.ALL; | |
|
4 | USE ieee.numeric_std.ALL; | |
|
5 | LIBRARY grlib; | |
|
6 | USE grlib.amba.ALL; | |
|
7 | USE grlib.stdlib.ALL; | |
|
8 | USE grlib.devices.ALL; | |
|
9 | USE GRLIB.DMA2AHB_Package.ALL; | |
|
10 | LIBRARY lpp; | |
|
11 | USE lpp.lpp_amba.ALL; | |
|
12 | USE lpp.apb_devices_list.ALL; | |
|
13 | USE lpp.lpp_memory.ALL; | |
|
14 | LIBRARY techmap; | |
|
15 | USE techmap.gencomp.ALL; | |
|
16 | ||
|
17 | ENTITY lpp_dma_send_1word IS | |
|
18 | PORT ( | |
|
19 | -- AMBA AHB system signals | |
|
20 | HCLK : IN STD_ULOGIC; | |
|
21 | HRESETn : IN STD_ULOGIC; | |
|
22 | ||
|
23 | -- DMA | |
|
24 | DMAIn : OUT DMA_In_Type; | |
|
25 | DMAOut : IN DMA_OUt_Type; | |
|
26 | -- | |
|
27 | send : IN STD_LOGIC; | |
|
28 | address : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
29 | data : IN STD_LOGIC_VECTOR(31 DOWNTO 0); | |
|
30 | -- | |
|
31 | send_ok : OUT STD_LOGIC; | |
|
32 | send_ko : OUT STD_LOGIC | |
|
33 | ); | |
|
34 | END lpp_dma_send_1word; | |
|
35 | ||
|
36 | ARCHITECTURE beh OF lpp_dma_send_1word IS | |
|
37 | ||
|
38 | TYPE state_fsm_send_1word IS (IDLE, REQUEST_BUS, SEND_DATA, ERROR0, ERROR1); | |
|
39 | SIGNAL state : state_fsm_send_1word; | |
|
40 | ||
|
41 | BEGIN -- beh | |
|
42 | ||
|
43 | DMAIn.Reset <= '0'; | |
|
44 | DMAIn.Address <= address; | |
|
45 | DMAIn.Data <= data; | |
|
46 | DMAIn.Beat <= (OTHERS => '0'); | |
|
47 | DMAIn.Size <= HSIZE32; | |
|
48 | DMAIn.Burst <= '0'; | |
|
49 | ||
|
50 | PROCESS (HCLK, HRESETn) | |
|
51 | BEGIN -- PROCESS | |
|
52 | IF HRESETn = '0' THEN -- asynchronous reset (active low) | |
|
53 | state <= IDLE; | |
|
54 | DMAIn.Request <= '0'; | |
|
55 | DMAIn.Store <= '0'; | |
|
56 | send_ok <= '0'; | |
|
57 | send_ko <= '0'; | |
|
58 | DMAIn.Lock <= '0'; | |
|
59 | ELSIF HCLK'EVENT AND HCLK = '1' THEN -- rising clock edge | |
|
60 | CASE state IS | |
|
61 | WHEN IDLE => | |
|
62 | DMAIn.Store <= '1'; | |
|
63 | DMAIn.Request <= '0'; | |
|
64 | send_ok <= '0'; | |
|
65 | send_ko <= '0'; | |
|
66 | DMAIn.Lock <= '0'; | |
|
67 | IF send = '1' THEN | |
|
68 | DMAIn.Request <= '1'; | |
|
69 | DMAIn.Lock <= '1'; | |
|
70 | state <= REQUEST_BUS; | |
|
71 | END IF; | |
|
72 | WHEN REQUEST_BUS => | |
|
73 | IF DMAOut.Grant = '1' THEN | |
|
74 | DMAIn.Request <= '0'; | |
|
75 | DMAIn.Store <= '0'; | |
|
76 | state <= SEND_DATA; | |
|
77 | END IF; | |
|
78 | WHEN SEND_DATA => | |
|
79 | IF DMAOut.Fault = '1' THEN | |
|
80 | DMAIn.Request <= '0'; | |
|
81 | DMAIn.Store <= '0'; | |
|
82 | state <= ERROR0; | |
|
83 | ELSIF DMAOut.Ready = '1' THEN | |
|
84 | DMAIn.Request <= '0'; | |
|
85 | DMAIn.Store <= '0'; | |
|
86 | send_ok <= '1'; | |
|
87 | send_ko <= '0'; | |
|
88 | state <= IDLE; | |
|
89 | END IF; | |
|
90 | WHEN ERROR0 => | |
|
91 | state <= ERROR1; | |
|
92 | WHEN ERROR1 => | |
|
93 | send_ok <= '0'; | |
|
94 | send_ko <= '1'; | |
|
95 | state <= IDLE; | |
|
96 | WHEN OTHERS => NULL; | |
|
97 | END CASE; | |
|
98 | END IF; | |
|
99 | END PROCESS; | |
|
100 | ||
|
101 | END beh; |
General Comments 0
You need to be logged in to leave comments.
Login now