Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2. module udp_former_v3(
  3.         input logic CLK                 ,
  4.         input logic RESET               ,
  5.         input logic[47 : 0] HOST_MAC    ,
  6.         input logic[31 : 0] HOST_IP     ,
  7.         input logic[15 : 0] HOST_PORT   ,
  8.         input logic[15 : 0] DEST_PORT   ,
  9.  
  10.         input logic[7 : 0]  S_AXIS_TDATA,
  11.         input logic S_AXIS_TVALID       ,
  12.         output logic S_AXIS_TREADY      = 1'b0,
  13.         input logic S_AXIS_TLAST        ,
  14.  
  15.         output logic[7 : 0] M_AXIS_TDATA = '{default:0},
  16.         output logic M_AXIS_TVALID      = 1'b0,
  17.         input logic M_AXIS_TREADY       ,
  18.         output logic M_AXIS_TLAST       = 1'b0                                          
  19.     );
  20.     typedef enum {
  21.         IDLE,
  22.         HEAD,
  23.         DATA
  24.     } FORMER;
  25.     FORMER former = IDLE;
  26.  
  27.     logic[8:0] din_in = '{default:0};
  28.     logic wr_en_in = 1'b0;
  29.     logic rd_en_in = 1'b0;
  30.     logic[8:0] dout_in;
  31.     logic full_in;
  32.     logic almost_full_in;
  33.     logic almost_empty_in;
  34.     logic empty_in;
  35.  
  36.      logic[8:0] din_out = '{default:0};
  37.      logic wr_en_out = 1'b0;
  38.      logic rd_en_out = 1'b0;
  39.      logic[8:0] dout_out;
  40.      logic full_out;
  41.      logic almost_full_out;
  42.      logic almost_empty_out;
  43.      logic empty_out;
  44.  
  45.     ila_1 ila(
  46.         CLK,
  47.         {
  48.             S_AXIS_TDATA,
  49.             S_AXIS_TVALID,
  50.             S_AXIS_TREADY,
  51.             S_AXIS_TLAST,
  52.             din_out,
  53.             wr_en_out,
  54.             rd_en_out,
  55.             dout_out,
  56.             full_out,
  57.             almost_full_out,
  58.             almost_empty_out,
  59.             empty_out  
  60.         },
  61.         {
  62.             M_AXIS_TDATA,
  63.             M_AXIS_TVALID,
  64.             M_AXIS_TREADY,
  65.             M_AXIS_TLAST,
  66.             din_in,
  67.             wr_en_in,
  68.             rd_en_in,
  69.             dout_in,
  70.             full_in,
  71.             almost_full_in,
  72.             almost_empty_in,
  73.             empty_in,
  74.             former
  75.         }
  76.     );
  77.    
  78.  
  79.    
  80.     logic[15:0] counter_data_for_fifo_in = '{default:0};
  81.     logic[15:0] counter_data_for_data_form = '{default:0};
  82.     logic[15:0] ip_len = '{default:0};
  83.  
  84.     logic [5:0] byte_counter = '{default:0};
  85.  
  86.     logic IPV4_CALC_START;
  87.     logic IPV4_CALC_CLEAR ;
  88.     logic[15:0] IPV4_CHKSUM ;
  89.     logic IPV4_DONE ;
  90.  
  91.     logic[14:0] data_count;
  92.     logic[15:0] local_data_count = '{default:0};
  93.     fifo_generator_0 fifo_in(
  94.         .clk(CLK),
  95.         .rst(RESET),
  96.         .din(din_in),
  97.         .wr_en(wr_en_in),
  98.         .rd_en(rd_en_in),
  99.         .dout(dout_in),
  100.         .full(full_in),
  101.         .almost_full(almost_full_in),
  102.         .almost_empty(almost_empty_in),
  103.         .empty(empty_in),
  104.         .data_count(data_count)
  105.     );
  106.     fifo_generator_1 fifo_out(
  107.         .clk(CLK),                    
  108.         .rst(RESET),                    
  109.         .din(din_out),                    
  110.         .wr_en(wr_en_out),                  
  111.         .rd_en(rd_en_out),                  
  112.         .dout(dout_out),                  
  113.         .full(full_out),                  
  114.         .almost_full(almost_full_out),                      
  115.         .empty(empty_out)                
  116.     );
  117.     ipv4_check_sum_v1_sync_8t checker_sum(
  118.         .CLK(CLK),
  119.         .RESET(RESET),
  120.         .IP_START_CALC(IPV4_CALC_START),
  121.         .IP_CLEAR_CALC(IPV4_CALC_CLEAR),
  122.         .IP_ID('h0000),
  123.         .IP_VER_LEN('h4500),
  124.         .IP_TOTAL_SIZE(ip_len),
  125.         .IP_PROTOCOL_TYPE('h11),
  126.         .IP_SRC_ADDR(HOST_IP),
  127.         .IP_DEST_ADDR('hffffa8c0),
  128.         .IP_TTL('h00),
  129.         .CHECK_SUM(IPV4_CHKSUM),
  130.         .SUM_READY(IPV4_DONE)
  131.     );
  132.    
  133.     // always_comb begin
  134.  
  135.     //  din_in = {S_AXIS_TLAST, S_AXIS_TDATA};
  136.     //  wr_en_in = S_AXIS_TVALID;  
  137.     //  if((former == IDLE) & ~RESET)
  138.     //      S_AXIS_TREADY = 1'b1;
  139.     //  else S_AXIS_TREADY = 1'b0;
  140.  
  141.     //  M_AXIS_TVALID = ~empty_out;
  142.     //  M_AXIS_TLAST = dout_out[8];
  143.     //  M_AXIS_TDATA = dout_out[7:0];
  144.     //  if((~empty_out) & M_AXIS_TREADY)
  145.     //      rd_en_out = 1'b1;
  146.     //  else rd_en_out = 1'b0;
  147.  
  148.     //  IPV4_CALC_START = S_AXIS_TLAST;
  149.  
  150.     //  if(S_AXIS_TLAST)begin
  151.     //      ip_len = data_count + 40;
  152.     //      local_data_count = data_count;
  153.     //  end
  154.  
  155.     //  if(former != HEAD)
  156.     //      IPV4_CALC_CLEAR = 1'b1;
  157.     //  else
  158.     //      IPV4_CALC_CLEAR = 1'b0;
  159.     // end
  160.     always @(posedge CLK) begin
  161.         if(S_AXIS_TREADY & S_AXIS_TVALID) begin
  162.             din_in <= {S_AXIS_TLAST, S_AXIS_TDATA};
  163.             wr_en_in <= S_AXIS_TVALID; 
  164.         end
  165.        
  166.         if(former == IDLE)
  167.             S_AXIS_TREADY <= 1'b1;
  168.         else S_AXIS_TREADY <= 1'b0;
  169.  
  170.         M_AXIS_TVALID <= ~empty_out;
  171.         M_AXIS_TLAST <= dout_out[8];
  172.         M_AXIS_TDATA <= dout_out[7:0];
  173.         if((~empty_out) & M_AXIS_TREADY)
  174.             rd_en_out <= 1'b1;
  175.         else rd_en_out <= 1'b0;
  176.  
  177.         IPV4_CALC_START <= S_AXIS_TLAST;
  178.  
  179.         if(S_AXIS_TLAST)begin
  180.             ip_len <= data_count + 40;
  181.             local_data_count <= data_count;
  182.         end
  183.  
  184.         if(former != HEAD)
  185.             IPV4_CALC_CLEAR = 1'b1;
  186.         else
  187.             IPV4_CALC_CLEAR = 1'b0;
  188.         if(S_AXIS_TLAST)begin
  189.             former <= HEAD;
  190.         end
  191.         unique case (former)
  192.             HEAD: begin
  193.                 byte_counter <= byte_counter + 1;
  194.                 unique case (byte_counter)
  195.                     0:      begin
  196.                         din_out <= 'hff;
  197.                         wr_en_out <= 1'b1;
  198.                     end
  199.                     1:      din_out <= 'hff                                    ;
  200.                     2:      din_out <= 'hff                                    ;
  201.                     3:      din_out <= 'hff                                    ;
  202.                     4:      din_out <= 'hff                                    ;
  203.                     5:      din_out <= 'hff                                    ;
  204.                     6:      din_out <= HOST_MAC            [ 7 : 0]            ;
  205.                     7:      din_out <= HOST_MAC            [15 : 8]            ;
  206.                     8:      din_out <= HOST_MAC            [23 : 16]           ;
  207.                     9:      din_out <= HOST_MAC            [31 : 24]           ;
  208.                     10:     din_out <= HOST_MAC            [39 : 32]           ;
  209.                     11:     din_out <= HOST_MAC            [47 : 40]           ;
  210.                     12:     din_out <= 'h08                                    ;
  211.                     13:     din_out <= 'h00                                    ;
  212.                     14:     din_out <= 'h45                                    ;
  213.                     15:     din_out <= 'h00                                    ;
  214.                     16:     din_out <= ip_len        [15:8]            ;
  215.                     17:     din_out <= ip_len        [7:0]             ;
  216.                     18:     din_out <= 'h00                                    ;
  217.                     19:     din_out <= 'h00                                    ;
  218.                     20:     din_out <= 'h00                                    ;
  219.                     21:     din_out <= 'h00                                    ;
  220.                     22:     din_out <= 'h00                                 ;
  221.                     23:     din_out <= 'h11                            ;
  222.                     24:     din_out <= IPV4_CHKSUM         [15 :  8]           ;
  223.                     25:     din_out <= IPV4_CHKSUM         [ 7 :  0]           ;
  224.                     26:     din_out <= HOST_IP             [ 7 :  0]           ;
  225.                     27:     din_out <= HOST_IP             [15 :  8]           ;
  226.                     28:     din_out <= HOST_IP             [23 : 16]           ;
  227.                     29:     din_out <= HOST_IP             [31 : 24]           ;
  228.                     30:     din_out <= 'hC0                                    ;
  229.                     31:     din_out <= 'hA8                                    ;
  230.                     32:     din_out <= 'hff                                    ;
  231.                     33:     din_out <= 'hff                                    ;
  232.                     34:     din_out <= HOST_PORT           [ 7 : 0]            ;
  233.                     35:     din_out <= HOST_PORT           [15 : 8]            ;
  234.                     36:     din_out <= DEST_PORT           [ 7 : 0]            ;
  235.                     37:     din_out <= DEST_PORT           [15 : 8]            ;
  236.                     38:     din_out <= local_data_count[15:8]              ;
  237.                     39:     begin
  238.                         din_out <= local_data_count[7:0];
  239.                         former <= DATA;
  240.                         byte_counter <= 0;
  241.                         rd_en_in <= 1'b1;
  242.                     end
  243.                 endcase;
  244.             end
  245.             DATA: begin
  246.                 din_out <= dout_in;
  247.                 if(din_out[8] == 1)begin
  248.                     rd_en_in <= 1'b0;
  249.                     wr_en_out <= 1'b0;
  250.                     former <= IDLE;
  251.                 end
  252.             end
  253.         endcase;
  254.     end
  255.  
  256. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement