FPGA初步弄了个视频采集

    有一块板子,我在之上搞了一个视频输入、输出,本人初接FPGA,完全以cpu、dsp方式看FPGA,对于IP类极不适应,看别人弄FPGA鼠标轻点,一会功夫就建立起来一个系统,真是羡慕啊。

我模仿也搭建一个:

输入输出完全是手工编码:

   输入:

always@(posedge rx_clk or negedge rst_n)  //实用
    begin 
        if ((rst_n == 0) || (M_AXI_ARESETN == 0 ))begin
            rx_df <= `F_SDE;
            ptr_fd <= 3'd0;
            d_page <= 2'd0;
            linebytes<=32'd0;
            linebyte <=32'd0;
            d_pages <=32'd0;
            r1234 <= 3'd1;
            f_width <= 'h308;
            f_higth <= 'd288;
            ptr_d <= 'd0;
            len_con_a <= 'd0;
            rx_1234 <= 'd1;
        end else begin         
           rx_dv_er = 1'b0;
           if ((rx_dv == 1'b1) & (rx_er == 1'b0)) begin      
                rxd = rx_d;
                rx_dv_er = 1'b1;
                if (rx_df == `F_SDE) begin
                    case (ptr_fd) 
                        3'd0:begin
                            if ( (rxd == 16'hc54a) || (rxd == 16'hc53a) ) begin 
                                if (rxd == 16'hc54a) 
                                    ptr_fd = ptr_fd + 3'd1;
                                else ptr_fd = ptr_fd + 3'd3;
                             end
                             else ptr_fd = 3'd0;   
                        end   
                        3'd1:
                            if (rxd == 16'ha34c) //a34c
                                ptr_fd = ptr_fd + 3'd1;
                            else ptr_fd = 3'd0;
                        3'd2: begin
                           if (rxd == 16'hc54a) begin//c54a
                                ptr_fd = ptr_fd + 3'd3;
                                isDL = 1'd1;
                            end
                            else ptr_fd = 3'd0;
                         end
                        3'd3:
                            if (rxd == 16'ha35c) //a34c
                                ptr_fd = ptr_fd + 3'd1;
                            else ptr_fd = 3'd0;
                        3'd4: begin
                            if (rxd == 16'hc53a) begin//c54a
                                ptr_fd = ptr_fd + 3'd1;
                                isDL = 1'd0;
                            end
                            else ptr_fd = 3'd0;
                        end
                        3'd5:  begin
                            if ((rxd >= 16'h5009 ) && (rxd <= 16'h500c)) begin     
                                rx_1234 = rxd-16'h5008;
                                ptr_fd = ptr_fd + 3'd1;
                             end else ptr_fd = 3'd0;
                        end
                        3'd6: begin
                            if (((rxd & 16'hf000)==16'd0) && (rxd >= 16'd10)) begin  //3072 = 0xc00   0xfff
                               length = rxd;
                               ptr_fd = ptr_fd + 3'd1;
                            end else ptr_fd = 3'd0;
                        end
                        3'd7:begin
                            if ((rxd & 16'hf800)==16'd0) begin  
                               //len_con_a = 'd8;//rxd;
                               ptr_fd = 3'd0;
                               rx_df = `F_DATA;                   
                               ptr_d = 'd0;                                                   
                            end else ptr_fd = 3'd0;
                        end
                        default: begin
                            ptr_fd = 3'd0;
                        end
                    endcase
                end else begin             //rx_df == `F_DATA;
                    if (rx_1234==3'd1) begin              
                          led1_t = 1;
                          if (ptr_d < 5 ) begin
                                d_attr[ptr_d] = rxd;
                                ptr_d = ptr_d + 1'd1;
                          end else begin
                                if (isDL) begin
                                    f_width = 768;//d_attr[0]-14;       
                                    f_higth = 288;//d_attr[1]-8;       //208= 520   实际 512   
                                end else begin
                                    f_width = 960;
                                    f_higth = 512;//
                                end       
                                len_con_a = 0;
                                rx_df = `F_SDE;
                                ptr_d = 0;
                           end                  
                    end else  begin    
                            if (ptr_d<'d1024) oneline[ptr_d] = rxd;
                            ptr_d = ptr_d +1'd1;                            
                            if (ptr_d < (f_width-1)) begin
                               if (ptr_d == f_width/2 ) led1_t = 1'b0;
                               if (ptr_d == f_width/2) INIT_AXI_TXN = 1'b0; // led1_t = 1'b0;
                            end else begin
                                ptr_d = 'd0;            //注意 一定要清 0
                                rx_df = `F_SDE;
                                linebyte = len_con_a*2;
                                len_con_a = len_con_a + 1'd1;   //
                                if (linebyte >= (f_higth)) begin  //
                                    linebyte = linebyte - (f_higth)+1;
                                end
                                linebyte = linebyte << C_MASTER_LENGTH;
                                linebyte = linebyte+d_pages;                                         
                                //linebyte = linebyte+32'h10_0000;                                         
                                linebytes =  linebyte+C_M_TARGET_SLAVE_BASE_ADDR ;      
                               
     //for (i=0;i<1024;i=i+1) oneline[i]=i;                          
                                //led1_t =1'd1;                      
                                INIT_AXI_TXN = 1'b1;
                                if( (len_con_a > ( f_higth-1) ) || ( rx_1234==4 ) ) begin
                                    d_page = d_page+1'd1;           //0,1,2,3   
                                    if (d_page == 'd6) begin
                                        d_page = 'd0;
                                    end
                                     frame = d_page >> 1;
                                     d_pages = d_page;
                                     d_pages = d_pages << 20;                                          
                                     len_con_a = 0;
                                 end
                            end
                        end
                  end
            end
        end
    end

输出:

always@(negedge en_clk)  //仿真用
    begin 
         if ((rst_n==0))begin
            //cols = 11'd0;
            //row = 10'd0;
            data = 8'd0;
            hsvs = 0;
            oe = 0;
         end else begin
            hsvs = ~hsvs;
                 if (cols <= 11'd283) begin
                    if (cols < 11'd3) begin
                        case (cols) 
                            0:begin
                                data = 8'hff;                        //0
                                if (video) begin
                                    
                                    if (row>=335) begin 
                                        row_n = (row - 335)+ 288;            
                                    end
                                    else
                                        row_n = (row-22)  ;                
                                end                    
                              end
                            1:begin
                                data = 8'h00;                        //1
                                if (video) begin                                  
                                    // 0      1     2      3       4     5    6      7    ....   284    285   286    287     288  289  290  291  .. .572   573    574  575
                                    // 0_0   1_0   0_144  1_144   0_1   1_1  0_145  1_145 ....                                                      0_143 1_143 0_287 1_287                                    
                                    // 0_0   1_0   0_1    1_1     0_2    1_2  0_3   1_3 ...    
                                    // row_n = row_n / 2;         //0  0   1  1   2  2
                                     
                                     rlinebyte = (row_n /2) ;
                                end
                              end
                            2:begin
                                data = 8'h00;                        //2
                                if (video) begin
                                    //if (row_n[0] == 1) rlinebyte = rlinebyte+144;
                                    rlinebyte = rlinebyte << C_MASTER_LENGTH;// 11;  //*1024; //2^10, *2048:11                                      
                                end
                              end
                        endcase
                    end else begin
                        case (cols)
                            3: begin 
                                 data = EAV(row);                       //3
                                 if (video) begin
                                    if (oe)  rlinebyte = rlinebyte + 32'h10_0000;                                                                          
                                    //rlinebyte = rlinebyte + 'h10_0000;
                                     if (frame==0) row_n = 2; //借用
                                     else row_n = frame - 1;
                                 end
                               end
                            4: begin 
                                 data = 8'h80;
                                 if (video) begin
                                     rlinebyte = rlinebyte + (32'h20_0000 * row_n);
                                 end       
                               end
                            5: begin 
                                 data = 8'h10;
                                 if (video) begin
                                     rlinebytes = rlinebyte+C_M_TARGET_SLAVE_BASE_ADDR;      
                                     INIT_AXI_TXN_R = 1'b1;
                                  end
                                end
                            6: begin 
                                  data = 8'h80;
                                  INIT_AXI_TXN_R = 1'b0;
                                end
                            default: begin
                                data = (cols[0] == 0) ? 8'h80 : 8'h10;  //4~283
                            end   
                         endcase                     
                    end
                 end else begin
                    if (cols < 11'd287) begin
                        case (cols) 
                            284:begin 
                                    data = 8'hff;                        //284
                                end
                            285:begin 
                                    data = 8'h00;                        //285
                                end
                            286:begin 
                                    data = 8'h00;                        //286
                                end
                        endcase
                    end else begin
                        if (cols==11'd287) begin
                            data = SAV(row);                         //287
                        end else begin
                            //if ((row >= 22 && row <= 309) || (row >= 335 && row <= 622)) 
                            if (video)                           
                                data = colorValue(cols);                //288~1727
                            else
                                data = (cols[0] == 0) ? 8'h80 : 8'h10;  //288~1727
                        end
                    end
                 end 
                 if (cols < 11'd1727) begin
                    cols = cols + 1'b1;
                 end
                 else begin 
                    cols = 11'd0; 
                    hsvs = 0;
                    if (row < 10'd624) begin
                        row = row + 1'b1;
                        oe = ~oe;
                    end else begin
                        row = 10'd0;
                        oe = 0;
                    end
                    if (((row >= 22 && row <= 309)) || ((row >= 335 && row <= 622))) begin
                        video = 1;
                    end else video = 0;
                 end
         end 
    end    
 


    最后我见到视频出来了:

    


版权声明:本文为lzp9619876原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。