Module ip_mac_tx_dsplit_g

MEM_ADDRpi_resetlogicpi_g_clocklogicpi_f_clocklogicpi_data[31:0]logicpi_soplogicpi_eoplogicpi_errlogicpi_padlogicpi_crclogicpi_byte[1:0]logicpi_wr_addr[MEM_ADDR:0]logicpi_half_duplexlogicpi_fc_acklogicpi_data_acklogicpi_fc_data[31:0]logicpi_fc_readylogicpi_fc_tx_offlogicpi_fc_soplogicpi_fc_eoplogicpi_readlogicpi_removelogicpi_reloadlogicpi_updatelogicpi_en_highlogicpo_en_clockregpo_fc_addrreg[2:0]po_rd_ptrlogic[MEM_ADDR-1:0]po_rd_addrreg[MEM_ADDR:0]po_fc_reqregpo_data_reqregpo_datareg[7:0]po_sopregpo_eopregpo_errregpo_padregpo_crcregpo_validreg

Block Diagram of ip_mac_tx_dsplit_g

Parameters

Name

Default value

Description

MEM_ADDR

6

Transmit memory address width (9 -> 512 locations, 10->1024)

Ports

Name

Direction

Type

Description

pi_reset

input

wire logic

Global Software/Hardware Reset (transmit clock domain)

pi_g_clock

input

wire logic

Transmit GMII/MII 125/25/2.5 MHz clock (from Clock Manager, gated clock)

pi_f_clock

input

wire logic

Transmit GMII/MII 125/25/2.5 MHz clock (from Clock Manager, free clock)

po_en_clock

output

var reg

Transmit GMII/MII 125/25/2.5 MHz clock gated clock enable

pi_data

input

wire logic[31:0]

Signals comming in from the data FIFO related to data transfer FIFO Data bus (frame data 32-bit word)

pi_sop

input

wire logic

Start of data frame indication

pi_eop

input

wire logic

End of data frame indication

pi_err

input

wire logic

Error frame indication

pi_pad

input

wire logic

Pad append command, valid only when end of frame (When padding enable

pi_crc

input

wire logic

and frame has less than 64 bytes the CRC is appended regardless of the CRC append setting CRC append command, valid only when end of frame

pi_byte

input

wire logic[1:0]

Byte enable information

pi_wr_addr

input

wire logic[MEM_ADDR:0]

Read & Write pointers TX FIFO write address information (used by tx state to determine the

po_fc_addr

output

var reg[2:0]

FIFO condition full/empty/ready) Flow control read address

pi_half_duplex

input

wire logic

Half duplex flow control enable Half duplex operating mode

po_rd_ptr

output

wire logic[MEM_ADDR-1:0]

Output Signals to buffer manager related to data transfer Memory read address

po_rd_addr

output

var reg[MEM_ADDR:0]

Used by TX FIFO to compute the memory state (full/empty/ready)

po_fc_req

output

var reg

Request & Acknowledge Flow control frame transmit request

po_data_req

output

var reg

Data frame transmit request

pi_fc_ack

input

wire logic

Flow control frame transmit acknowledge

pi_data_ack

input

wire logic

Data frame transmit acknowledge

pi_fc_data

input

wire logic[31:0]

Flow control generator interface Flow control frame data

pi_fc_ready

input

wire logic

New flow control frame ready

pi_fc_tx_off

input

wire logic

Flow control (pause frame was received, stop transmit command)

pi_fc_sop

input

wire logic

Flow control frame end

pi_fc_eop

input

wire logic

Flow control frame start

pi_read

input

wire logic

Read next data

pi_remove

input

wire logic

Remove current frame (drop frame)

pi_reload

input

wire logic

Reload current frame (retransmit)

pi_update

input

wire logic

Update read pointers (collision window out)

pi_en_high

input

wire logic

Enable High (MSB)

po_data

output

var reg[7:0]

Signals comming in from the data FIFO related to data transfer Output 8-bit data

po_sop

output

var reg

Start of data frame indication

po_eop

output

var reg

End of data frame indication

po_err

output

var reg

Error frame indication

po_pad

output

var reg

Pad append command, valid only when end of frame (When padding enable

po_crc

output

var reg

and frame has less than 64 bytes the CRC is appended regardless of the CRC append setting CRC append command, valid only when end of frame

po_valid

output

var reg

Valid output data

Always Blocks

always @ ( posedge pi_g_clock or negedge pi_reset )

`DATA_DROP `DATA_DROP = 3'h2 `FC_READ `FC_READ = 3'h4 `SPLIT_IDLE `SPLIT_IDLE = 3'h0 `SPLIT_WAIT `SPLIT_WAIT = 3'h3 `DATA_READ `DATA_READ = 3'h1 1 [(!(~ pi_reset) && (pi_fc_ack == 1'b1))] 3 [(!(~ pi_reset) && !(pi_fc_ack == 1'b1) && !(reload_frame == 1'b1) && !(valid_data == 1'b1 && pi_sop == 1'b0 || unlock_sop == 1'b0) && (valid_data == 1'b1 && pi_sop == 1'b1 && unlock_sop == 1'b1))] 2 [(!(~ pi_reset) && !(pi_fc_ack == 1'b1) && (reload_frame == 1'b1)), (!(~ pi_reset) && !(pi_fc_ack == 1'b1) && !(reload_frame == 1'b1) && (valid_data == 1'b1 && pi_sop == 1'b0 || unlock_sop == 1'b0))] 4 [(!(~ pi_reset) && (remove_frame == 1'b1)), (!(~ pi_reset) && !(remove_frame == 1'b1) && (reload_frame == 1'b1)), (!(~ pi_reset) && !(remove_frame == 1'b1) && !(reload_frame == 1'b1) && (po_eop == 1'b1 && pi_read == 1'b1))] 7 [(!(~ pi_reset) && !(reload_frame == 1'b1) && (pi_fc_ack == 1'b1))] 8 [(!(~ pi_reset) && !(reload_frame == 1'b1) && !(pi_fc_ack == 1'b1) && (pi_data_ack == 1'b1))] 6 [(!(~ pi_reset) && (reload_frame == 1'b1))] 5 [(!(~ pi_reset) && !(reload_frame == 1'b1))] 9 [(!(~ pi_reset) && (remove_frame == 1'b1)), (!(~ pi_reset) && !(remove_frame == 1'b1) && (reload_frame == 1'b1)), (!(~ pi_reset) && !(remove_frame == 1'b1) && !(reload_frame == 1'b1) && (po_eop == 1'b1 && valid_data == 1'b1 && pi_read == 1'b1)), (!(~ pi_reset) && !(remove_frame == 1'b1) && !(reload_frame == 1'b1) && !(po_eop == 1'b1 && valid_data == 1'b1 && pi_read == 1'b1) && !(split_cnt == 2'd0 && valid_data == 1'b1 && pi_read == 1'b1) && (po_eop == 1'b1 && valid_data == 1'b0 && pi_read == 1'b1))]
FSM Transitions for split_state

