当前位置: 首页 > news >正文

152.当数据写入速度远大于读取时速度时控制信息的处理方法

// 双缓冲控制寄存器
reg [31:0] current_w_addr, next_w_addr;
reg [31:0] current_w_length, next_w_length;
reg current_valid, next_valid;// 写入侧 - 更新下一组寄存器
always @(posedge w_clk) beginif (w_frame_start) begin  // 帧开始信号next_w_addr <= w_addr;next_w_length <= w_length;next_valid <= 1'b1;end
end// 读取侧 - 切换当前使用的寄存器
always @(posedge r_clk) beginif (current_frame_done) begin  // 当前帧读取完成current_w_addr <= next_w_addr;current_w_length <= next_w_length;current_valid <= next_valid;next_valid <= 1'b0;  // 清除下一组有效标志end
end

// 控制信息FIFO - 深度根据最大堆积量设计
fifo #(.DATA_WIDTH(64),  // 32位地址 + 32位长度.DEPTH(16)        // 深度足够容纳堆积的控制信息
) ctrl_fifo (.wr_clk(w_clk),.wr_en(w_frame_start),     // 每帧开始时写入控制信息.din({w_addr, w_length}),.rd_clk(r_clk),.rd_en(r_frame_start),     // 读取模块开始处理新帧时取出.dout({current_addr, current_length}),.empty(ctrl_fifo_empty),.full(ctrl_fifo_full),.data_count()             // 可选的,用于监控堆积情况
);// 读取模块状态机
localparam IDLE = 2'b00;
localparam READING = 2'b01;
localparam DONE = 2'b10;reg [1:0] read_state;always @(posedge r_clk) begincase(read_state)IDLE: if (!ctrl_fifo_empty) beginr_frame_start <= 1'b1;read_state <= READING;endREADING:if (frame_read_done) beginread_state <= DONE;endDONE:beginr_frame_start <= 1'b0;read_state <= IDLE;endendcase
end

// 三组缓冲区,防止溢出
reg [31:0] addr_buf[0:2];
reg [31:0] len_buf[0:2];
reg [1:0] wr_ptr = 2'b00;
reg [1:0] rd_ptr = 2'b00;
reg [2:0] buf_valid = 3'b000;// 写入侧
always @(posedge w_clk) beginif (w_frame_start && (wr_ptr != rd_ptr || !buf_valid[rd_ptr])) beginaddr_buf[wr_ptr] <= w_addr;len_buf[wr_ptr] <= w_length;buf_valid[wr_ptr] <= 1'b1;wr_ptr <= wr_ptr + 1;  // 循环递增end
end// 读取侧
always @(posedge r_clk) beginif (frame_read_done && buf_valid[rd_ptr]) beginbuf_valid[rd_ptr] <= 1'b0;rd_ptr <= rd_ptr + 1;  // 循环递增end
end// 当前使用的控制信息
assign current_addr = addr_buf[rd_ptr];
assign current_length = len_buf[rd_ptr];

方案3:基于计数器的同步机制

// 帧计数器同步
reg [7:0] w_frame_cnt = 8'd0;
reg [7:0] r_frame_cnt = 8'd0;
reg [7:0] sync_frame_cnt = 8'd0;// 控制信息RAM
reg [31:0] ctrl_ram [0:255];
reg [7:0] wr_index = 8'd0;// 写入侧
always @(posedge w_clk) beginif (w_frame_start) beginctrl_ram[wr_index] <= {w_addr, w_length};  // 合并存储w_frame_cnt <= w_frame_cnt + 1'd1;wr_index <= wr_index + 1'd1;end
end// 同步计数器到读取时钟域
always @(posedge r_clk) beginsync_frame_cnt <= w_frame_cnt;
end// 读取侧
always @(posedge r_clk) beginif (sync_frame_cnt != r_frame_cnt) begin// 有新的帧信息current_ctrl <= ctrl_ram[r_frame_cnt[7:0]];r_frame_cnt <= r_frame_cnt + 1'd1;end
end

http://www.dtcms.com/a/597061.html

相关文章:

  • 【MQ】集群部署和可靠性攻略
  • 数字上变频DUC与数字下变频DDC的介绍
  • 网站换代理wordpress首页链接哪里设置
  • 【Git】请帮忙解释一下“git reset”
  • Linux 二进制兼容性的糟糕现状(以及如何解决)
  • Next.js第三章(App Router)
  • 长芯微LPS1032完全P2P替代LM3880,LPS1032系列产品是简单的电源序列器,提供多通道电源的加电和断电顺序控制。
  • 百度提交网站收录建筑网址大全
  • TensorFlow深度学习实战——胶囊网络
  • [Linux]学习笔记系列 -- [kernel]kallsyms
  • 手机代理企业网站wordpress农业站模板
  • 门户网站开发的意义ppt 做的最好的网站有哪些
  • 龙岗AI搜索优化亲测效果分享
  • 【多源 BFS】1. 01 矩阵(medium)
  • 物联网工控一体机操作系统选型:安卓、Ubuntu、Debian 场景化决策指南
  • 【代码审计】RuoYi-4.2 五处安全问题分析
  • 如何制作自己的网站并且插口代码wordpress .htaccess 伪静态
  • 【openGauss】谈一谈openGauss对Oracle中lob类型的兼容情况
  • 【自然语言处理】WordNet与知网:支撑自然语言理解的词汇知识库双璧
  • 怎么自己弄一个网站编程课程收费标准
  • Vue 项目实战《尚医通》,登录组件获取验证码,笔记25
  • 【无标题】六边形拓扑量子计算:NP完全问题的统一解决框架
  • IDEA下载
  • 网站自己做需要多少钱中国住建部和城乡建设部
  • 电磁波传播理论的数学描述和python模拟
  • 符合网络营销网站建设郑州威盟网站建设公司怎么样
  • 金阊企业建设网站公司wordpress教程cms
  • 李沐深度学习笔记D3-基础的优化方法
  • 【MCP:七千字图文详解】从灵感闪现到生态确立,全链路解读与实战
  • GitHub 热榜项目 - 日榜(2025-11-11)