OpenCores
URL https://opencores.org/ocsvn/srdydrdy_lib/srdydrdy_lib/trunk

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [examples/] [bridge/] [rtl/] [sd_rx_gigmac.v] - Blame information for rev 31

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 ghutchis
// mock-up of RX portion of gigabit ethernet MAC
2
// performs packet reception and creates internal
3
// packet codes, as well as checking CRC on incoming
4
// packets.
5
 
6
// incoming data is synchronous to "clk", which should
7
// be the GMII RX clock.  Output data is also synchronous
8
// to this clock, so needs to go through a sync FIFO.
9
 
10
// If output is not ready while receiving data,
11
// truncates the packet and makes it an error packet.
12
 
13
module sd_rx_gigmac
14
  (
15
   input        clk,
16
   input        reset,
17
   input        gmii_rx_dv,
18
   input [7:0]  gmii_rxd,
19
 
20
   output       rxg_srdy,
21
   input        rxg_drdy,
22
   output [1:0] rxg_code,
23 31 ghutchis
   output [7:0] rxg_data,
24
 
25
   input        cfg_check_crc
26 9 ghutchis
   );
27
 
28
  reg           rxdv1, rxdv2;
29
  reg [7:0]      rxd1, rxd2;
30 24 ghutchis
  reg [31:0]    pkt_crc;
31 9 ghutchis
  reg [3:0]      valid_bits, nxt_valid_bits;
32 24 ghutchis
  reg [31:0]    nxt_pkt_crc;
33 9 ghutchis
 
34 24 ghutchis
  reg [6:0]      state, nxt_state;
35 9 ghutchis
  reg           ic_srdy;
36
  wire          ic_drdy;
37
  reg [1:0]      ic_code;
38
  reg [7:0]      ic_data;
39 24 ghutchis
  wire [31:0]   crc;
40 9 ghutchis
 
41 24 ghutchis
  reg           crc_valid;
42
  reg           crc_clear;
43
 
44
  mac_crc32 crc_chk
45
    (
46
     .clear                             (crc_clear),
47
     .data                              (rxd2),
48
     .valid                             (crc_valid),
49 9 ghutchis
 
50 24 ghutchis
     /*AUTOINST*/
51
     // Outputs
52
     .crc                               (crc[31:0]),
53
     // Inputs
54
     .clk                               (clk));
55 9 ghutchis
 
56
  always @(posedge clk)
57
    begin
58
      if (reset)
59
        begin
60
          rxd1  <= #1 0;
61
          rxdv1 <= #1 0;
62
          rxd2  <= #1 0;
63
          rxdv2 <= #1 0;
64 24 ghutchis
          pkt_crc <= #1 0;
65 9 ghutchis
        end
66
      else
67
        begin
68
          rxd1  <= #1 gmii_rxd;
69
          rxdv1 <= #1 gmii_rx_dv;
70
          rxd2  <= #1 rxd1;
71
          rxdv2 <= #1 rxdv1;
72 24 ghutchis
          pkt_crc <= #1 nxt_pkt_crc;
73 9 ghutchis
        end
74
    end // always @ (posedge clk)
75
 
76 24 ghutchis
  localparam s_idle = 0, s_preamble = 1, s_sop = 2, s_payload = 3, s_trunc = 4, s_sink = 5, s_eop = 6;
77 9 ghutchis
  localparam ns_idle = 1, ns_preamble = 2, ns_sop = 4, ns_payload = 8, ns_trunc = 16, ns_sink = 32;
78
 
79
  always @*
80
    begin
81
      ic_srdy = 0;
82
      ic_code = `PCC_DATA;
83
      ic_data = 0;
84
      nxt_valid_bits = valid_bits;
85 24 ghutchis
      nxt_pkt_crc = pkt_crc;
86
      crc_valid = 0;
87
      crc_clear = 0;
88 9 ghutchis
 
89
      case (1'b1)
90
        state[s_idle] :
91
          begin
92 24 ghutchis
            crc_clear = 1;
93 9 ghutchis
            nxt_pkt_crc  = 0;
94
            nxt_valid_bits = 0;
95
            if (rxdv2 & (rxd2 == `GMII_SFD))
96
              begin
