您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页FPGA中双端口RAM常用——乒乓操作

FPGA中双端口RAM常用——乒乓操作

来源:华佗健康网

“乒乓操作”通常指的是一种在系统中进行切换或交替操作的方式,像乒乓球一样来回反复。它可以应用于多种领域,尤其是在嵌入式系统、硬件设计以及信号处理中的缓冲区管理等方面。

在 FPGA 或 MCU 设计中,乒乓操作经常用来指代“双缓冲技术”(Double Buffering),即通过两个缓冲区交替进行数据读写,确保一个缓冲区在数据处理时,另一个缓冲区可用于新的数据接收或写入,从而提高系统的吞吐量和实时性。

首先,初始化两个FPGA中真双端口RAM块,均为空。

//初始化RAM块状态均为空
reg RAM_A_Status = `Empty;
reg RAM_B_Status = `Empty;

//Memory Copy 状态机
localparam s_idle   = 0;
localparam s_start  = 1;
localparam s_change = 2;
reg [1:0] RAM_State = s_idle;
reg PingPongSwitch = 1'd0;
always @(posedge CLK20 or negedge NRST) begin
   if(~NRST) begin
      RAM_State <= s_idle;
      PingPongSwitch <= 1'd0;                                                                                          //RAM写双缓存切换      
   end 
   else case(RAM_State)
      s_idle:
         if(RAM_A_Status == `Full) begin                                                                               //第一次运行开始配置,使第一缓存区连接LVDS TX,第二缓存区连接MPU
            RAM_State <= s_start;
            PingPongSwitch <= 1'd1;            
         end
         else begin
			RAM_State <= s_idle;
            PingPongSwitch <= 1'd0;    
		 end
      s_start:
         if(RAM_B_Status == `Full && !TxDataArea_Enable) begin                                         //当第二缓存区存完数据并且本次LVDS TX已从第一缓冲区读出完整数据发送,
            RAM_State <= s_change;
            PingPongSwitch <= 1'd0;            
         end                                                                                                           //                  此时第二缓存区连接LVDS TX,第一缓存区连接MPU
         else begin
			RAM_State <= s_start;
            PingPongSwitch <= 1'd1;    
		 end
	  s_change:
         if(RAM_A_Status == `Full && !TxDataArea_Enable) begin                                         //当第一缓存区存完数据并且本次LVDS TX已从第二缓冲区读出完整数据发送,
            RAM_State <= s_start; 
            PingPongSwitch <= 1'd1;            
         end                                                                                                           //                  此时第一缓存区连接LVDS TX,第二缓存区连接MPU
         else begin
			RAM_State <= s_change;
            PingPongSwitch <= 1'd0;    
		 end
   endcase
end

其实归根结底就相当于多增加一块RAM,两块RAM去存数据。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务