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

📄 fc.v

📁 本系统由服务器软件控制平台和fpga硬件处理系统组成
💻 V
字号:
//
//-----------------------------------------------------------------------------
// Title      : fifo control module
// Project    : 
//-----------------------------------------------------------------------------
// File       : fc.v
// Author     : 
// Date       : 07-10-21
//-----------------------------------------------------------------------------
// Description:   fifo control 
//                drop error packet
//-------------------------------------------------------------------------------
 
`timescale 1ns/10ps

module fc(
sys_clk, 
sys_rst_n,
cal_sop_fc, 
cal_eop_fc, 
cal_dat_fc,
cal_mod_fc, 
cal_vld_fc, 
cal_spkt_fc, 
cal_lpkt_fc,
cal_epkt_fc,
fc_afull_cal,
fc_sop_ih, 
fc_eop_ih, 
fc_vld_ih, 
fc_dat_ih, 
fc_mod_ih,  
ih_pb_fc
);

/*-------------------------------------------------------------------*\
                          Parameter Description
\*-------------------------------------------------------------------*/

parameter   D = 2;

/*-------------------------------------------------------------------*\
                            Port Description
\*-------------------------------------------------------------------*/ 

/*--------Global Signals--------*/
input               sys_clk;
input               sys_rst_n;

/*----------IXF_IF I/F----------*/
input               cal_sop_fc;
input               cal_eop_fc;
input     [31:0]    cal_dat_fc;
input     [1:0]     cal_mod_fc;
input               cal_vld_fc;
input               cal_spkt_fc;     //short packet
input               cal_lpkt_fc;     //long  packet
input               cal_epkt_fc;     //error packet
output              fc_afull_cal;

/*---------IXF_ARB I/F----------*/
output              fc_sop_ih;
output              fc_eop_ih;
output              fc_vld_ih;
output    [31:0]    fc_dat_ih;
output    [1:0]     fc_mod_ih;
input               ih_pb_fc;

/*-------------------------------------------------------------------*\
                          Reg/Wire Description
\*-------------------------------------------------------------------*/

reg                 fc_afull_cal;
reg                 fc_sop_ih;
reg                 fc_eop_ih;
reg                 fc_vld_ih;
reg       [31:0]    fc_dat_ih;
reg       [1:0]     fc_mod_ih;             

//register the input singal
reg                 f_cal_sop_fc;
reg                 f_cal_eop_fc;
reg       [31:0]    f_cal_dat_fc;
reg       [1:0]     f_cal_mod_fc;
reg                 f_cal_vld_fc;
reg		    f_cal_err_fc;

//signal with fifo control
reg		    wen;
reg	  [9:0]	    waddr;
reg	  [35:0]    wdat;
reg	  [9:0]	    tmp_waddr;
reg		    drp_pkt;
reg		    eop_d;
wire		    fifo_empty;
reg	  [9:0]	    disp_addr;
reg	  [9:0]	    raddr;
wire	  [35:0]    rdat;
reg		    data_write;
wire	  [35:0]    data_in;
wire		    data_read;
wire	  [35:0]    data_out;
wire		    lb_empty_n;
wire		    lb_afull;
reg		    read_en;
reg		    ren;
reg	  [9:0]     use_frm;

//signal with arbiter
reg                 tmp_sop_ih;
reg                 tmp_eop_ih;
reg                 tmp_vld_ih;
reg       [31:0]    tmp_dat_ih;
reg       [1:0]     tmp_mod_ih;

/*-------------------------------------------------------------------*\
                               Main Codes
\*-------------------------------------------------------------------*/        

//register input signal
always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     begin
       f_cal_sop_fc <= #D 1'b0;
       f_cal_eop_fc <= #D 1'b0;
       f_cal_dat_fc <= #D 32'b0;
       f_cal_mod_fc <= #D 2'b0;
       f_cal_vld_fc <= #D 1'b0;
       f_cal_err_fc <= #D 1'b0;       
     end
  else
     begin
       f_cal_sop_fc <= #D cal_sop_fc;
       f_cal_eop_fc <= #D cal_eop_fc;
       f_cal_dat_fc <= #D cal_dat_fc;
       f_cal_mod_fc <= #D cal_mod_fc;
       f_cal_vld_fc <= #D cal_vld_fc;
       f_cal_err_fc <= #D cal_spkt_fc || cal_lpkt_fc || cal_epkt_fc;
     end
end

/*---------------------------------------------*\
        write to fifo and drop error packet
\*---------------------------------------------*/

//error packet flag
always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     drp_pkt <= #D 1'b0;
  else
     drp_pkt <= #D f_cal_eop_fc && f_cal_vld_fc && f_cal_err_fc;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     eop_d <= #D 1'b0;
  else
     eop_d <= #D f_cal_eop_fc && f_cal_vld_fc;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     wen <= #D 1'b0;
  else
     wen <= #D f_cal_vld_fc;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     waddr <= #D 10'b0;
  else if(drp_pkt)
     waddr <= #D tmp_waddr;
  else if(wen)
     waddr <= #D waddr + 10'd1;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     tmp_waddr <= #D 10'b0;
  else if(~drp_pkt && eop_d)
     tmp_waddr <= #D waddr + 10'd1;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     wdat <= #D 36'b0;
  else
     wdat <= #D {f_cal_sop_fc,f_cal_eop_fc,f_cal_mod_fc,f_cal_dat_fc};
end

//instance dpram1024x36
dpram1024x36 u_dpram1024x36(
    .addra (waddr),
    .addrb (raddr),
    .clka  (sys_clk),
    .clkb  (sys_clk),
    .dina  (wdat),
    .doutb (rdat),
    .enb   (ren),
    .wea   (wen)
    );

//generate fifo afull signal and fifo empty signal
assign fifo_empty = tmp_waddr == raddr;

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     disp_addr <= #D 10'b0;
  else
     disp_addr <= #D waddr - raddr;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     fc_afull_cal <= #D 1'b0;
  else if(disp_addr[9:5] >= 5'b1_1111)
     fc_afull_cal <= #D 1'b1;
  else if(disp_addr[9:5] <= 5'b1_1101)
     fc_afull_cal <= #D 1'b0; 
end

//write to lb_fifo_5cell
always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     use_frm <= #D 10'b0;
  else
     use_frm <= #D tmp_waddr - raddr;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     read_en <= #D 1'b1;
  else if(use_frm < 10'd4)
     read_en <= #D ~read_en;
  else
     read_en <= #D 1'b1;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     ren <= #D 1'b0;
  else
     ren <= #D read_en && ~fifo_empty && ~lb_afull;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     raddr <= #D 10'b0;
  else if(ren)
     raddr <= #D raddr + 10'd1;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     data_write <= #D 1'b0;
  else
     data_write <= #D ren;
end

assign data_in = rdat;

//instance lb_fifo_5cell
lb_fifo_5cell #(36,D) u_lb_fifo_5cell (
    .sys_clk    (sys_clk),     
    .sys_rst_n  (sys_rst_n),    
    .data_in    (data_in),
    .data_read  (data_read),    
    .data_out   (data_out),
    .data_write (data_write),   

    .full_cell0 (lb_empty_n), 
    .full_cell1 (),             
    .full_cell2 (lb_afull),    
    .full_cell3 (),
    .full_cell4 ()            
    );

//read from the lb_fifo_5cell

assign data_read = lb_empty_n && ~ih_pb_fc;

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     tmp_sop_ih <= #D 1'b0; 
  else
     tmp_sop_ih <= #D data_out[35] && data_read;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     tmp_eop_ih <= #D 1'b0;
  else
     tmp_eop_ih <= #D data_out[34] && data_read;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     tmp_mod_ih <= #D 2'b0;
  else if(data_read)
     tmp_mod_ih <= #D data_out[33:32];
  else
  	 tmp_mod_ih <= #D 2'b0;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     tmp_vld_ih <= #D 1'b0;
  else
     tmp_vld_ih <= #D data_read;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     tmp_dat_ih <= #D 32'b0;
  else
     tmp_dat_ih <= #D data_out[31:0];
end

//send packet out
always @(posedge sys_clk or negedge sys_rst_n)
begin
  if(!sys_rst_n) 
     begin
       fc_sop_ih <= #D 1'b0;
       fc_eop_ih <= #D 1'b0;
       fc_vld_ih <= #D 1'b0;
       fc_dat_ih <= #D 32'b0;
       fc_mod_ih <= #D 2'b0;        
     end
  else
     begin
       fc_sop_ih <= #D tmp_sop_ih && tmp_vld_ih;
       fc_eop_ih <= #D tmp_eop_ih && tmp_vld_ih;
       fc_vld_ih <= #D tmp_vld_ih;
       fc_dat_ih <= #D tmp_dat_ih;
       fc_mod_ih <= #D tmp_mod_ih;
     end
end

endmodule

⌨️ 快捷键说明

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