秋招准备——2.跨时钟相关

news2025/7/20 12:45:12

格雷码+异步FIFO+跨时钟域处理

格雷码

一、格雷码规律

  1. 相邻性:相邻两个数的格雷码只有一位不同,例如:
    • 00000001(仅最低位变化)
    • 00010011(仅次低位变化)
    • 00110010(仅最低位变化)
  2. 循环性:首尾两个数(00001000)也只有一位不同,适用于环形计数。
  3. 对称性(反射特性):
    • 前一半和后一半的格雷码是镜像对称的。
    • 例如,4位格雷码的前8个和后8个码是镜像对称的,最高位为01
  4. 递归生成
    • n位格雷码可以通过n-1位格雷码生成:
      1. 在n-1位格雷码前补0,得到前一半。
      2. 将n-1位格雷码逆序排列后前补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. 二进制转格雷码
  • 公式
    ​格雷码 = 二进制码 ^ (二进制码 >> 1)​
    例如:二进制数0110转换为格雷码:

    二进制:0110
    右移1位:0011
    异或(^)结果:0101 → 格雷码
    
  • 硬件实现
    在Verilog中可以直接用异或逻辑实现:

    gray_code = binary_code ^ (binary_code >> 1);
    
  1. 递归生成法
  • 步骤:
    1. 1位格雷码:0, 1
    2. 2位格雷码:00, 01, 11, 10
    3. 3位格雷码:在前补0得到000, 001, 011, 010,逆序后补1得到110, 111, 101, 100
    4. 4位格雷码:同理递归生成。
  1. 镜像对称性
  • 前8个码(0-7)和后8个码(8-15)对称,仅最高位不同。

四、应用技巧

  1. 计数器设计
    使用格雷码计数器可以减少功耗(相邻状态只有一位翻转),常用于低功耗设计。
  2. 避免错误传播
    在异步电路中,格雷码可以避免因多比特同时翻转导致的瞬时错误。(如 FIFO)
  3. 环形编码器/解码器
    格雷码的循环性适合用于旋转编码器(如机械编码盘)。

异步FIFO

双端口RAM设计 → 二进制地址计数器 → 格雷码转换 → 跨时钟域同步 → 满空状态判断 → 控制信号生成

1.双端口RAM设计

  • 功能:提供存储单元,支持读写操作在不同时钟域(wclkrclk)下进行。

  • 使用二维数组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) begin
		if(!rst_n) begin
			for(i=0;i<128;i=i+1) begin
				mem[i] <= 4'b0;
			end
		end
		else if(write_en) begin
			mem[write_addr] <= write_data;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if(!rst_n)
			read_data <= 4'b0;
		else if(read_en)
			read_data <= mem[read_addr];
	end

endmodule

2.地址计数器与格雷码转换

二进制地址计数器

  • 读写操作分别维护一个二进制计数器(w_binaryr_binary)。
  • 写地址递增条件:winc && !wfull(非满时允许写)。
  • 读地址递增条件:rinc && !rempty(非空时允许读)。

格雷码转换

  • 二进制地址转换为格雷码(w_addrr_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) begin
		if(!wrstn)
			w_addr <= 'b0;
		else   
			w_addr <= w_binary ^ (w_binary >> 1);
	end

	always @(posedge rclk or negedge rrstn) begin
		if(!rrstn)
			r_addr <= 'b0;
		else   
			r_addr <= r_binary ^ (r_binary >> 1);
	end

	// 二进制计数器
	always @(posedge wclk or negedge wrstn) begin
		if(!wrstn)
			w_binary <= 'b0;
		else if(winc && !wfull)
			w_binary <= w_binary + 1'b1;
		else  
			w_binary <= w_binary;
	end

	always @(posedge rclk or negedge rrstn) begin
		if(!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/1ns

module 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) begin
		if(!rst_n) begin
			data_in_temp1 <= 1'b0;
			data_in_temp2 <= 1'b0;
		end
		else begin
			data_in_temp1 <= data_in;
			data_in_temp2 <= data_in_temp1;
		end
	end

	//脉冲转电平
	reg active;
	always @(posedge clk_fast or negedge rst_n) begin
		if(!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) begin
		if(!rst_n) begin
			active_temp1 <= 1'b0;
			active_temp2 <= 1'b0;
		end
		else begin
			active_temp1 <= active;
			active_temp2 <= active_temp1;
		end
	end
	assign dataout = active_temp1 ^ active_temp2;

endmodule

在这里插入图片描述

脉冲电平转换——打两拍——边沿检测

2.从慢到快

“打两拍”+边沿检测

​ 将慢时钟域信号通过快时钟的连续两级触发器同步。第一级触发器采样可能进入亚稳态,第二级触发器显著降低亚稳态传播概率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

激光打印机常见打印故障简单处理意见

