最近遇到一个项目,就是接收数据转换成本地数据。两个时钟是频率是基本一样,但是存在5%偏差,而且存在相位差。

 这是基本需求。一般转换的办法就是fifo写入有效数据,然后用empty读取出来。但是发现有个问题。就是如果两个帧之间间隔太短了,会导致读取的时候,两帧的数据会连续成一帧数据。解决办法就是把写使能也要加入到fifo中,把前后使能无效+数据,也是写入到fifo,恢复的时候再恢复到有效数据。

wire wrfifo_wren;
assign wrfifo_wren = serdes_en_d2 | serdes_en;

wire[32:0] wrfifo_wrdata;
assign wrfifo_wrdata = { serdes_en_d0,rx_data_lock_d0};

二个关于频率偏差问题,很多人都是内部count 来判断,好在xilinx由prog-empty,可以编程的empty,选择两个状态。这样在拉低信号,判断fifo是否写入数据,再读取。

.prog_empty(fifo_almost_empty)
   );
  
 reg fifo_almost_empty_d0;
 reg fifo_almost_empty_d1;
 reg fifo_almost_empty_d2;
 reg fifo_almost_empty_d3;
 reg fifo_almost_empty_d4;
  always @(posedge    ref_clk)
 begin
    fifo_almost_empty_d0 <= fifo_almost_empty;
    fifo_almost_empty_d1 <= fifo_almost_empty_d0;
    fifo_almost_empty_d2 <= fifo_almost_empty_d1;
    fifo_almost_empty_d3 <= fifo_almost_empty_d2;
    fifo_almost_empty_d4 <= fifo_almost_empty_d3;
 end
 
 reg fifo_rd_en_temp ;
 always @(posedge    ref_clk)
 begin
    if( fifo_almost_empty_d4 == 0)
        fifo_rd_en_temp <= 1;
     else if( fifo_empty)
        fifo_rd_en_temp <= 0; 
  end

三个问题,fifo其中写的时钟会波动,中途可能会停掉,因为上电复位过程会停止时钟,中途也会停止时钟。很多fifo对这个时钟是没有讲解的,发现的现象竟然是full信号一直为慢的信号。empty也是空的信号,后面的数据根本写入不了。解决办法就是,直接判断full信号,复位fifo。这样稳定时钟又可以写入数据。

注意同步复位,要求是最慢的时钟的三个时钟以上有效。

wire lock_fail_rising;
assign lock_fail_rising = (( lock_fail_temp_d1 == 1'b0) & (lock_fail_temp_d0 ==1'b1));

wire       fifo_full;
reg fifo_full_d0;
reg fifo_full_d1;
reg fifo_full_d2;
always @(posedge    ref_clk)
begin
    fifo_full_d0 <= fifo_full;
    fifo_full_d1 <= fifo_full_d0;
    fifo_full_d2 <= fifo_full_d1;
end
reg lock_fail_rising_d0;
reg lock_fail_rising_d1;
reg lock_fail_rising_d2;
reg lock_fail_rising_d3;
reg lock_fail_rising_d4;
reg lock_fail_rising_d5;
reg lock_fail_rising_d6;
always @(posedge    ref_clk)
begin
    lock_fail_rising_d0 <= lock_fail_rising| fifo_full_d2 ;
    lock_fail_rising_d1 <= lock_fail_rising_d0;
    lock_fail_rising_d2 <= lock_fail_rising_d1;
    lock_fail_rising_d3 <= lock_fail_rising_d2; 
    lock_fail_rising_d4 <= lock_fail_rising_d3; 
    lock_fail_rising_d5 <= lock_fail_rising_d4; 
    lock_fail_rising_d6 <= lock_fail_rising_d5; 
end

assign rd_rst = lock_fail_rising_d6 | lock_fail_rising_d0;

