1 |
4 |
fisher5090 |
`timescale 1ns / 1ps
|
2 |
|
|
////////////////////////////////////////////////////////////////////////////////
|
3 |
|
|
// Company:
|
4 |
|
|
// Engineer:
|
5 |
|
|
//
|
6 |
|
|
// Create Date: 16:35:47 11/21/05
|
7 |
|
|
// Design Name:
|
8 |
|
|
// Module Name: rxReceiveEngine
|
9 |
|
|
// Project Name:
|
10 |
|
|
// Target Device:
|
11 |
|
|
// Tool versions:
|
12 |
|
|
// Description:
|
13 |
|
|
//
|
14 |
|
|
// Dependencies:
|
15 |
|
|
//
|
16 |
|
|
// Revision:
|
17 |
|
|
// Revision 0.01 - File Created
|
18 |
|
|
// Additional Comments:
|
19 |
|
|
//
|
20 |
|
|
////////////////////////////////////////////////////////////////////////////////
|
21 |
|
|
module rxReceiveEngine(rxclk_in, reset_in, rxd64, rxc8, rxStatRegPlus,reset_out,
|
22 |
|
|
cfgRxRegData, rx_data, rx_data_valid, rx_good_frame, link_fault,
|
23 |
|
|
rx_bad_frame, rxCfgofRS, rxTxLinkFaul);
|
24 |
|
|
input rxclk_in;
|
25 |
|
|
input reset_in;
|
26 |
|
|
input [63:0] rxd64;
|
27 |
|
|
input [7:0] rxc8;
|
28 |
|
|
output reset_out;
|
29 |
|
|
output [12:0] rxStatRegPlus;
|
30 |
|
|
input [52:0] cfgRxRegData;
|
31 |
|
|
output [63:0] rx_data;
|
32 |
|
|
output [7:0] rx_data_valid;
|
33 |
|
|
output rx_good_frame;
|
34 |
|
|
output rx_bad_frame;
|
35 |
|
|
input [1:0] link_fault;
|
36 |
|
|
output[2:0] rxCfgofRS;
|
37 |
|
|
output [1:0] rxTxLinkFaul;
|
38 |
|
|
|
39 |
|
|
wire rxclk;
|
40 |
|
|
wire rxclk_180;
|
41 |
|
|
wire rxclk_2x;
|
42 |
|
|
wire locked;
|
43 |
|
|
wire reset_dcm;
|
44 |
|
|
wire reset;
|
45 |
|
|
|
46 |
|
|
wire [47:0]MAC_Addr; //MAC Address used in receiving control frame.
|
47 |
|
|
wire vlan_enable; //VLAN Enable
|
48 |
|
|
wire recv_enable; //Receiver Enable
|
49 |
|
|
wire inband_fcs; //In-band FCS Enable, when this bit is '1', the MAC will pass FCS up to client
|
50 |
|
|
wire jumbo_enable;//Jumbo Frame Enable
|
51 |
|
|
wire recv_rst; //Receiver reset
|
52 |
|
|
|
53 |
|
|
wire start_da, start_lt;
|
54 |
|
|
wire tagged_frame, small_frame;
|
55 |
|
|
wire [15:0] tagged_len;
|
56 |
|
|
wire end_data_cnt, end_small_cnt, end_tagged_cnt, end_fcs;
|
57 |
|
|
wire pause_frame;
|
58 |
|
|
wire [47:0] da_addr;
|
59 |
|
|
wire [15:0] lt_data;
|
60 |
|
|
wire [31:0] crc_code;
|
61 |
|
|
wire [7:0] crc_valid;
|
62 |
|
|
wire [7:0] rxc_fifo;
|
63 |
|
|
wire length_error;
|
64 |
|
|
wire get_sfd, get_efd, get_error_code;
|
65 |
|
|
wire receiving;
|
66 |
|
|
wire receiving_frame;
|
67 |
|
|
|
68 |
|
|
wire local_invalid;
|
69 |
|
|
wire broad_valid;
|
70 |
|
|
wire multi_valid;
|
71 |
|
|
|
72 |
|
|
|
73 |
|
|
wire len_invalid;
|
74 |
|
|
wire [12:0] integer_cnt, small_integer_cnt;
|
75 |
|
|
wire [2:0] bits_more, small_bits_more;
|
76 |
|
|
wire good_frame_get, bad_frame_get;
|
77 |
|
|
|
78 |
|
|
wire crc_check_valid=0;
|
79 |
|
|
wire crc_check_invalid=0;
|
80 |
|
|
|
81 |
|
|
|
82 |
|
|
//////////////////////////////////////////
|
83 |
|
|
// Read Receiver Configuration Word
|
84 |
|
|
//////////////////////////////////////////
|
85 |
|
|
|
86 |
|
|
assign MAC_Addr = {cfgRxRegData[52:37], cfgRxRegData[31:0]};
|
87 |
|
|
assign vlan_enable = cfgRxRegData[36];
|
88 |
|
|
assign recv_enable = cfgRxRegData[35];
|
89 |
|
|
assign inband_fcs = cfgRxRegData[34];
|
90 |
|
|
assign jumbo_enable = cfgRxRegData[33];
|
91 |
|
|
assign recv_rst = cfgRxRegData[32];
|
92 |
|
|
assign reset_dcm = reset_in | recv_rst;
|
93 |
|
|
assign reset = ~locked;
|
94 |
|
|
assign reset_out = reset;
|
95 |
|
|
|
96 |
|
|
/////////////////////////////////////////
|
97 |
|
|
// Write Configuration Words of RS
|
98 |
|
|
/////////////////////////////////////////
|
99 |
|
|
|
100 |
|
|
assign rxCfgofRS[0] = ~link_fault[0] & link_fault[1]; //get local fault
|
101 |
|
|
assign rxCfgofRS[1] = link_fault[0] & link_fault[1]; //get remote fault
|
102 |
|
|
assign rxCfgofRS[2] = locked; //Receive DCM locked
|
103 |
|
|
|
104 |
|
|
////////////////////////////////////////
|
105 |
|
|
// Receive Clock Generator
|
106 |
|
|
////////////////////////////////////////
|
107 |
|
|
|
108 |
|
|
rxClkgen rxclk_gen(.rxclk_in(rxclk_in),
|
109 |
|
|
.reset(reset_dcm),
|
110 |
|
|
.rxclk(rxclk),
|
111 |
|
|
.rxclk_180(rxclk_180),
|
112 |
|
|
.rxclk_2x(rxclk_2x),
|
113 |
|
|
.locked(locked)
|
114 |
|
|
);
|
115 |
|
|
|
116 |
|
|
///////////////////////////////////////
|
117 |
|
|
// Upper Interface with client
|
118 |
|
|
///////////////////////////////////////
|
119 |
|
|
|
120 |
|
|
rxFIFOMgnt upperinterface(.rxclk_180(rxclk_180), .reset(reset), .rxd64(rxd64), .rxc_fifo(rxc_fifo), .receiving(receiving),
|
121 |
|
|
.recv_end(recv_end), .rx_data_valid(rx_data_valid), .inband_fcs(inband_fcs),
|
122 |
|
|
.rx_data(rx_data));
|
123 |
|
|
|
124 |
|
|
///////////////////////////////////////
|
125 |
|
|
// Reception Frame Spliter
|
126 |
|
|
///////////////////////////////////////
|
127 |
|
|
|
128 |
|
|
rxFrameDepart frame_spliter(.rxclk(rxclk), .reset(reset), .rxclk_180(rxclk_180), .rxd64(rxd64), .rxc8(rxc8),.inband_fcs(inband_fcs),
|
129 |
|
|
.start_da(start_da), .start_lt(start_lt), .tagged_frame(tagged_frame),.bits_more(bits_more),
|
130 |
|
|
.small_bits_more(small_bits_more), .tagged_len(tagged_len), .small_frame(small_frame),
|
131 |
|
|
.end_data_cnt(end_data_cnt), .end_small_cnt(end_small_cnt),.da_addr(da_addr),.lt_data(lt_data),
|
132 |
|
|
.crc_code(crc_code),.end_fcs(end_fcs), .crc_valid(crc_valid), .length_error(length_error),
|
133 |
|
|
.get_sfd(get_sfd), .get_efd(get_efd), .get_error_code(get_error_code),.receiving(receiving),
|
134 |
|
|
.rxc_fifo(rxc_fifo),.receiving_frame(receiving_frame)
|
135 |
|
|
);
|
136 |
|
|
|
137 |
|
|
//////////////////////////////////////
|
138 |
|
|
// Destination Address Checker
|
139 |
|
|
//////////////////////////////////////
|
140 |
|
|
|
141 |
|
|
rxDAchecker dachecker(.local_invalid(local_invalid), .broad_valid(broad_valid), .multi_valid(multi_valid), .MAC_Addr(MAC_Addr),
|
142 |
|
|
.da_addr(da_addr));
|
143 |
|
|
defparam dachecker.Multicast = 48'h0180C2000001;
|
144 |
|
|
defparam dachecker.Broadcast = 48'hffffffffffff;
|
145 |
|
|
|
146 |
|
|
/////////////////////////////////////
|
147 |
|
|
// Length/Type field checker
|
148 |
|
|
/////////////////////////////////////
|
149 |
|
|
|
150 |
|
|
rxLenTypChecker lenchecker(.lt_data(lt_data), .tagged_len(tagged_len), .jumbo_enable(jumbo_enable), .tagged_frame(tagged_frame),
|
151 |
|
|
.pause_frame(pause_frame), .small_frame(small_frame), .len_invalid(len_invalid), .vlan_enable(vlan_enable),
|
152 |
|
|
.integer_cnt(integer_cnt), .small_integer_cnt(small_integer_cnt), .inband_fcs(inband_fcs),
|
153 |
|
|
.bits_more(bits_more), .small_bits_more(small_bits_more)
|
154 |
|
|
);
|
155 |
|
|
|
156 |
|
|
/////////////////////////////////////
|
157 |
|
|
// Counters used in Receive Engine
|
158 |
|
|
/////////////////////////////////////
|
159 |
|
|
|
160 |
|
|
rxNumCounter counters(.rxclk(rxclk), .reset(reset), .start_data_cnt(start_data_cnt), .start_tagged_cnt(start_tagged_cnt), .small_frame(small_frame),
|
161 |
|
|
.integer_cnt(integer_cnt), .small_integer_cnt(small_integer_cnt), .tagged_frame(tagged_frame),
|
162 |
|
|
.end_data_cnt(end_data_cnt), .end_small_cnt(end_small_cnt), .end_tagged_cnt(end_tagged_cnt)
|
163 |
|
|
);
|
164 |
|
|
|
165 |
|
|
/////////////////////////////////////
|
166 |
|
|
// State Machine in Receive Process
|
167 |
|
|
/////////////////////////////////////
|
168 |
|
|
|
169 |
|
|
rxStateMachine statemachine(.rxclk(rxclk), .reset(reset), .recv_enable(recv_enable), .get_sfd(get_sfd), .local_invalid(local_invalid), .len_invalid(len_invalid),
|
170 |
|
|
.end_data_cnt(end_data_cnt), .end_tagged_cnt(end_tagged_cnt), .tagged_frame(tagged_frame),
|
171 |
|
|
.length_error(length_error), .end_fcs(end_fcs), .crc_check_valid(crc_check_valid), .get_error_code(get_error_code),
|
172 |
|
|
.crc_check_invalid(crc_check_invalid), .start_da(start_da), .start_lt(start_lt), .inband_fcs(inband_fcs),
|
173 |
|
|
.start_data_cnt(start_data_cnt), .start_tagged_cnt(start_tagged_cnt), .receiving(receiving),
|
174 |
|
|
.recv_end(recv_end), .good_frame_get(good_frame_get), .bad_frame_get(bad_frame_get), .small_frame(small_frame),
|
175 |
|
|
.end_small_cnt(end_small_cnt),.receiving_frame(receiving_frame)
|
176 |
|
|
);
|
177 |
|
|
assign rx_good_frame = good_frame_get;
|
178 |
|
|
assign rx_bad_frame = bad_frame_get;
|
179 |
|
|
|
180 |
|
|
endmodule
|