一、 问题描述&#xff1a; 给打印机更换新的硒鼓时拉开硒鼓封条时有微量碳粉带出&#xff1b; 原因&#xff1a; 出厂打印测试时&#xff0c;可能会有微量碳粉在磁辊上或者磁辊仓&#xff1b; 解决方法&#xff1a; 擦干净即可正常使用&#xff1b; 二、 问题描述&…

【2025最新】Windows系统装VSCode搭建C/C++开发环境(附带所有安装包)

文章目录 为什么选择VSCode作为C/C开发工具&#xff1f;一、VSCode安装过程&#xff08;超简单&#xff01;&#xff09;二、VSCode中文界面设置&#xff08;再也不用对着英文发愁&#xff01;&#xff09;三、安装C/C插件&#xff08;编程必备神器&#xff01;&#xff09;四、…

MYSQL 查询去除小数位后多余的0

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

基于GF域的多进制QC-LDPC误码率matlab仿真,译码采用EMS算法

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 本课题实现的是四进制QC-LDPC 仿真操作步骤可参考程序配套的操作视频。 2.算…

Vitrualbox完美显示系统界面(只需三步)

目录 1.使用vitrualbox的增强功能&#xff1a;​编辑 2.安装增强功能&#xff08;安装完后要重启虚拟机&#xff09;&#xff1a; 3. 调整界面尺寸&#xff08;如果一个选项不行的话&#xff0c;就多试试其他不同的百分比&#xff09;&#xff1a; 先看看原来的&#xff0c;…

王炸组合!STL-VMD二次分解 + Informer-LSTM 并行预测模型

往期精彩内容&#xff1a; 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门&#xff01;锂电池剩余寿命预测&#xff08;Python&#xff09;-CSDN博客 超强预测模型&#xff1a;二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention预测模型…

n8n 修改或者智能体用文档知识库创建pdf

以下是对 Nextcloud、OnlyOffice、Seafile、Etherpad、BookStack 和 Confluence 等本地部署文档协作工具的综合评测、对比分析和使用推荐&#xff0c;帮助您根据不同需求选择合适的解决方案。 &#x1f9f0; 工具功能对比 工具名称核心功能本地部署支持适用场景优势与劣势Next…

论坛系统(中-1)

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

FPGA+ESP32 = GameBoy 是你的童年吗?

之前介绍的所有的复古游戏机都是基于Intel-Altera FPGA制作的&#xff0c;今天就带来一款基于AMD-Xilinx FPGA的复古掌上游戏机-Game Bub。 Game Bub是一款掌上游戏机&#xff0c;旨在畅玩 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 滑动响应算法第五章…

【金仓数据库征文】_金仓数据库在金融行业的两地三中心容灾架构实践

金仓数据库在金融行业的两地三中心容灾架构实践 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 引言 随着国家对信息技术应用创新&#xff0…

Python作业练习3

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

十五种光电器件综合对比——《器件手册--光电器件》

十五、光电器件 名称 原理 特点 应用 发光二极管&#xff08;LED&#xff09; 基于半导体材料的电致发光效应&#xff0c;当电流通过时&#xff0c;电子与空穴复合&#xff0c;释放出光子。 高效、节能、寿命长、响应速度快、体积小。 广泛用于指示灯、照明、显示&#…

【计算机视觉】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. 关键…

游戏资源传输服务器

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

2025-5-13渗透测试:CVE-2021-42278 和日志分析,NTLM 协议和PTH (Pass-the-Hash) Relay 捕获 Hash

CVE-2021-42278/42287 漏洞利用 漏洞原理 42278&#xff1a;通过修改计算机账户的 sAMAccountName&#xff08;如去掉 $&#xff09;&#xff0c;伪装成域控制器&#xff08;DC&#xff09;名称&#xff0c;欺骗KDC生成高权限TGT。42287&#xff1a;KDC在验证TGT时若找不到匹配…

基于深度学习的水果识别系统设计

一、选择YOLOv5s模型 YOLOv5&#xff1a;YOLOv5 是一个轻量级的目标检测模型&#xff0c;它在 YOLOv4 的基础上进行了进一步优化&#xff0c;使其在保持较高检测精度的同时&#xff0c;具有更快的推理速度。YOLOv5 的网络结构更加灵活&#xff0c;可以根据不同的需求选择不同大…

C——五子棋小游戏

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

【线段树】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,…

CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)

一、腾讯云CodeBuddy产品全景解读 1. 什么是腾讯云代码助手&#xff1f; 官方定义&#xff1a; Tencent Cloud CodeBuddy是由腾讯自研的AI编程辅助工具&#xff0c;基于混元大模型DeepSeek双引擎&#xff0c;提供&#xff1a; ✅ 智能代码补全&#xff08;支持200语言&#x…