Advertisement
tariq786

Untitled

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