⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transmittop.v

📁 ethmac10g_latest.tar.gz源代码
💻 V
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////////////////////////////////		Name of module //              23/1/06 - So far Mentor Precision indicates the current system runs as 101 MHz.///////////////////////////////////////////////////////////////////////////////module TRANSMIT_TOP(TX_DATA, TX_DATA_VALID, TX_CLK, RESET, TX_START, TX_ACK, TX_UNDERRUN, TX_IFG_DELAY,RXTXLINKFAULT, LOCALLINKFAULT,TX_STATS_VALID,TXSTATREGPLUS,TXD, TXC, FC_TRANS_PAUSEDATA, FC_TRANS_PAUSEVAL, FC_TX_PAUSEDATA,FC_TX_PAUSEVALID,TX_CFG_REG_VALUE,TX_CFG_REG_VALID);/////////////////////////////////////////////////////////////////////////////////		Input and output ports definitions/////////////////////////////////////////////////////////////////////////////////Input from user logicinput [63:0] TX_DATA;input [7:0] TX_DATA_VALID; // To accept the data valid to be availableinput TX_CLK;input RESET;input TX_START; // This signify the first frame of datainput TX_UNDERRUN; // this will cause an error to be injected into the datainput [7:0] TX_IFG_DELAY; // this will cause a delay in the ack signal//input to transmit fault signalsinput RXTXLINKFAULT;input LOCALLINKFAULT;input [31:0] TX_CFG_REG_VALUE;input TX_CFG_REG_VALID;//output to stat registeroutput TX_STATS_VALID;output [24:0] TXSTATREGPLUS; // a pulse for each reg for stats//output to user logicoutput TX_ACK; //Generated by a counter//output to XGMIIoutput [63:0] TXD;output [7:0] TXC;//output [15:0] BYTE_COUNTER_OUT;//Pause inputs//Transmit pause framesinput [15:0] FC_TRANS_PAUSEDATA; //pause frame datainput FC_TRANS_PAUSEVAL; //pulse signal to indicate a pause frame to be sent//apply pause timinginput [15:0] FC_TX_PAUSEDATA;input FC_TX_PAUSEVALID;/////////////////////////////////////////////////////////////////////////////////		Definitions and parameters/////////////////////////////////////////////////////////////////////////////////possibility to put this in a package.//opcode definitionsparameter PAUSE_OPCODE = 16'b1000100000001000; //8808parameter  VLAN_OPCODE = 16'b1000000100000000; //8100//frame size definitionsparameter VLAN_FRAME_SIZE = 16'b0000010111110010;//1522 bytesparameter JUMBO_FRAME_SIZE = 16'b0010001100101000;//9000 bytesparameter NORMAL_FRAME_SIZE = 16'b0000010111101110;//1518 bytesparameter MIN_FRAME_SIZE = 16'b0000000000111100; //60 bytes//Frame definitionparameter IDLE_FRAME = 8'b00000111; //only six preambles as the first preamble is converted into a start flagparameter IDLE_FRAME_8BYTES = 64'b0000011100000111000001110000011100000111000001110000011100000111;parameter START_SEQ = 64'b1010101110101010101010101010101010101010101010101010101011111011;parameter LOCAL_FAULT_SEQ = 64'b0000000100000000000000000000000000000001000000000000000000000000;parameter REMOTE_FAULT_SEQ = 64'b0000001000000000000000000000000000000010000000000000000000000000;parameter START_FRAME = 8'b11111011; //only valid in frame 0parameter TERMINATE_FRAME = 8'b11111101;parameter SFD_FRAME = 8'b10101011;parameter PREAMBLE_FRAME = 8'b10101010;parameter ERROR_FRAME = 8'b11111110;parameter SOURCE_ADDR = 48'h010101010101;parameter DEST_ADDR = 48'h101010101010;parameter PAUSE_FRAME_LENGTH = 8'h02;//need a parameter for min frame gap.//Link fault signalling// send lane 0/////////////////////////////////////////////////////////////////////////////////		Registers and wires///////////////////////////////////////////////////////////////////////////////wire  TX_ACK;reg  [24:0] TXSTATREGPLUS;reg  TX_STATS_VALID;reg FRAME_START;wire reset_int;reg [15:0] DELAY_ACK;reg [7:0] TX_DATA_VALID_REG;reg [7:0] TX_DATA_VALID_DEL1;reg [7:0] TX_DATA_VALID_DEL2;reg [7:0] TX_DATA_VALID_DEL3;reg [7:0] TX_DATA_VALID_DEL4;reg [7:0] TX_DATA_VALID_DEL5;reg [7:0] TX_DATA_VALID_DEL6;reg [7:0] TX_DATA_VALID_DEL7;reg [7:0] TX_DATA_VALID_DEL8;reg [7:0] TX_DATA_VALID_DEL9;reg [7:0] TX_DATA_VALID_DEL10;reg [7:0] TX_DATA_VALID_DEL11;reg [7:0] TX_DATA_VALID_DEL12;reg [7:0] TX_DATA_VALID_DEL13;reg [7:0] TX_DATA_VALID_DEL14;reg [7:0] TX_DATA_VALID_DEL15;reg [63:0] TX_DATA_DEL1;reg [63:0] TX_DATA_DEL2;reg [63:0] TX_DATA_DEL3;reg [63:0] TX_DATA_DEL4;reg [63:0] TX_DATA_DEL5;reg [63:0] TX_DATA_DEL6;reg [63:0] TX_DATA_DEL7;reg [63:0] TX_DATA_DEL8;reg [63:0] TX_DATA_DEL9;reg [63:0] TX_DATA_DEL10;reg [63:0] TX_DATA_DEL11;reg [63:0] TX_DATA_DEL12;reg [63:0] TX_DATA_DEL13;reg [63:0] TX_DATA_DEL14;reg [63:0] TX_DATA_DEL15;reg [7:0] OVERFLOW_VALID;reg [63:0] OVERFLOW_DATA;reg [63:0] TXD;reg [7:0] TXC;reg [63:0] TX_DATA_REG, TX_DATA_VALID_DELAY;wire [31:0] CRC_32_64;wire [15:0] BYTE_COUNTER;reg frame_start_del;reg transmit_pause_frame_del, transmit_pause_frame_del2, transmit_pause_frame, append_start_pause, append_start_pause_del , transmit_pause_frame_valid, reset_err_pause, load_CRC8, transmit_pause_frame_del3;reg [7:0] tx_data_int;reg start_CRC8, START_CRC8_DEL;reg append_end_frame;reg insert_error;reg [7:0] store_tx_data_valid;reg [63:0] store_tx_data;reg [31:0] store_CRC64;reg [7:0] store_valid;reg load_final_CRC;reg [15:0] final_byte_count, byte_count_reg;wire [31:0] CRC_OUT;reg [9:0] append_reg;reg [15:0] length_register;reg tx_undderrun_int;reg [15:0] MAX_FRAME_SIZE;reg vlan_enabled_int;reg jumbo_enabled_int;reg tx_enabled_int;reg fcs_enabled_int;reg reset_tx_int;reg read_ifg_int;reg apply_pause_delay;reg [15:0] store_pause_frame;reg [63:0] TXD_PAUSE_DEL0;reg [63:0] TXD_PAUSE_DEL1;reg [63:0] TXD_PAUSE_DEL2;reg [7:0] TXC_PAUSE_DEL0;reg [7:0] TXC_PAUSE_DEL1;reg [7:0] TXC_PAUSE_DEL2;reg PAUSEVAL_DEL;reg PAUSEVAL_DEL1;reg PAUSEVAL_DEL2;wire RESET_ERR_PAUSE;reg set_pause_stats;reg [15:0] store_transmit_pause_value;reg [3:0] pause_frame_counter;reg [63:0] shift_pause_data;reg [7:0] shift_pause_valid;reg [7:0] shift_pause_valid_del;reg [14:0] byte_count_stat;reg [24:0] txstatplus_int;/////////////////////////////////////////////////////////////////////////////////		Start of code/////////////////////////////////////////////////////////////////////////////////TODO//RX side. need to be able to receive data and calculate the CRC switching between 64 and 8 bit datapath.//Therefore, the data need to be counted correctly.//ERROR checking module or process will be needed. This will check if frame is correct length.//Need to be able to remove redundant frames or columns and also padding. The error module will//also check the tx_underrun signal as well.//need to be able to cut-off bytes. //Need to add the link fault signalling and config registers.//TX side. need to be able to insert the CRC with the data.//need to define the first column of txd which is START 6 PRE and SFD.//need to be able invert data_valid for txc.//need to be able to transmit IDLEs.//Format of output//IDLE 07, START FB TERMINATE FD SFD 10101011 PREAMBLE 10101010  ERROR FE.//IDLE START PREAMBLE SFD DA SA L/T DATA TERMINATE IDLE/////////////////////////////////////////////////////////////////////////////////		Ack counter/////////////////////////////////////////////////////////////////////////////////Ack counter. need to be able to load the frame length, pause frame inter frame delay into the ack counter// as this will delay the ack signal. The ack signal will initiate the rest of the data transmission from the// user logic.//need to stop the ack signal from transmitting when a PAUSE frame is transmitting// Connect DUT to test bench ack_counter U_ACK_CNT(.clock(TX_CLK),.reset(reset_int | reset_tx_int),	.ready(FRAME_START | transmit_pause_frame),.tx_start(TX_START),.max_count(DELAY_ACK),.tx_ack(TX_ACK));//CRC for 64 bit data//This seem to be one of the culprit for the timing violationCRC32_D64 U_CRC64(.DATA_IN(TX_DATA_REG), //need to swap between pause data.CLK(TX_CLK),	.RESET(reset_int | TX_ACK | append_start_pause),.START(frame_start_del | transmit_pause_frame_valid),.CRC_OUT(CRC_32_64) //need to switch to output some how for a pause frame);//CRC for 8 bit dataCRC32_D8 U_CRC8(.DATA_IN(tx_data_int), //8bit data.CLK(TX_CLK),.RESET(reset_int),.START(start_CRC8),  //this signal will be use to start.LOAD(load_CRC8), //use this to load first.CRC_IN(CRC_32_64),.CRC_OUT(CRC_OUT));//The start signal need to be high for the count//This seem to be one of the culprit for the timing violationbyte_count_module U_byte_count_module(.CLK(TX_CLK),.RESET(reset_int | TX_ACK),.START(frame_start_del & FRAME_START),.BYTE_COUNTER(BYTE_COUNTER));/////////////////////////////////////////////////////////////////////////////////	PAUSE FRAME///////////////////////////////////////////////////////////////////////////////always @(posedge TX_CLK)begin  PAUSEVAL_DEL <= FC_TRANS_PAUSEVAL;  PAUSEVAL_DEL1 <= PAUSEVAL_DEL;  PAUSEVAL_DEL2 <= PAUSEVAL_DEL1;endalways @(posedge TX_CLK or posedge reset_int)begin  if (reset_int) begin    transmit_pause_frame <= 0;  end  else if (PAUSEVAL_DEL2) begin    transmit_pause_frame <= 1;  end   else if (pause_frame_counter == 8) begin    transmit_pause_frame <= 0;  end endalways @(posedge TX_CLK or posedge reset_int)begin  if (reset_int) begin    set_pause_stats <= 0;  end  else if (PAUSEVAL_DEL2) begin    set_pause_stats <= 1;  end  else if (append_end_frame) begin    set_pause_stats <= 0;  endendalways @(posedge TX_CLK or posedge reset_int)begin  if (reset_int) begin    TXD_PAUSE_DEL0 <= 0;    TXD_PAUSE_DEL1 <= 0;    TXD_PAUSE_DEL2 <= 0;        TXC_PAUSE_DEL0 <= 0;    TXC_PAUSE_DEL1 <= 0;    TXC_PAUSE_DEL2 <= 0;        store_transmit_pause_value <= 0;  end  else if (FC_TRANS_PAUSEVAL) begin    store_transmit_pause_value <= FC_TRANS_PAUSEDATA;    TXD_PAUSE_DEL1 <= {DEST_ADDR, SOURCE_ADDR[47:32]};    TXD_PAUSE_DEL2 <= {SOURCE_ADDR[31:0], PAUSE_FRAME_LENGTH, PAUSE_OPCODE, FC_TRANS_PAUSEDATA};    TXC_PAUSE_DEL1 <= 8'hff;    TXC_PAUSE_DEL2 <= 8'hff;      end endalways @(posedge TX_CLK or posedge reset_int)begin  if (reset_int) begin    pause_frame_counter <= 0;  end  else if (transmit_pause_frame & !FRAME_START) begin    pause_frame_counter <= pause_frame_counter + 1;  end endalways @(posedge TX_CLK or posedge reset_int)begin  if (reset_int) begin    shift_pause_data <= 0;    shift_pause_valid_del <= 0;    shift_pause_valid <= 0;  end  else if (transmit_pause_frame & !FRAME_START) begin    if (pause_frame_counter == 0) begin      shift_pause_data <= TXD_PAUSE_DEL1;    end    else if (pause_frame_counter == 1) begin      shift_pause_data <= TXD_PAUSE_DEL2;    end    else begin      shift_pause_data <= 0;    end         if (pause_frame_counter == 7) begin      shift_pause_valid <= 8'h0f;    end    else if (pause_frame_counter < 7) begin      shift_pause_valid <= 8'hff;    end    else begin      shift_pause_valid <= 0;    end     shift_pause_valid_del <= shift_pause_valid;  end  else begin    shift_pause_data <= 0;    shift_pause_valid <= 0;    shift_pause_valid_del <= shift_pause_valid;  end endalways @(posedge reset_int or posedge TX_CLK)begin  if (reset_int) begin    FRAME_START <= 0;  end  else if (TX_ACK) begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -