Line 25... |
Line 25... |
wire [7:0] ip_data;
|
wire [7:0] ip_data;
|
reg [3:0] count, nxt_count;
|
reg [3:0] count, nxt_count;
|
|
|
reg [7:0] nxt_gmii_txd;
|
reg [7:0] nxt_gmii_txd;
|
reg nxt_gmii_tx_en;
|
reg nxt_gmii_tx_en;
|
reg [3:0] state, nxt_state;
|
reg [5:0] state, nxt_state;
|
|
|
localparam s_idle = 0, s_preamble = 1, s_payload = 2, s_ipg = 3;
|
wire [31:0] crc;
|
|
reg clear;
|
|
reg crc_valid;
|
|
|
|
localparam s_idle = 0, s_preamble = 1, s_payload = 2, s_ipg = 3, s_badcrc = 4, s_goodcrc = 5;
|
localparam ns_idle = 1, ns_preamble = 2, ns_payload = 4, ns_ipg = 8;
|
localparam ns_idle = 1, ns_preamble = 2, ns_payload = 4, ns_ipg = 8;
|
|
|
sd_input #(8+2) in_hold
|
sd_input #(8+2) in_hold
|
(
|
(
|
// Outputs
|
// Outputs
|
Line 43... |
Line 47... |
.reset (reset),
|
.reset (reset),
|
.c_srdy (txg_srdy),
|
.c_srdy (txg_srdy),
|
.c_data ({txg_code,txg_data}),
|
.c_data ({txg_code,txg_data}),
|
.ip_drdy (ip_drdy));
|
.ip_drdy (ip_drdy));
|
|
|
|
mac_crc32 crcgen
|
|
(
|
|
.data (ip_data[7:0]),
|
|
.valid (crc_valid),
|
|
/*AUTOINST*/
|
|
// Outputs
|
|
.crc (crc[31:0]),
|
|
// Inputs
|
|
.clk (clk),
|
|
.clear (clear));
|
|
|
always @*
|
always @*
|
begin
|
begin
|
ip_drdy = 0;
|
ip_drdy = 0;
|
nxt_count = count;
|
nxt_count = count;
|
nxt_gmii_tx_en = 0;
|
nxt_gmii_tx_en = 0;
|
nxt_gmii_txd = gmii_txd;
|
nxt_gmii_txd = gmii_txd;
|
|
clear = 0;
|
|
crc_valid = 0;
|
|
|
case (1'b1)
|
case (1'b1)
|
state[s_idle] :
|
state[s_idle] :
|
begin
|
begin
|
if (ip_srdy & (ip_code == `PCC_SOP))
|
if (ip_srdy & (ip_code == `PCC_SOP))
|
begin
|
begin
|
nxt_gmii_tx_en = 1;
|
nxt_gmii_tx_en = 1;
|
nxt_gmii_txd = `GMII_PRE;
|
nxt_gmii_txd = `GMII_PRE;
|
nxt_count = 1;
|
nxt_count = 1;
|
nxt_state = ns_preamble;
|
nxt_state = ns_preamble;
|
|
clear = 1;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
ip_drdy = 1;
|
ip_drdy = 1;
|
end // else: !if(ip_srdy & (ip_code == `PCC_SOP))
|
end // else: !if(ip_srdy & (ip_code == `PCC_SOP))
|
Line 84... |
Line 102... |
state[s_payload] :
|
state[s_payload] :
|
begin
|
begin
|
ip_drdy = 1;
|
ip_drdy = 1;
|
nxt_gmii_tx_en = 1;
|
nxt_gmii_tx_en = 1;
|
nxt_gmii_txd = ip_data;
|
nxt_gmii_txd = ip_data;
|
|
crc_valid = 1;
|
|
|
if (!ip_srdy | ((ip_code == `PCC_EOP) | (ip_code == `PCC_BADEOP)))
|
if (!ip_srdy | ((ip_code == `PCC_EOP) | (ip_code == `PCC_BADEOP)))
|
begin
|
begin
|
nxt_count = 0;
|
nxt_count = 0;
|
nxt_state = ns_ipg;
|
if (ip_code == `PCC_EOP)
|
|
nxt_state = 1 << s_goodcrc;
|
|
else
|
|
nxt_state = 1 << s_badcrc;
|
end
|
end
|
end // case: state[s_payload]
|
end // case: state[s_payload]
|
|
|
|
state[s_goodcrc] :
|
|
begin
|
|
nxt_count = count + 1;
|
|
nxt_gmii_tx_en = 1;
|
|
case (count)
|
|
0 : nxt_gmii_txd = crc[7:0];
|
|
1 : nxt_gmii_txd = crc[15:8];
|
|
2 : nxt_gmii_txd = crc[23:16];
|
|
3 : nxt_gmii_txd = crc[31:24];
|
|
endcase // case (count)
|
|
|
|
if (count == 3)
|
|
begin
|
|
nxt_state = 1 << s_ipg;
|
|
end
|
|
end
|
|
|
|
state[s_badcrc] :
|
|
begin
|
|
nxt_count = count + 1;
|
|
nxt_gmii_tx_en = 1;
|
|
nxt_gmii_txd = 8'h0;
|
|
|
|
if (count == 3)
|
|
begin
|
|
nxt_state = 1 << s_ipg;
|
|
end
|
|
end
|
|
|
state[s_ipg] :
|
state[s_ipg] :
|
begin
|
begin
|
nxt_gmii_tx_en = 0;
|
nxt_gmii_tx_en = 0;
|
ip_drdy = 0;
|
ip_drdy = 0;
|
nxt_count = count + 1;
|
nxt_count = count + 1;
|