97
                nxt_state = ns_sop;
98
              end
99
            else if (rxdv2)
100
              begin
101
                nxt_state = ns_preamble;
102
              end
103
          end // case: state[s_idle]
104
 
105
        state[s_preamble]:
106
          begin
107
            if (!rxdv2)
108
              nxt_state = ns_idle;
109
            else if (rxd2 == `GMII_SFD)
110
              nxt_state = ns_sop;
111
          end
112
 
113
        state[s_sop] :
114
          begin
115
            if (!rxdv2)
116
              begin
117
                nxt_state = ns_idle;
118
              end
119
            else if (!ic_drdy)
120
              nxt_state = ns_sink;
121
            else
122
              begin
123
                ic_srdy = 1;
124
                ic_code = `PCC_SOP;
125
                ic_data = rxd2;
126 24 ghutchis
                crc_valid = 1;
127
                nxt_pkt_crc = { rxd2, pkt_crc[31:8] };
128 9 ghutchis
                nxt_state = ns_payload;
129
              end
130
          end // case: state[ns_payload]
131
 
132
        state[s_payload] :
133
          begin
134
            if (!ic_drdy)
135
              nxt_state = ns_trunc;
136
            else if (!rxdv1)
137
              begin
138 24 ghutchis
                //nxt_state = ns_idle;
139
                ic_srdy = 0;
140 9 ghutchis
                ic_data = rxd2;
141 24 ghutchis
                crc_valid = 1;
142
                nxt_pkt_crc = { rxd2, pkt_crc[31:8] };
143
                nxt_state = 1 << s_eop;
144 9 ghutchis
              end
145
            else
146
              begin
147
                ic_srdy = 1;
148
                ic_code = `PCC_DATA;
149
                ic_data = rxd2;
150 24 ghutchis
                crc_valid = 1;
151
                nxt_pkt_crc = { rxd2, pkt_crc[31:8] };
152 9 ghutchis
              end // else: !if(!rxdv1)
153
          end // case: state[ns_payload]
154
 
155 24 ghutchis
 
156
        state[s_eop] :
157
          begin
158
            ic_srdy =1;
159
            ic_data = pkt_crc[31:24];
160 31 ghutchis
            if ((pkt_crc == crc) | !cfg_check_crc)
161 24 ghutchis
              begin
162
                ic_code = `PCC_EOP;
163
              end
164
            else
165
              ic_code = `PCC_BADEOP;
166
 
167
            if (ic_drdy)
168
              nxt_state = 1 << s_idle;
169
          end
170
 
171 9 ghutchis
        state[s_trunc] :
172
          begin
173
            ic_srdy = 1;
174
            ic_code = `PCC_BADEOP;
175
            ic_data = 0;
176
            if (ic_drdy)
177
              nxt_state = ns_sink;
178
          end
179
 
180
        state[s_sink] :
181
          begin
182
            if (!rxdv2)
183
              nxt_state = ns_idle;
184
          end
185
 
186
        default : nxt_state = ns_idle;
187
      endcase // case (1'b1)    
188
    end // always @ *
189
 
190
  always @(posedge clk)
191
    begin
192
      if (reset)
193
        begin
194
          state <= #1 1;
195
          /*AUTORESET*/
196 24 ghutchis
          // Beginning of autoreset for uninitialized flops
197
          pkt_crc <= 32'h0;
198
          valid_bits <= 4'h0;
199
          // End of automatics
200 9 ghutchis
        end
201
      else
202
        begin
203
          pkt_crc  <= #1 nxt_pkt_crc;
204
          state    <= #1 nxt_state;
205
          valid_bits <= #1 nxt_valid_bits;
206
        end // else: !if(reset)
207
    end // always @ (posedge clk)
208
 
209
  sd_output #(8+2) out_hold
210
    (.clk (clk), .reset (reset),
211
     .ic_srdy (ic_srdy),
212
     .ic_drdy (ic_drdy),
213
     .ic_data ({ic_code,ic_data}),
214
     .p_srdy  (rxg_srdy),
215
     .p_drdy  (rxg_drdy),
216
     .p_data  ({rxg_code, rxg_data}));
217
 
218
endmodule // sd_rx_gigmac

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.