快到慢的跨时钟域处理

2023-11-14

如果你写过异步FIFO,格雷码的传输就已经包括慢时钟域到快时钟域以及快时钟域到慢时钟域的处理方法了,自己之前的异步FIFO由于理解没到位,快时钟域到慢时钟域的处理也是打拍,原因是快时钟域的时钟频率不够快。所以debug没问题。

步入正题
快到慢常用异步握手。
握手包括同步握手和异步握手;

1、同步握手:
AXI协议的VALID 和 READY信号就是同步握手关系;

2、异步握手(参考除夕之夜微信公众号)
同步逻辑设计中,脉冲信号是指从快时钟域输出的有效宽度小于慢时钟周期的信号。如果慢时钟域直接去采集这种窄脉冲信号,有可能会采集不到。
◆假如这种脉冲信号脉宽都是一致的,在知道两个时钟频率比的情况下,可以采用“快时钟域脉宽扩展+慢时钟域延迟打拍”的方法进行同步。
◆如果有时窄脉冲信号又表现出电平信号的特点,即有时信号的有效宽度大于慢时钟周期而能被慢时钟采集到,那么对此类信号再进行脉冲扩展显然是不经济的。此时,可通过“握手传输”的方法进行同步。
假设脉冲信号的高电平期间为有效信号期间,其基本原理如下。
(1) 快时钟域对脉冲信号进行检测,检测为高电平时输出高电平信号 pulse_fast_r。或者快时钟域输出信号时,不要急于将信号拉低,先保持输出信号为高电平状态。
(2) 慢时钟域对快时钟域的信号 pulse_fast_r 进行延迟打拍采样。因为此时的脉冲信号被快时钟域保持拉高状态,延迟打拍肯定会采集到该信号。
(3) 慢时钟域确认采样得到高电平信号 pulse_fast2s_r 后,再反馈给快时钟域。
(4) 快时钟域对反馈信号 pulse_fast2s_r 进行延迟打拍采样。如果检测到反馈信号为高电平,证明慢时钟域已经接收到有效的高电平信号。如果此时快时钟域自身逻辑不再要求脉冲信号为高电平状态,拉低快时钟域的脉冲信号即可。
此方法实质是通过相互握手的方式对窄脉冲信号进行脉宽扩展。

上代码:

module pulse_f2s(
input wire rstn,
input wire clk_fast,
input wire pulse_fast,
input wire signal_slow2fast,

output reg pulse_fast2slow
);
//快时钟域检测脉冲送到慢时钟域,等待慢时钟域反馈的信号打两拍
//这个pulse_slow送到慢时钟域打两拍才能用
parameter PULSE_INIT=1'b0;
wire clear_n;
reg signal_slow_r1,signal_slow_r2;
reg pulse_fast_ff1,pulse_fast_ff2,pulse_fast_ff3;


always@(posedge clk_fast or negedge rstn) begin
    if (!rstn)
        {pulse_fast_ff3,pulse_fast_ff2,pulse_fast_ff1}<='b0;
    else 
        {pulse_fast_ff3,pulse_fast_ff2,pulse_fast_ff1}<={pulse_fast_ff2,pulse_fast_ff1,pulse_fast};
end

always@(posedge clk_fast or negedge rstn) begin
    if (!rstn)
        pulse_fast2slow<='b0;
    else if(~clear_n & ~pulse_fast2slow)
        pulse_fast2slow<=~pulse_fast_ff3 & pulse_fast_ff2;
    else if(clear_n & pulse_fast2slow)
        pulse_fast2slow<='b0;
end

always@(posedge clk_fast or negedge rstn) begin
    if (!rstn)
        {signal_slow_r2,signal_slow_r1}<='b0;
    else 
        {signal_slow_r2,signal_slow_r1}<={signal_slow_r1,signal_slow2fast};

end

assign clear_n=signal_slow_r2;


