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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索