source: firmware/FAD/FACT_FAD_20MHz_VAR_PS/FACT_FAD_lib/hdl/w5300_interface.vhd @ 10178

Last change on this file since 10178 was 10178, checked in by neise, 9 years ago
File size: 3.1 KB
Line 
1library IEEE;
2use IEEE.STD_LOGIC_1164.ALL;
3use IEEE.NUMERIC_STD.all;
4
5ENTITY w5300_modul IS
6PORT(
7        clk                                                     : IN    std_logic;                                              -- expecting 50MHz
8       
9        wiz_reset_o                                     : OUT   std_logic                                               := '1';
10        cs_o                                            : OUT   std_logic                                               := '1';
11        wr_o                                            : OUT   std_logic                                               := '1';
12        rd_o                                            : OUT   std_logic                                               := '1';
13        int_o                                           : IN    std_logic;
14        wiz_data                                        : INOUT std_logic_vector (15 DOWNTO 0);
15        wiz_addr                                        : OUT   std_logic_vector (9 DOWNTO 0);
16       
17        read_not_wirte                          : IN    std_logic;
18        start_i                                         : IN    std_logic;
19        valid_next                                      : OUT   std_logic                                               :='0';
20        addr_i                                          : IN    std_logic_vector (9 DOWNTO 0);
21        data_o                                          : OUT   std_logic_vector (15 DOWNTO 0)  := (others => '0');
22        data_i                                          : IN    std_logic_vector (15 DOWNTO 0);
23       
24);
25END w5300_modul ;
26
27architecture Behavioral of w5300_modul is
28        signal read_not_write_signal : std_logic := '1';
29        signal data_signal : std_logic_vector (15 DOWNTO 0) := (others => 'Z');
30        signal addr_signal : std_logic_vector (9 DOWNTO 0) := (others => '0');
31       
32main_process: process(clk)
33begin
34
35rd_o <= read_not_write_signal;
36wr_o <= not read_not_write_signal;
37wiz_data <= data_signal;
38wiz_addr <= addr_signal;
39
40if rising__edge(clk) then
41
42        case state is
43       
44        when BEFORE DO SOMETING         =>
45               
46        when CS_LOW     =>
47                cs_o <= '0';
48                state <= WAIT_ONCE;
49               
50        when AFTER_20ns =>
51                state <= WAIT_TWICE;
52               
53        when AFTER_40ns =>
54                if (read_not_write_signal = '1') then
55                        valid_next <= '1';
56                        state <= OUTPUT_DATA;
57                else
58                        state <= INPUT_SAMPLING;
59                end if;
60               
61               
62                state <= DO_SOMETHING_ELSE;
63               
64        when OUTPUT_DATA        =>
65               
66                if (read_not_write_signal = '1') then
67                        data_o <= wiz_data;
68                end if;
69               
70        when INPUT_SAMPLING     =>
71                cs_o <= '1';
72                addr_signal <= addr_i;
73                read_not_write_signal <= read_not_write;
74                if (read_not_write = '1') then
75                        data_signal <= (others => 'Z');
76                else
77                        data_signal <= data_i;
78                end if;
79                wiz_addr <= addr_i;
80       
81                if (start_i = '1') then
82                        idle_next = '0';
83                        state <= CS_LOW;
84                else
85                        state <= INPUT_SAMPLING;
86       
87                                        when READ_REG =>
88                                                case count is
89                                                        when "000" =>
90                                                                cs <= '0';
91                                                                rd <= '0';
92                                                                wr <= '1';
93                                                                data <= (others => 'Z'); -- !!!!!!!!!!
94                                                                count <= "001";
95                                                                addr <= par_addr;
96                                                       
97                                                        1x WARTEN
98                                                       
99                                                        1x WARTEN
100                                                       
101                                                        when "100" =>
102                                                                data_read <= data;
103                                                                count <= "110";
104                                                       
105                                                        1x WARTEN
106                                                       
107                                                        when "111" =>
108                                                                cs <= '1';
109                                                                rd <= '1';
110                                                                count <= "000";
111                                                                state_init <= next_state;
112
113                                        when WRITE_REG =>
114                                                case count is
115                                                        when "000" =>
116                                                                cs <= '0';
117                                                                wr <= '0';
118                                                                rd <= '1';
119                                                                addr <= par_addr; 
120                                                                if (ram_access = '1') then
121                                                                        data <= ram_data;
122                                                                else
123                                                                        data <= par_data;
124                                                                end if;
125                                                                count <= "100";
126                                                       
127                                                        1x WARTEN
128                                                       
129                                                        1x WARTEN
130                                                       
131                                                        when "110" =>
132                                                                cs <= '1';
133                                                                wr <= '1';
134                                                                state_init <= next_state;
135                                                                count <= "000";
136                                                        when others =>
137                                                                null;
138                                                end case;
139                                       
140                                        when others =>
141                                                null;
142enf if; -- rising_edge(clk)                                             
143end process main_process;
Note: See TracBrowser for help on using the repository browser.