Advertisement
tariq786

Packetizer Code for review

Jul 22nd, 2014
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VeriLog 16.38 KB | None | 0 0
  1.  
  2. module packet_sender(
  3.                      input             clk,
  4.                      input             reset,
  5.                      //input [7:0]       packet_size_i,
  6.              input             start,
  7.                      //input [23:0]      bytes,
  8.                      //input             en,
  9.                      //input             HSYNC,
  10.                      //input             VSYNC,
  11.                      //input [10:0]      HCOUNT,
  12.                      //input [10:0]      VCOUNT,
  13.                      //output reg        fifo_full,
  14.                      output reg [3:0]  wr_flags_o,
  15.              output reg [31:0] wr_data_o,
  16.              output reg        wr_src_rdy_o,
  17.              input             wr_dst_rdy_i
  18.                      //    output reg [1300*8-1:0] rtp_pkt //made as output for monitoring purpose.
  19.                      // Remove when synthesizing the core
  20.                      );
  21.  
  22.  
  23.  
  24.  
  25.  //states
  26.  
  27.   localparam [4:0]
  28.     IDLE       = 0,
  29.     CALC_IP_HDR1_CHKSUM    = 1,
  30.     CALC_IP_HDR2_CHKSUM    = 2,
  31.     CALC_IP_HDR3_CHKSUM    = 3,
  32.     CALC_IP_HDR4_CHKSUM    = 4,
  33.     CALC_IP_HDR5_CHKSUM    = 5,
  34.     SOP                    = 6,
  35.     TRANSMIT_HDR2           = 7,
  36.     TRANSMIT_HDR3           = 8,
  37.     TRANSMIT_HDR4           = 9,
  38.     TRANSMIT_HDR5           = 10,
  39.     TRANSMIT_HDR6           = 11,
  40.     TRANSMIT_HDR7           = 12,
  41.     TRANSMIT_HDR8           = 13,
  42.     TRANSMIT_HDR9           = 14,
  43.     TRANSMIT_HDR10          = 15,
  44.     TRANSMIT_HDR11          = 16,
  45.     SEND_RTP_HDR1           = 17,
  46.     SEND_RTP_HDR2           = 18,
  47.     SEND_RTP_HDR3           = 19,
  48.     SEND_RTP_HDR4           = 20,
  49.     SEND_RTP_HDR5           = 21,
  50.     SEND_RTP1               = 22,
  51.     SEND_RTP2               = 23,
  52.     SEND_RTP3               = 24,
  53.     SEND_RTP4               = 25,
  54.     CLEANUP                 = 26,
  55.     DELAY_STATE              = 27;
  56.  
  57.  
  58.  
  59.   (* fsm_encoding = "user" *)
  60.   reg [4:0]                            state;
  61.  
  62.   reg [15:0]                           pixel_cnt, pkt_cnt, line_cnt, frame_cnt,
  63.                                        line_no, seqn, pkt_offset;
  64.  
  65.                                        
  66.   reg [31:0]                           timest;
  67.  
  68.   reg [13:0]                           packet_size_count;
  69.  
  70.  
  71.   //reg              sof, nxt_sof;
  72.  
  73.  
  74.   reg [10:0]                           hcount, vcount;
  75.   reg [15:0]                                    delay;
  76.  
  77.   //temporary variables. DELETE THEM LATER
  78.   //  reg                                  en;
  79.   //reg              VSYNC;  
  80.   //reg              fifo_full;          
  81.  
  82.  
  83.   localparam IP_IDENTIFICATION = 16'haabb;
  84.   localparam IP_FRAG = 13'd0;
  85.  
  86.   parameter SRC_PORT = 16'd5004;
  87.   parameter DST_PORT = 16'd5004;
  88.   parameter SRC_MAC = 48'h0018_3e01_53d5;
  89.   parameter DST_MAC = 48'h782b_cb87_cc67;  //ubuntu mac
  90.   parameter DST_IP = 32'hc0a8_0101;  //192.168.1.1
  91.   parameter SRC_IP = 32'hc0a8_0102;  //192.168.1.2
  92.  
  93.   // Generate valid IP header checksums
  94.   wire [15:0]                          header_checksum;
  95.   reg [31:0]                           header_checksum_input;
  96.   reg                                  header_checksum_reset;
  97.  
  98.   ip_header_checksum ip_header_checksum (
  99.                                          .clk(clk),
  100.                                          .checksum(header_checksum),
  101.                                          .header(header_checksum_input),
  102.                                          .reset(header_checksum_reset)
  103.                                          );
  104.  
  105.  
  106.   // Calculate packet lengths
  107.   wire [15:0]                          packet_length_udp1, packet_length_ip1, packet_length_rtp1;
  108.   wire [15:0]                          packet_length_udp2, packet_length_ip2, packet_length_rtp2;
  109.  
  110.   // assign packet_length_rtp1 = 16'd1292 ;  //1272+20 byte header = 1292 bytes
  111.   // assign packet_length_udp1 = 16'd1300 ; // 1292 +  8 byte udp hdr
  112.   // assign packet_length_ip1  = 16'd1320 ; // IP header adds 20 bytes to UDP packet
  113.  
  114.   // assign packet_length_rtp2 = 16'd1316 ;  //1296+20 = 1316 bytes
  115.   // assign packet_length_udp2 = 16'd1324 ; // 1316 +  8 byte hdr
  116.   //  assign packet_length_ip2  = 16'd1344 ; // 1324 + 20 IP header adds 20 bytes to UDP packet
  117.  
  118.   assign packet_length_rtp1 = {3'b000, 8'b0010_1000, 5'b01100}; //rtp payload +  20 byte hdr = 1272 + 20 = 1292
  119.   assign packet_length_udp1 = {3'b000, 8'b0010_1000, 5'b10100}; //rtp + udp hdr = 1300
  120.   assign packet_length_ip1  = {3'b000, 8'b0010_1001, 5'b01000}; //rtp + udp hdr + ip hdr = 1320
  121.  
  122.   //
  123.   assign packet_length_rtp2 = {3'b000, 8'b0010_1001, 5'b00100}; //rtp payload +  20 byte hdr = 1296+20 = 1316
  124.   assign packet_length_udp2 = {3'b000, 8'b0010_1001, 5'b01100}; //rtp + udp hdr = 1316 + 8 = 1324
  125.   assign packet_length_ip2  = {3'b000, 8'b0010_1010, 5'b00000}; //rtp + udp hdr + ip hdr = 1320  = 1324 + 20 = 1344
  126.  
  127.  
  128.   //ip packet header (20 bytes)
  129.   wire [31:0]                          header_1, header_2, header_3, header_4, header_5; //broken into 5 (4 bytes)
  130.  
  131.   //assign header_1 = {16'h4500, packet_length_ip};  //{version,ihl}, ip packet length including ip header
  132.   assign header_2 = {IP_IDENTIFICATION[15:0], 3'b000, IP_FRAG[12:0]}; // IP identification, fragment;
  133.   assign header_3 = {16'h4011, 16'h0000}; // TTL, protocol=17 for udp, header checksum
  134.   assign header_4 = SRC_IP;
  135.   assign header_5 = DST_IP;
  136.  
  137.  
  138.   /* -----\/----- EXCLUDED -----\/-----
  139.    reg [24:0]                           pixel_mem [1279:0];
  140.    
  141.    
  142.    initial // Read the memory contents from the file simple_rgb.txt in pixel_mem memory
  143.    begin
  144.    $readmemb("simple_rgb.txt", pixel_mem);
  145.    $display("Pixel memory read successfully\n");
  146.     end
  147.    -----/\----- EXCLUDED -----/\----- */
  148.  
  149.  
  150.   //Sequential logic
  151.   always @(posedge clk)
  152.     if(reset)
  153.       begin
  154.         state         <= #1 IDLE;
  155.         pixel_cnt     <= #1 16'd0;
  156.         pkt_cnt       <= #1 16'd0;
  157.         line_cnt      <= #1 16'd0;
  158.         frame_cnt     <= #1 16'd0;
  159.         //fifo_full     <= #1 0;
  160.         pkt_offset    <= #1 16'd0;
  161.         line_no       <= #1 16'd0;//26;
  162.         seqn          <= #1 16'd0;
  163.         timest        <= #1 32'h0;
  164.         wr_data_o     <= #1 32'd0;
  165.         wr_flags_o    <= #1 4'd0;
  166.         wr_src_rdy_o  <= #1 0;
  167.         //sof           <= #1 0;
  168.         hcount        <= #1 11'd0;
  169.         vcount        <= #1 11'd0;
  170.         header_checksum_reset <= #1 1;
  171.          packet_size_count    <= #1 14'd0;
  172.           delay                <= #1 0;
  173.       end // if (reset)
  174.  
  175.     else
  176.       begin
  177.         case(state)
  178.           IDLE:
  179.             begin
  180.              
  181.               packet_size_count <= 0;
  182.            
  183.               if( (seqn < 300) && (wr_dst_rdy_i == 1'b1) )
  184.           begin
  185.         header_checksum_reset <= 0; //unassert reset
  186.         state <= CALC_IP_HDR1_CHKSUM;
  187.           end
  188.           end
  189.  
  190.        
  191.         CALC_IP_HDR1_CHKSUM:
  192.           begin
  193.         if(wr_dst_rdy_i)
  194.           begin
  195.                 if(pkt_cnt !=2 )
  196.                   header_checksum_input <= {16'h4500, packet_length_ip1};
  197.                 else
  198.                   header_checksum_input <= {16'h4500, packet_length_ip2};
  199.                
  200.                 state <= CALC_IP_HDR2_CHKSUM;
  201.           end
  202.           end
  203.  
  204.         CALC_IP_HDR2_CHKSUM:
  205.           begin
  206.         if(wr_dst_rdy_i)
  207.           begin
  208.                 header_checksum_input <= header_2;
  209.                 state <= CALC_IP_HDR3_CHKSUM;
  210.           end
  211.       end
  212.        
  213.         CALC_IP_HDR3_CHKSUM:
  214.           begin
  215.         if(wr_dst_rdy_i)
  216.           begin
  217.                 header_checksum_input <= header_3;
  218.                 state <= CALC_IP_HDR4_CHKSUM;
  219.           end
  220.       end
  221.        
  222.         CALC_IP_HDR4_CHKSUM:
  223.           begin
  224.         if(wr_dst_rdy_i)
  225.           begin
  226.                 header_checksum_input <= header_4;
  227.                 state <= CALC_IP_HDR5_CHKSUM;
  228.           end
  229.       end
  230.        
  231.         CALC_IP_HDR5_CHKSUM:
  232.           begin
  233.             header_checksum_input <= header_5;
  234.             state <= SOP;
  235.           end
  236.        
  237.         SOP:
  238.           begin
  239.             //start_pkt();  //start of Ethernet frame
  240.             wr_src_rdy_o <= 1; 
  241.             wr_flags_o   <= 4'b0001; // Start of packet
  242.             //transmit_header(DST_MAC[47:16]); //start with 32 bits of dst_mac address
  243.         if(wr_dst_rdy_i)
  244.           begin
  245.         wr_data_o <= DST_MAC[47:16];
  246.         state <= TRANSMIT_HDR2;
  247.           end
  248.           end
  249.  
  250.         TRANSMIT_HDR2:
  251.           begin
  252.             //transmit_header({DST_MAC[15:0], SRC_MAC[47:32]});
  253.         if(wr_dst_rdy_i)
  254.           begin
  255.         wr_data_o <= {DST_MAC[15:0], SRC_MAC[47:32]};
  256.         //clear_mac_flags();
  257.         state <= TRANSMIT_HDR3;
  258.           end
  259.             //clear mac flags
  260.             wr_flags_o <= 4'b0000;
  261.            
  262.           end
  263.        
  264.         TRANSMIT_HDR3:
  265.           begin
  266.             //transmit_header(SRC_MAC[31:0]);
  267.         if(wr_dst_rdy_i)
  268.           begin
  269.         wr_data_o <= SRC_MAC[31:0];
  270.                 state <= TRANSMIT_HDR4;
  271.           end
  272.           end
  273.  
  274.         TRANSMIT_HDR4:
  275.           begin
  276.             //transmit_header({16'h0800, 16'h4500}); // First 8 bits: hwtype ethernet (4), protocol type ipv4 (1),  header length (1) (*4), dsc (2)
  277.         if(wr_dst_rdy_i)
  278.           begin
  279.         wr_data_o <= {16'h0800, 16'h4500};     
  280.                 state <= TRANSMIT_HDR5;
  281.           end
  282.           end
  283.        
  284.         TRANSMIT_HDR5:
  285.           begin
  286.         if(wr_dst_rdy_i)
  287.           begin
  288.        
  289.         if(pkt_cnt != 2)
  290.           //transmit_header({packet_length_ip1, header_2[31:16]});
  291.           wr_data_o <= {packet_length_ip1, header_2[31:16]};
  292.                 else
  293.           //transmit_header({packet_length_ip2, header_2[31:16]});
  294.           wr_data_o <= {packet_length_ip2, header_2[31:16]};
  295.                 state <= TRANSMIT_HDR6;
  296.           end // if (wr_dst_rdy_i)
  297.           end // case: TRANSMIT_HDR5
  298.        
  299.  
  300.         TRANSMIT_HDR6:
  301.           begin
  302.             //transmit_header({header_2[15:0], header_3[31:16]});
  303.         if(wr_dst_rdy_i)
  304.           begin
  305.         wr_data_o <= {header_2[15:0], header_3[31:16]};
  306.         state <= TRANSMIT_HDR7;
  307.           end  
  308.           end
  309.        
  310.         TRANSMIT_HDR7:
  311.           begin
  312.             //transmit_header({header_checksum, header_4[31:16]}); // Inject the calculated header checksum here
  313.         if(wr_dst_rdy_i)
  314.           begin
  315.         wr_data_o <= {header_checksum, header_4[31:16]};       
  316.         state <= TRANSMIT_HDR8;
  317.           end
  318.           end
  319.        
  320.         TRANSMIT_HDR8:
  321.           begin
  322.             //transmit_header({header_4[15:0], header_5[31:16]});
  323.         if(wr_dst_rdy_i)
  324.           begin
  325.         wr_data_o <= {header_4[15:0], header_5[31:16]};
  326.         state <= TRANSMIT_HDR9;
  327.           end  
  328.           end
  329.        
  330.         TRANSMIT_HDR9:
  331.           begin
  332.             //transmit_header({header_5[15:0], SRC_PORT});
  333.         if(wr_dst_rdy_i)
  334.           begin
  335.         wr_data_o <= {header_5[15:0], SRC_PORT};
  336.         state <= TRANSMIT_HDR10;
  337.           end
  338.           end
  339.        
  340.         TRANSMIT_HDR10:
  341.           begin
  342.         if(wr_dst_rdy_i)
  343.           begin
  344.                 if(pkt_cnt !=2)
  345.           //transmit_header({DST_PORT, packet_length_udp1});
  346.           wr_data_o <= {DST_PORT, packet_length_udp1};
  347.                 else
  348.           //transmit_header({DST_PORT, packet_length_udp2});
  349.           wr_data_o <= {DST_PORT, packet_length_udp2};
  350.            
  351.             state <= TRANSMIT_HDR11;
  352.           end
  353.           end
  354.        
  355.         TRANSMIT_HDR11:
  356.           begin
  357.         if(wr_dst_rdy_i)
  358.           begin
  359.                 //       if(pkt_cnt != 2)
  360.         if(seqn < 16'd299)          //modify this
  361.           //transmit_header({32'h0000,8'h80,1'b0,7'd24}); // {UDP checksum (4), start of RTP header's 2 bytes}
  362.           wr_data_o <= {32'h0000,8'h80,1'b0,7'd24};
  363.                
  364.                 else
  365.           //transmit_header({32'h0000,8'h80,1'b1,7'd24}); //  1'b1 marks the end of frame
  366.           wr_data_o <= {32'h0000,8'h80,1'b1,7'd24};
  367.                 state <= SEND_RTP_HDR1;
  368.           end
  369.           end
  370.        
  371.         SEND_RTP_HDR1:
  372.           begin
  373.             if (wr_dst_rdy_i)
  374.               begin
  375.                 wr_data_o <= {seqn,timest[31:16]};
  376.                 state <= SEND_RTP_HDR2;
  377.               end
  378.           end
  379.        
  380.         SEND_RTP_HDR2:
  381.           begin
  382.             if (wr_dst_rdy_i)
  383.               begin
  384.                 wr_data_o <= {timest[15:0],16'd0}; //{timstamp,ssrc[31:16]}
  385.                 state <= SEND_RTP_HDR3;
  386.               end
  387.           end
  388.        
  389.        
  390.         SEND_RTP_HDR3:
  391.           begin
  392.             if (wr_dst_rdy_i)
  393.               begin
  394.                 wr_data_o <= {16'd0,16'd0}; //{ssrc[15:0],length[31:16]}
  395.                 state <= SEND_RTP_HDR4;
  396.               end
  397.           end
  398.  
  399.        
  400.         SEND_RTP_HDR4:
  401.           begin
  402.             if (wr_dst_rdy_i)
  403.               begin
  404.                 if(pkt_cnt != 2)
  405.           wr_data_o <= {16'd1272,line_no[15:0]}; //{length[15:0],line_no}
  406.                 else
  407.           wr_data_o <= {16'd1296,line_no[15:0]};
  408.                
  409.                 state <= SEND_RTP_HDR5;
  410.               end
  411.           end
  412.        
  413.         SEND_RTP_HDR5:
  414.           begin
  415.             if(wr_dst_rdy_i)
  416.               begin
  417.                 //nxt_wr_data_o = {pkt_offset,pixel_mem[hcount][23:8]}; //{offset,pixel}
  418.                 wr_data_o <= {pkt_offset,16'hFF00}; //{offset,pixel}
  419.        
  420.                 state <= SEND_RTP1;
  421.               end
  422.           end
  423.  
  424.         SEND_RTP1:
  425.           begin
  426.             if (wr_dst_rdy_i)
  427.               begin
  428.                 //nxt_wr_data_o = {pixel_mem[hcount][7:0],pixel_mem[hcount+1][23:0]};
  429.                 wr_data_o <= {8'h00,24'hFF_00_00};
  430.                 packet_size_count <= packet_size_count + 1'b1;
  431.             state <= SEND_RTP2;
  432.               end // if (wr_dst_rdy_i)
  433.           end
  434.        
  435.         SEND_RTP2:
  436.           begin
  437.             if (wr_dst_rdy_i)
  438.               begin
  439.                 //nxt_wr_data_o = {pixel_mem[hcount+2][23:0],pixel_mem[hcount+3][23:16]};
  440.                 wr_data_o <= {24'hFF_00_00,8'hFF};
  441.                 packet_size_count <= packet_size_count + 1'b1;
  442.            
  443.         state <= SEND_RTP3;
  444.               end // if (wr_dst_rdy_i)
  445.           end
  446.        
  447.         SEND_RTP3:
  448.           begin
  449.             if (wr_dst_rdy_i)
  450.               begin
  451.                 //nxt_wr_data_o = {pixel_mem[hcount+3][15:0],pixel_mem[hcount+4][23:8]};
  452.                 wr_data_o <= {16'h00_00,16'hFF_00};
  453.         packet_size_count <= packet_size_count + 1'b1;
  454.             state <= SEND_RTP4;
  455.               end // if (wr_dst_rdy_i)
  456.            
  457.           end // case: SEND_RTP3
  458.        
  459.        
  460.         SEND_RTP4:
  461.           begin
  462.             if (wr_dst_rdy_i)
  463.               begin
  464.                 //nxt_wr_data_o = {pixel_mem[hcount+4][7:0],pixel_mem[hcount+5][23:0]};
  465.                 wr_data_o <= {8'h00,24'hFF_00_00};
  466.                 pixel_cnt <= pixel_cnt + 4; //6;
  467.                 hcount    <= hcount + 4;  //adjusted from 6 to 4
  468.                 packet_size_count <= packet_size_count + 1'b1;
  469.             if ( ( (pkt_cnt != 2) && (packet_size_count == {5'b0, 8'b0010_0111, 3'b110}) )||
  470.              (   (pkt_cnt == 2) && (packet_size_count == {5'b0, 8'b0010_1000, 3'b100}) )
  471.              )
  472.           begin
  473.             wr_flags_o <= 4'b0010; // 4 bytes, EOF 
  474.             state <= CLEANUP;
  475.           end
  476.                 else
  477.           state <= SEND_RTP2;
  478.                
  479.               end // if (wr_dst_rdy_i)
  480.            
  481.           end // case: SEND_RTP4
  482.        
  483.        
  484.         CLEANUP:
  485.           begin
  486.             if (wr_dst_rdy_i) // Wait until we're sure the last word has been received.
  487.               begin
  488.         wr_src_rdy_o <= 0;
  489.         wr_flags_o <= 0;
  490.                 header_checksum_reset <= 1;
  491.        
  492.         if(  pkt_cnt != 2 )
  493.           begin
  494.             pkt_cnt <= pkt_cnt +1;
  495.             pkt_offset <= pkt_offset + 16'd424;//16'd1272;  //next packet's offset is 1272 from current
  496.           end
  497.         else if  (pkt_cnt == 2)
  498.           begin
  499.             line_cnt    <= line_cnt + 1;    //move to next line
  500.             line_no     <= line_no + 1;     //line number is 26 + 1
  501.             pkt_offset  <= 0;               // reset offset to 0
  502.             pkt_cnt     <= 0;
  503.             hcount      <= 0;               //reset hcount
  504.           end
  505.        
  506.         if(line_cnt == 719)
  507.           begin
  508.             frame_cnt <= frame_cnt + 1;
  509.             line_cnt <= 0;
  510.             line_no <= 0;//26;
  511.             timest <= timest + 1;
  512.           end
  513.                
  514.                 seqn <= seqn + 1;
  515.                 pixel_cnt <= 0;
  516.                     state <= DELAY_STATE;
  517.               end // if (wr_dst_rdy_i)
  518.            
  519.           end // case: CLEANUP
  520.    DELAY_STATE:
  521.      begin
  522.      if(delay < 16'd10000)
  523.             delay <= delay + 1;
  524.      else
  525.         begin
  526.             delay <= 0;
  527.             state <= IDLE;
  528.         end
  529.      end
  530.          
  531.         endcase // case (state)
  532.      
  533.       end // else: !if(reset)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement