-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathudp_rxram_mux.vhd
174 lines (164 loc) · 4.48 KB
/
udp_rxram_mux.vhd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
-- Multiplex into transport dual-port RAM/interface
--
-- Dave Sankey, July 2012
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity udp_rxram_mux is
port (
mac_clk: in std_logic;
rx_reset: in std_logic;
--
rarp_mode: in std_logic;
rarp_addr: in std_logic_vector(12 downto 0);
rarp_data: in std_logic_vector(7 downto 0);
rarp_end_addr: in std_logic_vector(12 downto 0);
rarp_send: in std_logic;
rarp_we: in std_logic;
--
pkt_drop_arp: in std_logic;
arp_data: in std_logic_vector(7 downto 0);
arp_addr: in std_logic_vector(12 downto 0);
arp_we: in std_logic;
arp_end_addr: in std_logic_vector(12 downto 0);
arp_send: in std_logic;
--
pkt_drop_ping: in std_logic;
ping_data: in std_logic_vector(7 downto 0);
ping_addr: in std_logic_vector(12 downto 0);
ping_we: in std_logic;
ping_end_addr: in std_logic_vector(12 downto 0);
ping_send: in std_logic;
--
pkt_drop_status: in std_logic;
status_data: in std_logic_vector(7 downto 0);
status_addr: in std_logic_vector(12 downto 0);
status_we: in std_logic;
status_end_addr: in std_logic_vector(12 downto 0);
status_send: in std_logic;
--
mac_rx_valid: in std_logic;
rxram_busy: in std_logic;
--
dia: out std_logic_vector(7 downto 0);
addra: out std_logic_vector(12 downto 0);
wea: out std_logic;
rxram_end_addr: out std_logic_vector(12 downto 0);
rxram_send: out std_logic;
rxram_dropped: out std_logic
);
end udp_rxram_mux;
architecture rtl of udp_rxram_mux is
signal ram_ready, rxram_send_sig: std_logic;
begin
rxram_send <= rxram_send_sig and ram_ready;
do_ram_ready: process(mac_clk)
variable ram_ready_int, rxram_dropped_int: std_logic;
begin
if rising_edge(mac_clk) then
if rx_reset = '1' or rarp_mode = '1' then
ram_ready_int := '1';
elsif mac_rx_valid = '1' and rxram_busy = '1' then
ram_ready_int := '0';
end if;
if rxram_send_sig = '1' and ram_ready_int = '0' then
rxram_dropped_int := '1';
else
rxram_dropped_int := '0';
end if;
ram_ready <= ram_ready_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
rxram_dropped <= rxram_dropped_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
end if;
end process;
send_packet: process(mac_clk)
variable rxram_end_addr_int: std_logic_vector(12 downto 0);
variable rxram_send_int: std_logic;
begin
if rising_edge(mac_clk) then
if rarp_send = '1' then
rxram_end_addr_int := rarp_end_addr;
rxram_send_int := '1';
elsif arp_send = '1' then
rxram_end_addr_int := arp_end_addr;
rxram_send_int := '1';
elsif ping_send = '1' then
rxram_end_addr_int := ping_end_addr;
rxram_send_int := '1';
elsif status_send = '1' then
rxram_end_addr_int := status_end_addr;
rxram_send_int := '1';
else
rxram_end_addr_int := (Others => '0');
rxram_send_int := '0';
end if;
rxram_end_addr <= rxram_end_addr_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
rxram_send_sig <= rxram_send_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
end if;
end process;
build_packet: process(mac_clk)
variable dia_int: std_logic_vector(7 downto 0);
variable addra_int: std_logic_vector(12 downto 0);
variable wea_int: std_logic;
begin
if rising_edge(mac_clk) then
if ram_ready = '1' then
if rarp_mode = '1' then
dia_int := rarp_data;
addra_int := rarp_addr;
wea_int := rarp_we;
elsif pkt_drop_arp = '0' then
dia_int := arp_data;
addra_int := arp_addr;
wea_int := arp_we;
elsif pkt_drop_ping = '0' then
dia_int := ping_data;
addra_int := ping_addr;
wea_int := ping_we;
elsif pkt_drop_status = '0' then
dia_int := status_data;
addra_int := status_addr;
wea_int := status_we;
else
dia_int := (Others => '0');
addra_int := (Others => '0');
wea_int := '0';
end if;
else
dia_int := (Others => '0');
addra_int := (Others => '0');
wea_int := '0';
end if;
dia <= dia_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
addra <= addra_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
wea <= wea_int
-- pragma translate_off
after 4 ns
-- pragma translate_on
;
end if;
end process;
end rtl;