` localparam IMG_HEADER = 32'hAA0055FF; localparam IMG_WIDTH = 32'd1280; localparam IMG_HEIGHT = 32'd720; localparam IMG_TOTAL = IMG_WIDTH*IMG_HEIGHT*3; localparam IMG_FRAMSIZE = 32'd1280; localparam IMG_FRAMTOTAL = IMG_HEIGHT*3; localparam IMG_HEADER_LEN = 6'd32;//4个64bit reg [31 :0] IMG_FRAMSEQ; reg [31 :0] IMG_PICSEQ; wire [31 :0] IMG_OFFSET = (IMG_FRAMSEQ-1'b1) * IMG_FRAMSIZE; wire [255:0] STHEADER_X86 = {IMG_FRAMSIZE,IMG_FRAMSEQ,IMG_PICSEQ,IMG_OFFSET,IMG_TOTAL,IMG_HEIGHT,IMG_WIDTH,IMG_HEADER};
always@(posedge clk_15_625 or posedge core_reset)begin if(core_reset) begin app_tx_data <= 64'd0; R0_data_r <= 128'd0; end else begin if(UDP_MS == S_UDP_ACK || UDP_MS == S_IMG_HEADER)begin app_tx_data <= STHEADER_X86[app_tx_header_cnt*8 +: 64]; end else if(UDP_MS == S_IMG_DATA)begin R0_data_r <= R0_data_o; case(RO_INDEX) 0:begin app_tx_data <={R0_data_o[47 : 40],R0_data_o[55 : 48],R0_data_o[71 : 64],R0_data_o[79 : 72],R0_data_o[87 : 80],R0_data_o[103: 96],R0_data_o[111:104],R0_data_o[119:112]};end 1:begin app_tx_data <={R0_data_o[87 : 80],R0_data_o[103: 96],R0_data_o[111:104],R0_data_o[119:112],R0_data_r[7 : 0],R0_data_r[15 : 8 ],R0_data_r[23 : 16],R0_data_r[39 : 32]};end 2:begin app_tx_data <={R0_data_r[7 : 0],R0_data_r[15 : 8 ],R0_data_r[23 : 16],R0_data_r[39 : 32],R0_data_r[47 : 40],R0_data_r[55 : 48],R0_data_r[71 : 64],R0_data_r[79 : 72]};end default:begin app_tx_data <= app_tx_data; end endcase end else begin app_tx_data <= app_tx_data; end end end
reg [11:0] vstout_cnt; wire [15:0] PACKET_INTERVAL; reg [15:0] delay_cnt;
always@(posedge clk_15_625 or posedge core_reset) begin if(core_reset) begin delay_cnt <= 16'd0; end else begin if(delay_cnt < PACKET_INTERVAL) delay_cnt <= delay_cnt + 1'b1; else delay_cnt <= 16'd0; end end
wire pkg_tx_en = (delay_cnt == PACKET_INTERVAL); vio_0 vio_debug(.clk(clk_15_625),.probe_out0(PACKET_INTERVAL));
assign R0_rden_i = (RO_INDEX == 2'd0 || RO_INDEX == 2'd2)&& (UDP_MS == S_IMG_DATA );
always@(posedge clk_15_625 or posedge core_reset) begin if(core_reset) begin app_tx_data_valid <= 1'b0; app_tx_header_cnt <= 8'd0; app_tx_data_cnt <= 12'd0; app_tx_data_last <= 1'b0; R0_FS_i <= 1'b0; IMG_PICSEQ <= 32'd0; IMG_FRAMSEQ <= 32'd0; vstout_cnt <= 12'd0; UDP_MS <= S_SYNC_1; end else begin case(UDP_MS) S_SYNC_1:begin vstout_cnt <= 12'd0; RO_INDEX <= 2'd0; R0_FS_i <= 1'b0; IMG_FRAMSEQ <= 32'd0; IMG_PICSEQ <= IMG_PICSEQ + 1'b1; UDP_MS <= S_SYNC_2; end S_SYNC_2:begin UDP_MS <= S_SYNC_3; end S_SYNC_3:begin R0_FS_i <= 1'b1; vstout_cnt <= vstout_cnt + 1'b1; if(R0_rdy_o)begin UDP_MS <= S_UDP_WAIT; end else if(vstout_cnt[11]) UDP_MS <= S_SYNC_1; end S_UDP_WAIT:begin app_tx_header_cnt <= 8'd0; app_tx_data_cnt <= 12'd0; if(udp_tx_ready&&pkg_tx_en) begin app_tx_data_req <= 1'b1;UDP_MS <= S_UDP_ACK; end else begin app_tx_data_req <= 1'b0;UDP_MS <= S_UDP_WAIT; end end
S_UDP_ACK:begin if(app_tx_ack) begin app_tx_data_req <= 1'b0; app_tx_data_valid <= 1'b1; app_tx_header_cnt <= app_tx_header_cnt + 8; IMG_FRAMSEQ <= IMG_FRAMSEQ + 1'b1; UDP_MS <= S_IMG_HEADER; end else if(dst_ip_unreachable) begin app_tx_data_req <= 1'b0;app_tx_data_valid <= 1'b0;UDP_MS <= S_SYNC_1; end else begin app_tx_data_req <= 1'b1;app_tx_data_valid <= 1'b0;UDP_MS <= S_UDP_ACK; end end
S_IMG_HEADER:begin app_tx_data_valid <= 1'b1; app_tx_header_cnt <= app_tx_header_cnt + 8; if((app_tx_header_cnt + 8) >= IMG_HEADER_LEN ) UDP_MS <= S_IMG_DATA; else UDP_MS <= S_IMG_HEADER; end
S_IMG_DATA:begin app_tx_data_valid <= 1'b1; app_tx_data_cnt <= app_tx_data_cnt + 8; if(RO_INDEX[1:0] == 2'd2) RO_INDEX[1:0] <= 2'd0; else RO_INDEX[1:0] <= RO_INDEX[1:0] + 1'b1; if((app_tx_data_cnt + 8) >= IMG_FRAMSIZE) begin app_tx_data_last <= 1'b1; UDP_MS <= S_IMG_END; end else UDP_MS <= S_IMG_DATA; end
S_IMG_END:begin app_tx_data_valid <= 1'b0; app_tx_data_last <= 1'b0; if(IMG_FRAMSEQ >= IMG_FRAMTOTAL)begin UDP_MS <= S_SYNC_1; end else begin UDP_MS <= S_UDP_WAIT; end end default: UDP_MS <= S_SYNC_1; endcase end end |