FPGA乒乓操做你瞭解嗎? 還不趕快來看

什麼是FPGA操做web

你瞭解其中的奧祕嗎緩存

想知道更多?微信

跟小編一塊兒來學習吧編輯器

乒乓操做的處理流程爲:輸入數據經過「輸入數據選擇單元"將數據等時分配到兩個數據緩衝模塊中,在第一個緩衝週期,將輸入的數據流緩存到「數據緩衝模塊1"中,在第二個緩衝週期,經過「輸入數據單元」切換,將輸入的數據緩存到「數據緩衝模塊2’’,同時將「數據緩衝模塊1」緩存的第一個週期數據經過「數據選擇單元」的選擇,送到「數據流運算處理模塊’’進行處理,在第三個緩衝週期經過「輸入數據選擇單元"的再次切換,將輸入的數據流緩存到「數據緩衝模塊1」中,同時將「數據緩衝模塊2」緩存的第二個週期的數據經過「輸出數據選擇單元」的切換,送到「數據流運算處理模塊」進行運算處理。如此循環。學習



看完這段文字是否一臉茫然flex

別急,有更直觀的處理流程圖編碼


這樣是否更清楚了呢url

話很少說spa

接下來,讓咱們一塊兒來看幾種框圖吧.net

01

系統框圖


02

RTL級框圖


module pingpang( clk        ,

                             rst_n    ,

                            data_in  ,   //輸入數據

                            data_out    //輸出數據

                             );

 

 

 

 

   input               clk       ;

   input              rst_n     ;

   input     [7:0] data_in  ;

   output   [7:0] data_out;

  

   reg     [7:0] data_out;

   reg     [7:0] buffer1  ;    //緩存1

   reg     [7:0] buffer2  ;    //緩存2

   reg             wr_flag  ;    //寫標誌, wr_flag = 0,buffer1,wr_flag = 1,buffer2

   reg             rd_flag   ;    //讀標誌, rd_flag = 0,buffer2,wr_flag = 1,buffer1

   reg             state      ;    //狀態機, 0:121:寫21 ,狀態轉移和輸出分開編碼

   

   always @ (posedge clk or negedge rst_n)   //狀態轉移

     begin

        if(rst_n == 1'b0) state   <= 1'b0;

        else

          begin

             case(state)

                1'b0     : state   <= 1'b1;

                1'b1     : state   <= 1'b0;

                default  : state   <= 1'b0;

             endcase

          end

     end

    

   always @ (state )     //狀態輸出

     begin

      case(state)

       1'b0    : begin

                      wr_flag = 1'b0;  //1

                      rd_flag = 1'b0;  //2

               end

     1'b1    : begin

                     wr_flag = 1'b1;  //2

                     rd_flag = 1'b1;  //1

             end

     default : begin

                     wr_flag = 1'b0;

                     rd_flag = 1'b0;

               end

     endcase

   end

  

     always @ (posedge clk or negedge rst_n)

       begin

          if(rst_n == 1'b0)

            begin

               buffer1 <= 8'b0;

               buffer2 <= 8'b0;

            end

          else

            begin

               case(wr_flag)

                  1'b0     : buffer1 <= data_in;   //wr_flag = 0 ,buffer1

                  2'b1     : buffer2 <= data_in;   //wr_flag = 1 ,buffer2

                  default : begin

                               buffer1 <= 8'b0;

                               buffer2 <= 8'b0;

                            end

                endcase

            end 

       end

      

       always @ (posedge clk or negedge rst_n)

         begin

            if(rst_n == 1'b0) data_out <= 8'b0;

            else

              begin

                 case(rd_flag)

                    1'b0    : data_out <= buffer2;   //rd_flag = 0,buffer2

                    1'b1    : data_out <= buffer1;   //rd_flag = 1,buffer1

                    default : data_out <= 8'b0   ;

                 endcase

              end       

         end

      

endmodule

  

 

 

 

 

test bench:

 

 

 

 

module pingpang_tb_v;

 

 

 

 

 // Inputs

 reg         clk       ;

 reg         rst_n    ;

 reg [7:0] data_in;

 

 

 

 

 // Outputs

 wire [7:0] data_out;

 

 

 

 

 

 // Instantiate the Unit Under Test (UUT)

 pingpang uut (

  .clk         (clk       ),

  .rst_n      (rst_n     ),

  .data_in  (data_in  ),

  .data_out(data_out)

 );

 

 

 

 

 initial

   begin

  // Initialize Inputs

     clk     = 0;

     rst_n   = 0;

     data_in = 0;  

     #100;

       rst_n = 1;

     end

     

   always #10 clk = ~clk;

  

   always @ (posedge clk or negedge rst_n)

     begin

      if(rst_n == 1'b0) data_in <= 8'b0;

     else                     data_in <= data_in + 1'b1;

   end  

  

endmodule

 

03

綜合後頂層網表



長按指紋,識別二維碼,一鍵關注

本文分享自微信公衆號 - 瓜大三哥(xiguazai_tortoise)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索