endmodule
`timescale 1ns/1ps
module tb_pulse_f2s();
reg clk_fast;
reg rstn;
reg pulse_fast;
reg signal_slow2fast;
wire pulse_fast2slow;
//快时钟域20ns 慢时钟域50ns
    
initial begin
	clk_fast<=1;
	rstn=1;
    #(20)
	rstn=0;
	#20;
	rstn<=1;
end
always #10 clk_fast=~clk_fast;

initial begin
    pulse_fast='b0;
    signal_slow2fast=0;
    #(60)
	pulse_fast='b1;
	#20;
	pulse_fast='b0;
    #300 signal_slow2fast='b1;
    #50 signal_slow2fast=1'b0;
end   



pulse_f2s pulse_f2s_inst(
.rstn(rstn),
.clk_fast(clk_fast),
.pulse_fast(pulse_fast),
.signal_slow2fast(signal_slow2fast),

.pulse_fast2slow(pulse_fast2slow)
);

endmodule



测试图:黄线之间握手
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快到慢的跨时钟域处理 的相关文章

  • $readmem 可以在 Verilog 中综合吗?

    我正在尝试在 FPGA 上实现微控制器 我需要为其程序提供一个 ROM 如果我使用 readmemb 它会被正确合成到 ROM 中吗 如果不是 执行此操作的标准方法是什么 这取决于合成工具是否 readmemb是可以合成的 阿尔特拉的推荐的
  • 何时使用tick(')进行Verilog数组初始化?

    数组初始化可以通过或不通过 int a 8 0 1 2 3 4 5 6 7 Packed int b 8 0 1 2 3 4 5 6 7 Unpacked 有没有correct方式 假设数组使用不可打包的类型 例如int string ET
  • 在verilog中使用for循环生成

    我试图理解为什么我们在verilog 中使用generate 和for 循环 一起使用生成和 for 循环 reg 3 0 temp genvar i generate for i 0 i lt 3 i i 1 begin always p
  • Verilog HDL 循环语句错误:具有非常量循环条件的循环必须终止

    我对 Verilog 完全陌生 对于我在大学学习的课程 我必须很快了解它的很多内容 我正在摆弄我的 Altera DE2 板和 quartis2 并了解其细节 我正在尝试制作一个通过开关打开和关闭的计数器 到目前为止 计数器根据按键进行计数
  • EDAplayground 中不显示时钟波形

    当尝试在 EDA Playground 中显示时钟波形时 出现错误 执行中断或达到最大运行时间 如何显示波形 EDA Playground 上的代码 module test reg clk initial begin dumpfile du
  • 为什么这个 verilog 关系语句返回 true?

    我有一条名为 sin hall2 的 9 位签名线 该语句返回 true sin hall2 8 0 gt 9 d1 当我查看模拟时 sin hall2 169 我假设这是 verilog 处理比较负数的方式 但我做错了什么 当我执行 si
  • 如何在verilog中逐行读取文本文件?

    我有一个 SREC 文件 它是一个简单的文本文件 我想在 verilog 中逐行读取它 我怎样才能做到这一点 以下读取文件 每个时钟周期 1 行 预期的数据格式是每行一个十进制数 integer data file file handler
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 如何使用 Verilog 和 FPGA 计算一系列组合电路的传播延迟?

    我是 FPGA 和 HDL 的新手 但我正在尝试学习 但无法弄清楚这一点 如何通过多个级别的组合逻辑来计算或估计传播延迟 我可以仅凭经验确定这一点 还是可以在设计时弄清楚 在这种情况下 我使用 FPGA 来实现奇偶校验设置和检查电路 该电路
  • 如何使用 don't cares 参数化 case 语句?

    我有一条称为输入的电线 我想检测前导的数量 我正在尝试创建一个模块 该模块使用下面的 case 语句根据前导零的数量更改输出数据 然而 输入的大小是可参数化的 如果 X 是固定值 4 我将创建一个 case 语句 case input 4
  • 在 Mac OS X 10.6.8 上用什么来编译和模拟 Verilog 程序?

    作为教学大纲的一部分 我需要模拟 Verilog 程序 但是 我的大学使用 Xilinx ISE 但它不适用于 Mac 因此 请帮助我提供最好的软件以及有关如何安装和使用它们的一些详细步骤 你可以尝试伊卡洛斯 Verilog http iv
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 在 Verilog 设计中产生时钟故障

    我正在使用 Verilog 设计芯片 我有一个 3 位计数器 我希望当计数器处于第 8 次循环时 应该有一个时钟故障 之后就可以正常工作了 在 Verilog 设计中产生时钟故障的可能方法是什么 在时钟信号上注入毛刺的一种方法是使用forc
  • 为什么 Verilog 不被视为编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 教授在课堂上说学生不应该说他们学会了用Verilog 编程 他说 Verilog 之类的东西不是用来编程的 而是用来设计的 那么 Verilog
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • 系统 verilog 中没有类型的输入

    我在一个系统 verilog 代码的输入和输出的示例中遇到过module没有说明它们的类型 例如logic wire module mat to stream input 2 0 2 0 2 0 a b input newdata inpu
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和

随机推荐

  • 【分布式-Redis应用】Spring中Redis使用项目实战(持续更新...)

    TOC 目录标题 场景及代码示例 1 list集合存储到Redis以及读取 import org springframework data redis core StringRedisTemplate Autowired private S
  • qt对excel的基本操作

    qt对excel的基本操作 1 环境 1 1 配置方面 确保Excel软件在本地服务器注册成功 没注册成功的可以通过 在运行中 E program Files Microsoft Office Office12 EXCEL EXE regs
  • 代数余子式与伴随矩阵

    关系 例题 伴随矩阵运算
  • redis配置文件限制只能本地访问问题,虚拟机无法访问

    解决 修改配置文件 daemonize no 用守护线程的方式启动 requirepass yourpassword 给redis设置密码 bind 192 168 1 1 注释掉这部分 这是限制redis只能本地访问 appendonly
  • 双栈排序 二分图匹配

    题目链接 https www acwing com problem content description 155 题目 Tom最近在研究一个有趣的排序问题 通过2个栈S1和S2 Tom希望借助以下4种操作实现将输入序列升序排序 操作a 如
  • (十一)jmeter-集合点---学习笔记

    集合点 简单来理解一下 虽然我们的 性能测试 理解为 多用户并发测试 但真正的并发是不存在的 为了更真实的实现并发这感念 我们可以在需要压力的地方设置集合点 每到输入用户名和密码登录时 所有的虚拟用户都相互之间等一等 然后 一起访问 注意
  • Acwing-4655. 重新排序

    我们可以累计每个 A i 的被求和次数 c i 容易贪心得到 被求和次数越多的肯定得放越大的数 我们可以先统计原来的求和的总和 sum 再给 A 数组和统计求和次数的数组 c 从小到大排好序 最后依次相乘起来即 i 1 n a i c i
  • Win10+VS2015编译caffe踩坑记录

    跑HTM的代码要用到caffe的库 从学长那拷过来的工程里是用VS2013编译的 只能用自己的VS2015重新编译一下 记录一下编译过程 环境 Windows10 VS2015 cuda8 0 cudnn5 1 CMake3 17 0 An
  • 漂亮的弹出框,javascript库bootbox介绍

    传统的javascript的警告框 确认框 提示框
  • 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行讲解 主要通过MFC单文档视图实现显示BMP格式图片 并通过Bitmap进行灰度处理 图片采样和量化功能 个人认为对初学者VC 6 0
  • python 如何解决 No module named ‘pip‘问题

    在下载python第三方库的时候 突然报错 解决方法很简单 两行代码就行了 python m ensurepip easy install pip 此时下载 还不行 提示说要更新pip python m pip install upgrad
  • python 21点

    21点 你可以叫我仁哥 也可以叫我情哥 mua 没请教 21点黑杰克 代码部分 相关说明 我做的是一个简化了的21点没有分牌操作 21点黑杰克 废话不多说先上代码 代码部分 import random import time 延时的这里可以
  • MySql中的先聚合再筛选与先筛选再聚合

    MySql中的先聚合再筛选与先筛选再聚合 where字句在聚合前先筛选记录 也就是说作用在group by和having字句前 而 having子句在聚合后对组记录进行筛选 事例 一 显示每个地区的总人口数和总面积 SELECT area
  • mysql主从同步

    set global server id 2 show slave status 查看binlog日志信息 stop slave change replication filter replicate do db bypass change
  • Qt 控件设置透明和半透明方法汇总

    遇到了好多次控件有需要设置为透明和半透明的情况 每次都是去网上搜一搜 看看别人怎么实现的 浪费了很多时间 故在这里进行一个总结 希望对自己有一个提升 本文对透明的各种情况进行了分类 整个窗口及窗口下的控件都是半透明的状态 分类一 只有窗口是
  • LeetCode_BinaryTree_337. House Robber III 打家劫舍 III【动态规划】【Java】【中等】

    目录 一 题目描述 英文描述 中文描述 示例与说明 二 解题思路 三 AC代码 Java 四 解题过程 第一搏 第二搏 一 题目描述 英文描述 The thief has found himself a new place for his
  • JAVA环境配置及如何解决win10重启后环境配置失效的问题

    一 配置JAVA环境 1 JDK的下载与安装 进入官网下载对应版本 注意 安装路径最好不要包含中文或空格等特殊字符 最好使用纯英文目录 2 配置环境变量的步骤 1 按下win E键 找到此电脑 右键选择属性 点击高级系统设置 在高级中点击右
  • 完美解决python pip安装超时问题

    书接上文 安装python过程中 国外镜像太慢了 使用国内源 1 设置超时时间 pip default timeout 100 install Pillow 2 不使用缓存 pip no cache dir install Pillow 2
  • (pytorch进阶之路)DDPM扩散概率模型

    文章目录 概述 前置知识 diffusion图示 扩散过程 逆扩散过程 后验的扩散条件概率 似然函数 算法 代码实现 概述 扩散概率模型 deep unsupervised learning using nonequilibrium the
  • 快到慢的跨时钟域处理

    如果你写过异步FIFO 格雷码的传输就已经包括慢时钟域到快时钟域以及快时钟域到慢时钟域的处理方法了 自己之前的异步FIFO由于理解没到位 快时钟域到慢时钟域的处理也是打拍 原因是快时钟域的时钟频率不够快 所以debug没问题 步入正题 快到