秋招准备——2.跨时钟相关
格雷码+异步FIFO+跨时钟域处理
格雷码
一、格雷码规律
- 相邻性:相邻两个数的格雷码只有一位不同,例如:
0000
→0001
(仅最低位变化)0001
→0011
(仅次低位变化)0011
→0010
(仅最低位变化)
- 循环性:首尾两个数(
0000
和1000
)也只有一位不同,适用于环形计数。 - 对称性(反射特性):
- 前一半和后一半的格雷码是镜像对称的。
- 例如,4位格雷码的前8个和后8个码是镜像对称的,最高位为
0
和1
。
- 递归生成:
- n位格雷码可以通过n-1位格雷码生成:
- 在n-1位格雷码前补
0
,得到前一半。 - 将n-1位格雷码逆序排列后前补
1
,得到后一半。
- 在n-1位格雷码前补
- n位格雷码可以通过n-1位格雷码生成:
二、4位格雷码的完整序列
以下是4位格雷码的16个值(从0到15的十进制对应):
0: 0000 8: 1100
1: 0001 9: 1101
2: 0011 10: 1111
3: 0010 11: 1110
4: 0110 12: 1010
5: 0111 13: 1011
6: 0101 14: 1001
7: 0100 15: 1000
三、生成格雷码的技巧
- 二进制转格雷码
-
公式:
格雷码 = 二进制码 ^ (二进制码 >> 1)
例如:二进制数0110
转换为格雷码:二进制:0110 右移1位:0011 异或(^)结果:0101 → 格雷码
-
硬件实现:
在Verilog中可以直接用异或逻辑实现:gray_code = binary_code ^ (binary_code >> 1);
- 递归生成法
- 步骤:
- 1位格雷码:
0, 1
- 2位格雷码:
00, 01, 11, 10
- 3位格雷码:在前补
0
得到000, 001, 011, 010
,逆序后补1
得到110, 111, 101, 100
- 4位格雷码:同理递归生成。
- 1位格雷码:
- 镜像对称性
- 前8个码(0-7)和后8个码(8-15)对称,仅最高位不同。
四、应用技巧
- 计数器设计:
使用格雷码计数器可以减少功耗(相邻状态只有一位翻转),常用于低功耗设计。 - 避免错误传播:
在异步电路中,格雷码可以避免因多比特同时翻转导致的瞬时错误。(如 FIFO) - 环形编码器/解码器:
格雷码的循环性适合用于旋转编码器(如机械编码盘)。
异步FIFO
双端口RAM设计 → 二进制地址计数器 → 格雷码转换 → 跨时钟域同步 → 满空状态判断 → 控制信号生成
1.双端口RAM设计
-
功能:提供存储单元,支持读写操作在不同时钟域(
wclk
和rclk
)下进行。 -
使用二维数组
RAM_MEM
实现存储空间。
module ram_mod(input clk,input rst_n,input write_en,input [7:0]write_addr,input [3:0]write_data,input read_en,input [7:0]read_addr,output reg [3:0]read_data
);reg [3:0] mem[0:127];integer i;always @(posedge clk or negedge rst_n) beginif(!rst_n) beginfor(i=0;i<128;i=i+1) beginmem[i] <= 4'b0;endendelse if(write_en) beginmem[write_addr] <= write_data;endendalways @(posedge clk or negedge rst_n) beginif(!rst_n)read_data <= 4'b0;else if(read_en)read_data <= mem[read_addr];endendmodule
2.地址计数器与格雷码转换
二进制地址计数器:
- 读写操作分别维护一个二进制计数器(
w_binary
和r_binary
)。 - 写地址递增条件:
winc && !wfull
(非满时允许写)。 - 读地址递增条件:
rinc && !rempty
(非空时允许读)。
格雷码转换:
- 二进制地址转换为格雷码(
w_addr
和r_addr
),减少跨时钟域同步时的亚稳态风险。 - 转换公式:
gray = binary ^ (binary >> 1)
。
//地址 使用格雷码reg [ADDR_WIDTH:0] w_addr;reg [ADDR_WIDTH:0] r_addr;reg [ADDR_WIDTH:0] w_binary;reg [ADDR_WIDTH:0] r_binary;//二进制转格雷码//assign w_addr = w_binary ^ (w_binary >> 1);;//assign r_addr = r_binary ^ (r_binary >> 1);always @(posedge wclk or negedge wrstn) beginif(!wrstn)w_addr <= 'b0;else w_addr <= w_binary ^ (w_binary >> 1);endalways @(posedge rclk or negedge rrstn) beginif(!rrstn)r_addr <= 'b0;else r_addr <= r_binary ^ (r_binary >> 1);end// 二进制计数器always @(posedge wclk or negedge wrstn) beginif(!wrstn)w_binary <= 'b0;else if(winc && !wfull)w_binary <= w_binary + 1'b1;else w_binary <= w_binary;endalways @(posedge rclk or negedge rrstn) beginif(!rrstn)r_binary <= 'b0;else if(rinc && !rempty)r_binary <= r_binary + 1'b1;else r_binary <= r_binary;end
3.跨时钟域同步
目的:将读地址同步到写时钟域,写地址同步到读时钟域。
实现:打两拍
在读时钟域进行空状态判断;在写时钟域进行满状态判断。
同步后地址用于满空判断
4.空满状态判断
当读写指针相等时,得出FIFO为空
当写指针比读指针多循环RAM一周时,此时读写指针的最高位和次高位都相反,其余位相同,FIFO为满
assign wfull = (w_addr == {~r_addr_temp2[ADDR_WIDTH:ADDR_WIDTH-1],r_addr_temp2[ADDR_WIDTH-2:0]}) ? 1'b1 : 1'b0;
assign rempty = (w_addr_temp2 == r_addr) ? 1'b1 : 1'b0;
写满(wfull):
其中~r_addr_temp2[ADDR_WIDTH:ADDR_WIDTH-1],r_addr_temp2[ADDR_WIDTH-2:0]
表示:写指针比读指针多循环RAM一周时,此时读写指针的最高位和次高位都相反,其余位相同
解释:深度为16时,写地址为18(格雷码 11011),读地址为2(格雷码 00011)
读空(rempty):
同步后的写指针w_addr_temp2
与读指针r_addr
相等
5.控制信号生成
- 写使能(wen):
wen = winc && !wfull
(非满且请求写时有效)。 - 读使能(ren):
ren = rinc && !rempty
(非空且请求读时有效)。 - 直接控制RAM的读写操作。
跨时钟域处理
https://blog.csdn.net/emperor_strange/article/details/82491085?utm_source=app
https://mp.weixin.qq.com/s?__biz=MzkwNTIwNTA2NA==&mid=2247484703&idx=1&sn=78bc0a3dd5b8bffa6972e3b40b1dd43b&chksm=c14480d45c29cb0ddf7f2b0cecba84d6b79d0e21f28d2ba1eeb049fe664f1a89234c0ca15df6#rd
-
处理亚稳态的方法:
多级寄存器
异步FIFO缓存
分为从快到慢、从慢到快两种情况。
1.从快到慢
参考牛客网编程题VL49 脉冲同步电路
,将快时钟域的脉冲信号扩展为电平信号,
检测 data_in 信号的边沿,作为电平信号的判断条件。
`timescale 1ns/1nsmodule test(input clk_fast , input clk_slow , input rst_n ,input data_in ,output dataout
);//检测边沿reg data_in_temp1,data_in_temp2;wire data_in_pos;assign data_in_pos = data_in_temp1 & !data_in_temp2;always @(posedge clk_fast or negedge rst_n) beginif(!rst_n) begindata_in_temp1 <= 1'b0;data_in_temp2 <= 1'b0;endelse begindata_in_temp1 <= data_in;data_in_temp2 <= data_in_temp1;endend//脉冲转电平reg active;always @(posedge clk_fast or negedge rst_n) beginif(!rst_n) active <= 1'b0;else if(data_in_pos)active <= !active;else active <= active;end //在慢时钟打两拍reg active_temp1,active_temp2;always @(posedge clk_slow or negedge rst_n) beginif(!rst_n) beginactive_temp1 <= 1'b0;active_temp2 <= 1'b0;endelse beginactive_temp1 <= active;active_temp2 <= active_temp1;endendassign dataout = active_temp1 ^ active_temp2;endmodule
脉冲电平转换——打两拍——边沿检测
2.从慢到快
“打两拍”+边沿检测
将慢时钟域信号通过快时钟的连续两级触发器同步。第一级触发器采样可能进入亚稳态,第二级触发器显著降低亚稳态传播概率。
相关文章:

秋招准备——2.跨时钟相关
格雷码异步FIFO跨时钟域处理 格雷码 一、格雷码规律 相邻性:相邻两个数的格雷码只有一位不同,例如: 0000 → 0001(仅最低位变化)0001 → 0011(仅次低位变化)0011 → 0010(仅最低位…...

激光打印机常见打印故障简单处理意见
一、 问题描述: 给打印机更换新的硒鼓时拉开硒鼓封条时有微量碳粉带出; 原因: 出厂打印测试时,可能会有微量碳粉在磁辊上或者磁辊仓; 解决方法: 擦干净即可正常使用; 二、 问题描述&…...
语言学中的对象语言与元语言 | 概念 / 区别 / 实例分析
注:英文引文,机翻未校。 语言学中的“对象语言”和“元语言” 刘福长 现代外语 1989年第3期(总第45期) 在阅读语言学著作时,我们有时会遇到这样两个术语:对象语言(object language࿰…...

【2025最新】Windows系统装VSCode搭建C/C++开发环境(附带所有安装包)
文章目录 为什么选择VSCode作为C/C开发工具?一、VSCode安装过程(超简单!)二、VSCode中文界面设置(再也不用对着英文发愁!)三、安装C/C插件(编程必备神器!)四、…...

MYSQL 查询去除小数位后多余的0
MYSQL 查询去除小数位后多余的0 在MySQL中,有时候我们需要去除存储在数据库中的数字字段小数点后面多余的0。这种情况通常发生在处理金额或其他需要精确小数位的数据时。例如,数据库中存储的是decimal (18,6)类型的数据,但在页面展示时不希望…...

基于GF域的多进制QC-LDPC误码率matlab仿真,译码采用EMS算法
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 本课题实现的是四进制QC-LDPC 仿真操作步骤可参考程序配套的操作视频。 2.算…...

Vitrualbox完美显示系统界面(只需三步)
目录 1.使用vitrualbox的增强功能:编辑 2.安装增强功能(安装完后要重启虚拟机): 3. 调整界面尺寸(如果一个选项不行的话,就多试试其他不同的百分比): 先看看原来的,…...

王炸组合!STL-VMD二次分解 + Informer-LSTM 并行预测模型
往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…...

n8n 修改或者智能体用文档知识库创建pdf
以下是对 Nextcloud、OnlyOffice、Seafile、Etherpad、BookStack 和 Confluence 等本地部署文档协作工具的综合评测、对比分析和使用推荐,帮助您根据不同需求选择合适的解决方案。 🧰 工具功能对比 工具名称核心功能本地部署支持适用场景优势与劣势Next…...

论坛系统(中-1)
软件开发 编写公共代码 定义状态码 对执⾏业务处理逻辑过程中可能出现的成功与失败状态做针对性描述(根据需求分析阶段可以遇见的问题提前做出定义),⽤枚举定义状态码,先定义⼀部分,业务中遇到新的问题再添加 定义状态码如下 状态码类型描…...

FPGA+ESP32 = GameBoy 是你的童年吗?
之前介绍的所有的复古游戏机都是基于Intel-Altera FPGA制作的,今天就带来一款基于AMD-Xilinx FPGA的复古掌上游戏机-Game Bub。 Game Bub是一款掌上游戏机,旨在畅玩 Game Boy、Game Boy Color 和 Game Boy Advance 游戏。与大多数现代掌上游戏机一样&…...

3D迷宫探险:伪3D渲染与运动控制的数学重构
目录 3D迷宫探险:伪3D渲染与运动控制的数学重构引言第一章 伪3D渲染引擎1.1 射线投射原理1.2 纹理透视校正第二章 迷宫生成算法2.1 图论生成模型2.2 复杂度控制第三章 第一人称控制3.1 运动微分方程3.2 鼠标视角控制第四章 碰撞检测优化4.1 层级检测体系4.2 滑动响应算法第五章…...

【金仓数据库征文】_金仓数据库在金融行业的两地三中心容灾架构实践
金仓数据库在金融行业的两地三中心容灾架构实践 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 引言 随着国家对信息技术应用创新࿰…...

Python作业练习3
任务简述 字符田字格绘制 代码实现 def print_tianzige():for i in range(11):if i in [0, 5, 10]:print("" "-----" * 2)else:print("|" " |" * 2)print_tianzige() 结果展示...

十五种光电器件综合对比——《器件手册--光电器件》
十五、光电器件 名称 原理 特点 应用 发光二极管(LED) 基于半导体材料的电致发光效应,当电流通过时,电子与空穴复合,释放出光子。 高效、节能、寿命长、响应速度快、体积小。 广泛用于指示灯、照明、显示&#…...

【计算机视觉】OpenCV项目实战:基于face_recognition库的实时人脸识别系统深度解析
基于face_recognition库的实时人脸识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 人脸检测模块2.2 特征编码2.3 相似度计算 3. 实战部署指南3.1 环境配置3.2 数据准备3.3 实时识别流程 4. 常见问题与解决方案4.1 dlib安装失败4.2 人脸检测性能差4.3 误识别率高 5. 关键…...
Python面向对象编程(OOP)深度解析:从封装到继承的多维度实践
引言 面向对象编程(Object-Oriented Programming, OOP)是Python开发中的核心范式,其三大特性——封装、继承、多态——为构建模块化、可维护的代码提供了坚实基础。本文将通过代码实例与理论结合的方式,系统解析Python OOP的实现机制与高级特性…...
自我奖励语言模型:突破人类反馈瓶颈
核心思想 自我奖励语言模型提出了一种全新的语言模型对齐范式。传统方法如RLHF或DPO依赖人类反馈数据训练固定的奖励模型,这使模型的能力受限于人类标注数据的质量和数量。论文作者认为,要实现超人类能力的AI代理,未来的模型需要突破人类反馈…...

游戏资源传输服务器
目录 项目简介项目实现nginx配置服务器逻辑图 项目代码简介reactor 模型部分文件传输部分 项目演示视频演示演示分析 项目简介 使用C开发,其中资源存储在fastdfs 中,用户通过http上传或下载资源文件,此项目需要开启nginx中的nginx-upload-mod…...

2025-5-13渗透测试:CVE-2021-42278 和日志分析,NTLM 协议和PTH (Pass-the-Hash) Relay 捕获 Hash
CVE-2021-42278/42287 漏洞利用 漏洞原理 42278:通过修改计算机账户的 sAMAccountName(如去掉 $),伪装成域控制器(DC)名称,欺骗KDC生成高权限TGT。42287:KDC在验证TGT时若找不到匹配…...

基于深度学习的水果识别系统设计
一、选择YOLOv5s模型 YOLOv5:YOLOv5 是一个轻量级的目标检测模型,它在 YOLOv4 的基础上进行了进一步优化,使其在保持较高检测精度的同时,具有更快的推理速度。YOLOv5 的网络结构更加灵活,可以根据不同的需求选择不同大…...

C——五子棋小游戏
前言 五子棋,又称连珠棋,是一种双人对弈的棋类游戏。游戏目标是在一个棋盘上,通过在横、竖、斜线上依次放置棋子,使自己的五个棋子连成一线,即横线、竖线或斜线,且无被对手堵住的空位,从而获胜…...

【线段树】P9349 [JOI 2023 Final] Stone Arranging 2|普及+
本文涉及知识点 C线段树 P9349 [JOI 2023 Final] Stone Arranging 2 题目描述 JOI-kun has N N N go stones. The stones are numbered from 1 1 1 to N N N. The color of each stone is an integer between 1 1 1 and 1 0 9 10^9 109, inclusive. In the beginning,…...
分别在windows和linux上使用curl,有啥区别?
作为开发者常用的网络工具,curl 在 Windows 和 Linux 上的使用看似相似,但实际存在不少细节差异。以下从 命令语法、环境特性、功能支持 和 开发体验 四个角度展开对比,帮助读者避免跨平台开发时的常见“坑”。 一、命令语法差异:…...

CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)
一、腾讯云CodeBuddy产品全景解读 1. 什么是腾讯云代码助手? 官方定义: Tencent Cloud CodeBuddy是由腾讯自研的AI编程辅助工具,基于混元大模型DeepSeek双引擎,提供: ✅ 智能代码补全(支持200语言&#x…...

从数据中台到数据飞轮:实现数据驱动的升级之路
从数据中台到数据飞轮:实现数据驱动的升级之路 随着数字化转型的推进,数据已经成为企业最重要的资产之一,企业普遍搭建了数据中台,用于整合、管理和共享数据;然而,近年来,数据中台的风潮逐渐减退…...
机器学习第八讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列
机器学习第八讲:向量/矩阵 → 数据表格的数学表达,如Excel表格转数字阵列 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:…...

8天Python从入门到精通【itheima】-1~5
目录 1节: 1.Python的优势: 2.Python的独具优势的特点: 2节-初识Python: 1.Python的起源 2.Python广泛的适用面: 3节-什么是编程语言: 1.编程语言的作用: 2.编程语言的好处:…...

T2000云腾边缘计算盒子在数猪场景中的应用|YOLOv8+NodeRED
在现代养猪业蓬勃发展的当下,养殖场的智能化管理成为提升效率与精准度的关键所在。而养猪场盘点工作一直是养殖场管理中的重要环节,传统的盘点方式不仅耗费大量人力、时间,还容易出现误差。如今,T2000 云腾边缘计算盒子的出现&…...

Baklib内容中台构建全攻略
内容中台构建路径全解析 企业构建内容中台需遵循“战略驱动-系统搭建-持续优化”的三阶段路径。首先明确业务目标与知识资产类型,通过显性知识结构化将分散内容转化为标准化数字资产,依托四库体系(知识库、资源库、模板库、规则库࿰…...