#

Current State

Next State

Condition

1

`DATA_DROP

`FC_READ

[(!(~ pi_reset) && (pi_fc_ack == 1’b1))]

2

`DATA_DROP

`SPLIT_WAIT

[(!(~ pi_reset) && !(pi_fc_ack == 1’b1) && (reload_frame == 1’b1)), (!(~ pi_reset) && !(pi_fc_ack == 1’b1) && !(reload_frame == 1’b1) && (valid_data == 1’b1 && pi_sop == 1’b0 || unlock_sop == 1’b0))]

3

`DATA_DROP

`SPLIT_IDLE

[(!(~ pi_reset) && !(pi_fc_ack == 1’b1) && !(reload_frame == 1’b1) && !(valid_data == 1’b1 && pi_sop == 1’b0 || unlock_sop == 1’b0) && (valid_data == 1’b1 && pi_sop == 1’b1 && unlock_sop == 1’b1))]

4

`FC_READ

`DATA_DROP

[(!(~ pi_reset) && (remove_frame == 1’b1)), (!(~ pi_reset) && !(remove_frame == 1’b1) && (reload_frame == 1’b1)), (!(~ pi_reset) && !(remove_frame == 1’b1) && !(reload_frame == 1’b1) && (po_eop == 1’b1 && pi_read == 1’b1))]

5

`SPLIT_WAIT

`DATA_DROP

[(!(~ pi_reset) && !(reload_frame == 1’b1))]

6

`SPLIT_IDLE

`SPLIT_WAIT

[(!(~ pi_reset) && (reload_frame == 1’b1))]

7

`SPLIT_IDLE

`FC_READ

[(!(~ pi_reset) && !(reload_frame == 1’b1) && (pi_fc_ack == 1’b1))]

8

`SPLIT_IDLE

`DATA_READ

[(!(~ pi_reset) && !(reload_frame == 1’b1) && !(pi_fc_ack == 1’b1) && (pi_data_ack == 1’b1))]

9

`DATA_READ

`SPLIT_WAIT

[(!(~ pi_reset) && (remove_frame == 1’b1)), (!(~ pi_reset) && !(remove_frame == 1’b1) && (reload_frame == 1’b1)), (!(~ pi_reset) && !(remove_frame == 1’b1) && !(reload_frame == 1’b1) && (po_eop == 1’b1 && valid_data == 1’b1 && pi_read == 1’b1)), (!(~ pi_reset) && !(remove_frame == 1’b1) && !(reload_frame == 1’b1) && !(po_eop == 1’b1 && valid_data == 1’b1 && pi_read == 1’b1) && !(split_cnt == 2’d0 && valid_data == 1’b1 && pi_read == 1’b1) && (po_eop == 1’b1 && valid_data == 1’b0 && pi_read == 1’b1))]

Instances