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

Last change on this file since 10886 was 10886, checked in by neise, 8 years ago
new try to oout source the W5300 read/write access in order to get rid of interleaved FSMs in W5300_modul.vhd -- needs to be simulated
File size: 3.3 KB
Line 
1library IEEE;
2use IEEE.STD_LOGIC_1164.ALL;
3use IEEE.NUMERIC_STD.all;
4
5ENTITY w5300_modul IS
6  generic(
7    TIME_UNTIL_READ_READY : integer := 4;
8        TIME_UNTIL_READ_READY : integer := 4;
9  );
10PORT(
11        clk                                                     : IN    std_logic;                                              -- expecting 50MHz
12       
13        wiz_reset                                       : OUT   std_logic;
14        cs                                                      : OUT   std_logic;
15        wr                                                      : OUT   std_logic;
16        rd                                                      : OUT   std_logic;
17        int                                                     : IN    std_logic;
18        wiz_data                                        : INOUT std_logic_vector (15 DOWNTO 0);
19        wiz_addr                                        : OUT   std_logic_vector (9 DOWNTO 0);
20       
21        read_i                                          : IN    std_logic;
22        write_i                                         : IN    std_logic;
23        addr_i                                          : IN    std_logic_vector (9 DOWNTO 0);
24        data_o                                          : OUT   std_logic_vector (15 DOWNTO 0)  := (others => '0');
25        data_i                                          : IN    std_logic_vector (15 DOWNTO 0);
26       
27);
28END w5300_modul ;
29
30architecture Behavioral of w5300_modul is
31        signal read_not_write_signal : std_logic := '1';
32        signal data_signal : std_logic_vector (15 DOWNTO 0) := (others => 'Z');
33        signal addr_signal : std_logic_vector (9 DOWNTO 0) := (others => '0');
34
35       
36        -- this counter counts the time, the cs signal is low in units of 1/clk_period
37        -- since it is increased already in IDLE state, it really
38        signal wait_ctr : integer range 0 to 15 := 0; 
39       
40       
41main_process: process(clk)
42        begin
43        if rising__edge(clk) then
44                -- synch in read & write commands
45                read_sr         <= read_sr(0)   & read_i;
46                write_sr        <= write_sr(0)  & write_i;
47
48                case state is
49                        -- this state seems to lose 20ns of worthy time, but this is only true for single transmissions
50                        -- in case of continuous transmissions the W5300 datasheet demands min. 28ns time with CS high.
51                        -- this means min. 2 states @ a 50MHz clock.
52                        -- this is ensured by the IDLE state and a certain 'wait'-state and the end of each transmission.
53                        when IDLE =>
54                                if (read_sr = "01" ) then
55                                        data_signal <= (others => 'Z');
56                                        addr_sig <= addr_i;
57                                        wait_ctr <= wait_ctr + 1;
58                                        state <= READ_STATE;
59                                elsif (write_sr = "01" ) then
60                                        data_signal <= data_i; 
61                                        addr_sig <= addr_i;
62                                        wait_ctr <= wait_ctr + 1;
63                                        state <= WRITE_STATE;
64                                end if;
65                       
66                        when READ_STATE =>
67                                cs <= '0';
68                                wr <= '1';
69                                rd <= '0';
70                                wiz_addr <= addr_sig;
71                                wiz_data <= data_signal;
72                                wait_ctr <= wait_ctr + 1;
73                                state <= READ_WAIT;
74                               
75                        when WRITE_STATE =>
76                                cs <= '0';
77                                wr <= '0';
78                                rd <= '1';
79                                wiz_addr <= addr_sig;
80                                wiz_data <= data_signal;
81                                wait_ctr <= wait_ctr + 1;
82                                state <= WRITE_WAIT;
83
84                        -- actually WRITE ACCESS needs less time than READ access.
85                        -- but in order to make an easy timed interface to this entity possible
86                        -- I decided to wait exactly the same time.
87                        -- anyway after min. 42ns (i.e. 60ns in case of 50MHz) the read reasult may be synched in.
88                       
89                        when READ_WAIT =>
90                                if (wait_ctr = TIME_UNTIL_READ_READY - 1) then
91                                        wait_ctr = 0;
92                                        data_signal <= wiz_data;
93                                        state <= CLEANUP;
94                                end if;
95                                wait_ctr <= wait_ctr + 1;
96                               
97                        when WRITE_WAIT
98                                if (wait_ctr = TIME_UNTIL_WRITE_READY - 1) then
99                                        wait_ctr = 0;
100                                        state <= CLEANUP;
101                                end if;
102                                wait_ctr <= wait_ctr + 1;
103                       
104                        when CLEANUP =>
105                                cs <= '1';
106                                wr <= '1';
107                                rd <= '1';
108                                data_o <= data_sigal;
109                                wiz_addr <= (others => 'Z');
110                                wiz_data <= (others => 'Z');
111                                state <= IDLE;
112                               
113                        end case;
114                       
115        end if; -- rising_edge(clk)
116                                               
117end process main_process;
Note: See TracBrowser for help on using the repository browser.