关于双独立时钟fifo的一些细节探讨的更多相关文章

  1. 异步时钟FIFO(一)

    FIFO一般用于通过两个不同时钟域的数据传输.一个水池有进和出两个通道,由于进出口水流不一致所以需要水池加以缓冲.堆栈也是相当于水池的作用.如果输入端不是连续的数据流,可以通过堆栈来调节使数据以稳定的 ...

  2. Windows和Ubuntu双系统时钟同步的方法。

    参考文章 https://blog.csdn.net/zyqblog/article/details/79318955 电脑安装Ubuntu和Windows双系统以后,每次Ubuntu时间和时区设了以 ...

  3. DataInputStream和DataOutputStream使用方法细节探讨

    DataInputStream和DataOutputStream都是Java中输入输出流的装饰类,用起来非常方便.今天就来讨论一下使用该类时候遇到的编码问题.  package com.vince ...

  4. php foreach 遍历细节探讨

    foreach 也是正常的语法循环结构,可以有 break 和 continue 等操作 遍历过程中值变量传递默认是值传递 输出结果为: 遍历过程中值变量可以认为设定为引用传递:foreach($数组 ...

  5. vue路由细节探讨

    1.使用router-link 不会让页面刷新,使用a标签会使页面刷新.2.router-link 里面的to="/路由地址" tag=""自定义标签" ...

  6. IP核之初——FIFO添加以太网MAC头部

    本文设计思路源自明德扬至简设计法.在之前的几篇博文中,由于设计比较简单,所有的功能都是用verilogHDL代码编写实现的.我们要学会站在巨人的肩膀上,这时候就该IP核登场了! 说白了,IP核就是别人 ...

  7. Altera FIFO IP核时序说明

    ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...

  8. 嵌入式FIFO核的调用

    本次设计源码下载地址:http://download.csdn.net/detail/noticeable/9915523 课程目标:学习调用quartus II 软件的FIFO(先进先出)IP核,并 ...

  9. FIFO IP核

    转载: 说白了,IP核就是别人做好了的硬件模块,提供完整的用户接口和说明文档,更复杂的还有示例工程,你只要能用好这个IP核,设计已经完成一半了.说起来容易,从冗长的英文文档和网上各个非标准教程中汲取所 ...

  10. FPGA基础学习(2) -- FIFO IP核(Quartus)

    ALTERA在LPM(library of parameterized mudules)库中提供了参数可配置的单时钟FIFO(SCFIFO)和双时钟FIFO(DCFIFO).FIFO主要应用在需要数据 ...

随机推荐

  1. 图片动态操作,利用SeekBar控制属性示例,适配屏幕解决方案

    需求为,让图片适配屏幕大小,并且可以用一个滑块来控制图片的旋转,用一个滑块来控制图片大小,核心语法思路,控制图片的大小, 核心语法为:mImageView.setLayoutParams(new Li ...

  2. 一文搞定POI,再也不怕excel导入导出了

    写在前面 在Java日常开发过程中,实现Excel文件的导入导出功能是一项常见的需求. 通过使用相关的Java库,如Apache POI.EasyPoi或EasyExcel,可以轻松地实现Excel文 ...

  3. 2023中山市第三届香山杯网络安全大赛初赛wp

    序 被带飞了 PWN move 先往变量 sskd 写入 0x20 字节,往第二个输入点输入 0x12345678 即可进入到第三个输入点,存在 0x8 字节的溢出.思路是在第一个输入点布置 rop ...

  4. 后端基础PHP-PHP简介及基本函数

    后端基础PHP-PHP简介及基本函数 1.PHP简单介绍 2.PHP基本语法 一.PHP简单介绍 PHP(超文本预处理器),是一种通用的开源脚本语言,标准的后端语言 比较常见的后端语言,ASP|ASP ...

  5. day02-事件处理机制

    5.Java事件处理机制 5.1小球移动案例 通过监听键盘按键,实现小球的移动 例子: package li.gui.even_; import javax.swing.*; import java. ...

  6. RAG 范式、技术和趋势

    这里分享同济大学 Haofen Wang的关于检索增强生成的报告:<Retrieval-Augmented Generation (RAG): Paradigms, Technologies, ...

  7. 记录--前端路由 hash 与 history 差异

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 简单介绍 Vue Router Vue Router 是 Vue.js 官方的路由插件,它和 Vue.js 是深度集成的,适合用于构建单页 ...

  8. 美团一面:说一说Java中的四种引用类型?

    引言 在JDK1.2之前Java并没有提供软引用.弱引用和虚引用这些高级的引用类型.而是提供了一种基本的引用类型,称为Reference.并且当时Java中的对象只有两种状态:被引用和未被引用.当一个 ...

  9. Python glob库的用法

    一.匹配指定文件夹下的所有文件 files = glob.glob("C:\\Users\\liuchunlin2\\Desktop\\测试数据\\*") print(files) ...

  10. Web Audio API 第2章 完美的播放时机控制

    Web Audio API 第2章 完美的播放时机控制 相较于 标签, Web Audio API 拥有低延迟精确定时模型. 低延时对于游戏或交互式应用来说非常重要,因为交互操作时要快速响应给用户的听 ...