📄 mac_tx_ff.v
字号:
else if (!Packet_number_add&&Packet_number_sub_edge) Packet_number_inFF <=Packet_number_inFF - 1'b1;always @ (posedge Clk_SYS or posedge Reset) if (Reset) Packet_number_inFF_reg <=0; else Packet_number_inFF_reg <=Packet_number_inFF;always @ (posedge Clk_SYS or posedge Reset) if (Reset) begin Add_rd_reg_rdy_dl1 <=0; Add_rd_reg_rdy_dl2 <=0; end else begin Add_rd_reg_rdy_dl1 <=Add_rd_reg_rdy; Add_rd_reg_rdy_dl2 <=Add_rd_reg_rdy_dl1; end always @ (posedge Clk_SYS or posedge Reset) if (Reset) Add_rd_reg_dl1 <=0; else if (Add_rd_reg_rdy_dl1&!Add_rd_reg_rdy_dl2) Add_rd_reg_dl1 <=Add_rd_reg;always @ (posedge Clk_SYS or posedge Reset) if (Reset) Fifo_data_count <=0; else if (FullDuplex) Fifo_data_count <=Add_wr[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]-Add_rd_ungray[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]; else Fifo_data_count <=Add_wr[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]-Add_rd_reg_dl1[`MAC_RX_FF_DEPTH-1:`MAC_RX_FF_DEPTH-5]; //for half duplex backoff requirement always @ (posedge Clk_SYS or posedge Reset) if (Reset) Fifo_ra_tmp <=0; else if (Packet_number_inFF_reg>=1||Fifo_data_count>=Tx_Lwmark) Fifo_ra_tmp <=1; else Fifo_ra_tmp <=0;always @ (posedge Clk_SYS or posedge Reset) if (Reset) begin Tx_Hwmark_pl <=0; Tx_Lwmark_pl <=0; end else begin Tx_Hwmark_pl <=Tx_Hwmark; Tx_Lwmark_pl <=Tx_Lwmark; end always @ (posedge Clk_SYS or posedge Reset) if (Reset) Tx_mac_wa <=0; else if (Fifo_data_count>=Tx_Hwmark_pl) Tx_mac_wa <=0; else if (Fifo_data_count<Tx_Lwmark_pl) Tx_mac_wa <=1;//****************************************************************************** //******************************************************************************//rd data to from FF .//domain Clk_MAC//******************************************************************************reg[35:0] Dout_dl1;reg Dout_reg_en /* synthesis syn_keep=1 */;always @ (posedge Clk_MAC or posedge Reset) if (Reset) Dout_dl1 <=0; else Dout_dl1 <=Dout;always @ (Current_state_MAC or Next_state_MAC) if ((Current_state_MAC==MAC_idle||Current_state_MAC==MAC_byte0)&&Next_state_MAC==MAC_byte3) Dout_reg_en =1; else Dout_reg_en =0; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Dout_reg <=0; else if (Dout_reg_en) Dout_reg <=Dout_dl1; assign {Dout_eop,Dout_err,Dout_BE,Dout_data}=Dout_reg;always @ (posedge Clk_MAC or posedge Reset) if (Reset) Current_state_MAC <=MAC_idle; else Current_state_MAC <=Next_state_MAC; always @ (Current_state_MAC or Fifo_rd or Dout_BE or Dout_eop or Fifo_rd_retry or Fifo_rd_finish or Empty or Fifo_rd or Fifo_eop) case (Current_state_MAC) MAC_idle: if (Empty&&Fifo_rd) Next_state_MAC=MAC_FF_Err; else if (Fifo_rd) Next_state_MAC=MAC_byte3; else Next_state_MAC=Current_state_MAC; MAC_byte3: if (Fifo_rd_retry) Next_state_MAC=MAC_retry; else if (Fifo_eop) Next_state_MAC=MAC_wait_finish; else if (Fifo_rd&&!Fifo_eop) Next_state_MAC=MAC_byte2; else Next_state_MAC=Current_state_MAC; MAC_byte2: if (Fifo_rd_retry) Next_state_MAC=MAC_retry; else if (Fifo_eop) Next_state_MAC=MAC_wait_finish; else if (Fifo_rd&&!Fifo_eop) Next_state_MAC=MAC_byte1; else Next_state_MAC=Current_state_MAC; MAC_byte1: if (Fifo_rd_retry) Next_state_MAC=MAC_retry; else if (Fifo_eop) Next_state_MAC=MAC_wait_finish; else if (Fifo_rd&&!Fifo_eop) Next_state_MAC=MAC_byte0; else Next_state_MAC=Current_state_MAC; MAC_byte0: if (Empty&&Fifo_rd&&!Fifo_eop) Next_state_MAC=MAC_FFEmpty; else if (Fifo_rd_retry) Next_state_MAC=MAC_retry; else if (Fifo_eop) Next_state_MAC=MAC_wait_finish; else if (Fifo_rd&&!Fifo_eop) Next_state_MAC=MAC_byte3; else Next_state_MAC=Current_state_MAC; MAC_retry: Next_state_MAC=MAC_idle; MAC_wait_finish: if (Fifo_rd_finish) Next_state_MAC=MAC_pkt_sub; else Next_state_MAC=Current_state_MAC; MAC_pkt_sub: Next_state_MAC=MAC_idle; MAC_FFEmpty: if (!Empty) Next_state_MAC=MAC_byte3; else Next_state_MAC=Current_state_MAC; MAC_FF_Err: //stopped state-machine need change Next_state_MAC=Current_state_MAC; default Next_state_MAC=MAC_idle; endcase//always @ (posedge Reset or posedge Clk_MAC) if (Reset) Add_rd_gray <=0; else begin Add_rd_gray[`MAC_RX_FF_DEPTH-1] <=Add_rd[`MAC_RX_FF_DEPTH-1]; for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1) Add_rd_gray[i] <=Add_rd[i+1]^Add_rd[i]; end//always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_wr_gray_dl1 <=0; else Add_wr_gray_dl1 <=Add_wr_gray; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_wr_ungray =0; else begin Add_wr_ungray[`MAC_RX_FF_DEPTH-1] =Add_wr_gray_dl1[`MAC_RX_FF_DEPTH-1]; for (i=`MAC_RX_FF_DEPTH-2;i>=0;i=i-1) Add_wr_ungray[i] =Add_wr_ungray[i+1]^Add_wr_gray_dl1[i]; end //empty always @ (posedge Clk_MAC or posedge Reset) if (Reset) Empty <=1; else if (Add_rd==Add_wr_ungray) Empty <=1; else Empty <=0; //raalways @ (posedge Clk_MAC or posedge Reset) if (Reset) Fifo_ra <=0; else Fifo_ra <=Fifo_ra_tmp;always @ (posedge Clk_MAC or posedge Reset) if (Reset) Pkt_sub_apply_tmp <=0; else if (Current_state_MAC==MAC_pkt_sub) Pkt_sub_apply_tmp <=1; else Pkt_sub_apply_tmp <=0; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Pkt_sub_apply <=0; else if ((Current_state_MAC==MAC_pkt_sub)||Pkt_sub_apply_tmp) Pkt_sub_apply <=1; else Pkt_sub_apply <=0;//reg Add_rd for collison retryalways @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd_reg <=0; else if (Fifo_rd_finish) Add_rd_reg <=Add_rd;always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd_reg_rdy_tmp <=0; else if (Fifo_rd_finish) Add_rd_reg_rdy_tmp <=1; else Add_rd_reg_rdy_tmp <=0; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd_reg_rdy <=0; else if (Fifo_rd_finish||Add_rd_reg_rdy_tmp) Add_rd_reg_rdy <=1; else Add_rd_reg_rdy <=0; reg Add_rd_add /* synthesis syn_keep=1 */;always @ (Current_state_MAC or Next_state_MAC) if ((Current_state_MAC==MAC_idle||Current_state_MAC==MAC_byte0)&&Next_state_MAC==MAC_byte3) Add_rd_add =1; else Add_rd_add =0; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd <=0; else if (Current_state_MAC==MAC_retry) Add_rd <= Add_rd_reg; else if (Add_rd_add) Add_rd <= Add_rd + 1; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd_jump_tmp <=0; else if (Current_state_MAC==MAC_retry) Add_rd_jump_tmp <=1; else Add_rd_jump_tmp <=0;always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd_jump_tmp_pl1 <=0; else Add_rd_jump_tmp_pl1 <=Add_rd_jump_tmp; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Add_rd_jump <=0; else if (Current_state_MAC==MAC_retry) Add_rd_jump <=1; else if (Add_rd_jump_tmp_pl1) Add_rd_jump <=0; //gen Fifo_data always @ (Dout_data or Current_state_MAC) case (Current_state_MAC) MAC_byte3: Fifo_data =Dout_data[31:24]; MAC_byte2: Fifo_data =Dout_data[23:16]; MAC_byte1: Fifo_data =Dout_data[15:8]; MAC_byte0: Fifo_data =Dout_data[7:0]; default: Fifo_data =0; endcase//gen Fifo_da always @ (posedge Clk_MAC or posedge Reset) if (Reset) Fifo_rd_dl1 <=0; else Fifo_rd_dl1 <=Fifo_rd; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Fifo_da <=0; else if ((Current_state_MAC==MAC_byte0||Current_state_MAC==MAC_byte1|| Current_state_MAC==MAC_byte2||Current_state_MAC==MAC_byte3)&&Fifo_rd&&!Fifo_eop) Fifo_da <=1; else Fifo_da <=0;//gen Fifo_data_err_emptyassign Fifo_data_err_full=Dout_err;//gen Fifo_data_err_emptyalways @ (posedge Clk_MAC or posedge Reset) if (Reset) Current_state_MAC_reg <=0; else Current_state_MAC_reg <=Current_state_MAC; always @ (posedge Clk_MAC or posedge Reset) if (Reset) Fifo_data_err_empty <=0; else if (Current_state_MAC_reg==MAC_FFEmpty) Fifo_data_err_empty <=1; else Fifo_data_err_empty <=0; always @ (posedge Clk_MAC) if (Current_state_MAC_reg==MAC_FF_Err) begin $finish(2); $display("mac_tx_FF meet error status at time :%t",$time); end//gen Fifo_eop aligned to last valid data byte。 always @ (Current_state_MAC or Dout_eop) if (((Current_state_MAC==MAC_byte0&&Dout_BE==2'b00|| Current_state_MAC==MAC_byte1&&Dout_BE==2'b11|| Current_state_MAC==MAC_byte2&&Dout_BE==2'b10|| Current_state_MAC==MAC_byte3&&Dout_BE==2'b01)&&Dout_eop)) Fifo_eop =1; else Fifo_eop =0; //******************************************************************************//******************************************************************************duram #(36,`MAC_TX_FF_DEPTH,"M4K") U_duram( .data_a (Din ), .wren_a (Wr_en ), .address_a (Add_wr ), .address_b (Add_rd ), .clock_a (Clk_SYS ), .clock_b (Clk_MAC ), .q_b (Dout ));endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -