【數字】異步FIFO面試的幾個小問題與跨時鐘域時序約束

入門數字設計的時候,跨時鐘域的數據處理是繞不開的課題,特別是多比特數據跨時鐘域時,都會采用異步FIFO的方法。

異步FIFO中涉及較多的考點這里記錄幾個以供大家參考。

1. 異步FIFO的空滿判斷分別在哪個域?

根據異步FIFO的結構,可以很清楚的分析出,在進行空滿判斷的時候是通過對讀寫指針的比較來判斷空滿的情況。但因為讀寫時鐘域的不同,讀寫指針在跨時鐘域的時候會使用同步器進行同步處理。所以往往寫時鐘域的寫指針較讀指針來說是實時的,因為讀指針實際上是2拍之前的值了,所以會在寫時鐘域來判斷滿的情況。反之在讀時鐘域判斷空的情況。但是判斷空滿會存在延遲即"虛空"和“虛滿”的情況。這樣是否是有問題的呢?這樣雖然會影響FIFO的性能,但是并不會使FIFO的功能出錯,因為滿的時候不會繼續寫入,空的時候不會繼續讀取,不會導致FIFO功能出錯。

異步空滿判斷因為格雷碼的對稱性:

滿:高位不同,次高位不同,低位相同。

空:全相同。

2. 為什么要將二進制轉換成格雷碼來進行讀寫指針的傳遞呢?

這里需要突出的是格雷碼的特性,每次狀態跳變時只有一位變化,在能夠保證bus skew的前提下,即使是在跨時鐘域時,也能避免因多位同時變化而導致的錯誤狀態。因為只有1位跳變的話,即使是發生亞穩態的情況,最差是狀態不變。但如果是多位變化情況就不一定。

3.如果沒有保證格雷碼的時序會出現什么問題呢?

正常情況下的跨時鐘域

格雷碼各bit之間存在較大偏移的情況,bit0_delay > bit1_delay > bit2_delay,且這些bit之間的skew大于clk_wr,出現了010->111多bit位跳變的情況,111->110錯誤跳變的情況。

由上可知當各bit之間的skew較大的時候無法發揮格雷碼的特性且可能會出現錯誤的情況。所以需要在設計的時候保證各bit之間的skew關系。所以為了避免過大的skew,可以對mult-bit設置set_max_delay,將延時限制在有效的范圍內。

查閱網上有些同學說需要保證將限制設置在讀寫時鐘中最快時鐘周期的一半,或者設置成源端時鐘的一半,或者設置成源端時鐘的倍數且bit間的skew明顯小于一個源端時鐘周期。

使用ateris的工具里面建議的是在pre-CTS的時候set_max_delay設置成源端時鐘周期。在Post-CTS的時候需要保證(CLK_A+Delay)Skew < Ttxclk - CLK_B(skew)即保證單個bit的傳輸必須不能超過其他bit。

我們來分析一下這個公式的由來,如果是在pre-CTS階段,時鐘網絡是ideal的不存在CLK_A和CLK_B的skew,Delay小于Ttxclk即可。那為什么不是像網上提到的那樣約束比較嚴格呢?

分情況討論這樣的情況:

1)如果是慢時鐘往快時鐘傳:

下面是慢時鐘周期每個cycle打一個數據,可以看到快時鐘采樣要么是下一個狀態要么是當前狀態。只要每個bit的延遲不超過源時鐘即可。

2)如果是快時鐘往慢時鐘傳:

可以看到慢時鐘域實際上看到的格雷碼跳變是,0000->0001->0110,發生了3個bit同時跳變的情況,但是0110并不是從0001直接跳變而來的,而是在中間周期穩定了一個源端時鐘周期之后跳變的,所以有風險的只有bit2,并且即使恢復成0或者1對FIFO的判斷也沒有影響。所以保證各個狀態之間沒有重疊也不會影響功能,所以設置成源端時鐘周期即可。

還有個博主提到了如下情況:

當快慢時鐘域之間頻率差距過大的時候,會出現慢時鐘域的有效沿采樣的時候,有較多bit發生跳變的情況。

假設慢時鐘域的有效亞穩態窗如上,假設為10%,快時鐘域的狀態至少撐滿一個亞穩態窗。其實這個窗應該就是setup和hold滿足時的區間。

4.如果深度是不是2^n應該如何設置格雷碼的跳變?

同步fifo里,深度任意可配的同步fifo里使用了兩個非飽和的cnt計數器記錄讀寫地址指針,waddr和raddr均比實際地址多一位,最高位用來指示套圈情況。當waddr和raddr的最高位相同時,fifo_cnt = waddr-raddr;當waddr和raddr的最高位相反時,fifo_cnt = DEPTH + waddr[ADDR_WIDTH-1:0] ? - raddr[ADDR_WIDTH-1:0]。最高位作為標志位,當低位計數到DEPTH-1時,高位翻轉。

assign waddr_d_h = (waddr[DP_WD-1:0] == DEPTH-1) ? ~waddr[DP_WD] : waddr[DP_WD];
assign waddr_d_l = (waddr[DP_WD-1:0] == DEPTH-1) ? 0 : waddr[DP_WD-1:0] + 1;
always @(posedge clk or negedge rst_n)beginif(~rst_n)    waddr <= 0;else if(wenc) waddr <= {waddr_d_h, waddr_d_l};
end

異步fifo中,如何仍然采用上面的方法就有可能出現非相鄰的跳轉,會出現多bit跳變的情況。

由上圖可以看到格雷碼對稱性的特性。

根據這個特性假設現在的深度為5,那可知當計數到4的時候即格雷碼0110時,下一個狀態應該跳轉到11即格雷碼1110,才能保證只出現單bit的跳轉。

偏移的規律是5的話2^3=8,8-5=3,8+3=11。

parameter DEPTH = 11;
parameter WIDTH = $clog2(DEPTH);//4
parameter DEPTH_TO2 = 2 ^ WIDTH;//16
parameter SHIFT = DEPTH_TO2 - DEPTH;//16-11=5

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895492.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895492.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談Java Spring Boot 框架分析和理解

Spring Boot是一個簡化Spring開發的框架&#xff0c;它遵循“約定優于配置”的原則&#xff0c;通過內嵌的Tomcat、Jetty或Undertow等容器&#xff0c;使得開發者能夠快速構建獨立運行的、生產級別的基于Spring框架的應用程序。Spring Boot包含了大量的自動配置功能&#xff0c…

算法06-回溯算法

一、回溯算法詳解 回溯算法是一種通過逐步構建解決方案來解決問題的算法。它通常用于解決組合問題、排列問題、子集問題等。回溯算法的核心思想是“試錯”&#xff0c;即在每一步嘗試所有可能的選項&#xff0c;如果發現當前選擇無法達到目標&#xff0c;就回退到上一步&#…

RabbitMQ學習—day2—安裝

目錄 普通Linux安裝 安裝RabbitMQ 1、下載 2、安裝 3. Web管理界面及授權操作 Docker 安裝 強力推薦學docker&#xff0c;使用docker安裝 普通Linux安裝 安裝RabbitMQ 1、下載 官網下載地址&#xff1a;https://www.rabbitmq.com/download.html(opens new window) 這…

降本增效 - VGF 構建輕量高性能日志管理平臺

VFG 技術架構 Filebeat 接收Syslog &#xff0c;并進行日志分段&#xff0c;VictoriaLogs 持久化存儲日志 &#xff0c;Grafana 可視化、數據查詢、告警、數據導出。 為什么要用VictoriaLogs &#xff1f; 與Elasticsearch /Grafana Loki相比幾十倍的CPU/內存/存儲資源占用的…

初識camel智能體(一)

同目錄下配置環境變量.env&#xff0c;內容如下&#xff0c; apikey從魔搭社區獲取 QWEN_API_KEY4ff3ac8f-aebc******** 先上干貨代碼&#xff0c;主代碼如下&#xff1a; from colorama import Forefrom camel.societies import RolePlaying from camel.utils import prin…

介紹 Liquibase、Flyway、Talend 和 Apache NiFi:選擇適合的工具

在現代軟件開發中&#xff0c;尤其是在數據庫管理和數據集成方面&#xff0c;選擇合適的工具至關重要。本文將介紹四個流行的工具&#xff1a;Liquibase、Flyway、Talend 和 Apache NiFi&#xff0c;分析它們的應用、依賴以及如何選擇適合的工具。 1. Liquibase 簡介&#xff…

Docker使用指南與Dockerfile文件詳解:從入門到實戰

Docker使用指南與Dockerfile文件詳解:從入門到實戰 文章目錄 **Docker使用指南與Dockerfile文件詳解:從入門到實戰****引言****第一部分:Docker 核心概念速覽****1. Docker 基礎架構****2. Docker 核心命令****第二部分:Dockerfile 文件深度解析****1. Dockerfile 是什么?…

Qt工作總結03 <qSort按某一屬性進行排序>

1. 代碼樣例 QList<QGraphicsTextItem *> Lst;qSort(Lst.begin(),Lst.end(),[](const QGraphicsTextItem *itemA,const QGraphicsTextItem *itemB) {return itemA->toPlainText().toDouble() < itemB->toPlainText().toDouble(); }); 2. 參考 QList 按結構體…

深度學習|表示學習|Instance Normalization 全面總結|26

如是我聞&#xff1a; 1. Instance Normalization&#xff08;IN&#xff09; Instance Normalization&#xff08;IN&#xff09;最早由 Ulyanov et al.&#xff08;2017&#xff09; 提出&#xff0c;主要用于 風格遷移&#xff08;Style Transfer&#xff09; 任務。它的核…

如何保持 mysql 和 redis 中數據的一致性?PegaDB 給出答案

MySQL 與 Redis 數據保持一致性是一個常見且復雜的問題&#xff0c;一般來說需要結合多種策略來平衡性能與一致性。 傳統的解決策略是先讀緩存&#xff0c;未命中則讀數據庫并回填緩存&#xff0c;但方式這種維護成本較高。 隨著云數據庫技術的發展&#xff0c;目前國內云廠商…

探索ELK 的魅力

在大數據時代&#xff0c;海量日志和數據的收集、存儲、處理與可視化分析變得越來越重要。而 ELK 堆棧&#xff0c;由 Elasticsearch、Logstash、Beats 和 Kibana 組成&#xff0c;正是一個強大的開源解決方案&#xff0c;幫助開發者和運維人員高效管理和分析日志數據。本文將詳…

用vue3寫一個好看的wiki前端頁面

以下是一個使用 Vue 3 Element Plus 實現的 Wiki 風格前端頁面示例&#xff0c;包含現代設計、響應式布局和常用功能&#xff1a; <template><div class"wiki-container"><!-- 頭部導航 --><el-header class"wiki-header"><d…

深度學習實戰基礎案例——卷積神經網絡(CNN)基于DenseNet的眼疾檢測|第4例

文章目錄 前言一、數據準備二、項目實戰2.1 設置GPU2.2 數據加載2.3 數據預處理2.4 數據劃分2.5 搭建網絡模型2.6 構建densenet1212.7 訓練模型2.8 結果可視化 三、UI設計四、結果展示總結 前言 在當今社會&#xff0c;眼科疾病尤其是白內障對人們的視力健康構成了嚴重威脅。白…

DeepSeek的開源核爆:當技術民主化重構AI權力版圖

2025年2月&#xff0c;全球AI產業正經歷著由DeepSeek掀起的鏈式反應——這個首個開源千億參數多模態模型的企業&#xff0c;用開放戰略在技術壁壘森嚴的AI戰場投下"制度性核彈"。其貢獻不在于單純的技術突破&#xff0c;而在于通過開源協議實現了三重維度的大爆炸&am…

代碼隨想錄二叉樹篇(含源碼)

二叉樹與遞歸 前言226.翻轉二叉樹算法思路及代碼solution 1 用分解問題的思路來解決solution 2 用遍歷的思路來解決 101.對稱二叉樹算法思路及代碼solution 104.二叉樹的最大深度算法思路及代碼solution 1 遍歷solution 2 分解問題 111.二叉樹的最小深度算法思路及代碼solution…

MyBatis映射文件 <resultMap> 元素詳解與示例

引言 <resultMap> 是 MyBatis 中最核心的映射配置元素&#xff0c;用于解決數據庫字段與 Java 對象屬性之間的復雜映射問題&#xff0c;尤其是字段名不一致、嵌套對象關聯、集合映射等場景。ResultMap 的設計思想是&#xff0c;對簡單的語句做到零配置&#xff0c;對于復…

【xdoj離散數學上機】T283

遞歸函數易錯&#xff1a; 防止出現遞歸死循環&#xff01; 題目 題目&#xff1a;求誘導出的等價關系的關系矩陣 問題描述 給定有限集合上二元關系的關系矩陣&#xff0c;求由其誘導出的等價關系的關系矩陣。 輸入格式 第一行輸入n&#xff0c;表示矩陣為n階方陣&#xff0c…

WIN11上使用GraalVM打包springboot3項目為本地可執行文件exe

耐心肝才能成功 概念步驟概要詳細步驟一. GraalVM 17二. 安裝Visual Studio 2022三. 創建springboot四. IDEA最新版或者eclipse2025調試項目五. 打包exe 概念 springboot3生成的jar編譯成windows本地C文件&#xff0c;不再依賴JVM運行 WINDOW編譯較為復雜&#xff0c;限制條件…

【git-hub項目:YOLOs-CPP】本地實現01:項目構建

目錄 寫在前面 項目介紹 最新發布說明 Segmentation示例 功能特點 依賴項 安裝 克隆代碼倉庫 配置 構建項目 寫在前面 前面剛剛實現的系列文章: 【Windows/C++/yolo開發部署01】 【Windows/C++/yolo開發部署02】 【Windows/C++/yolo開發部署03】 【Windows/C++/yolo…

超越 DeepSeek V3 -->【Qwen2.5-Max】

&#x1f525; 先說明&#xff0c;不是廣子&#xff0c;不是廣子&#xff01;&#xff01;&#xff01;單純分享這個工具給大家&#xff0c;畢竟最近使用 DeepSeek 太容易崩了&#xff0c;每天深度思考一次之后就開始轉圈圈用不了&#xff0c;然后就找到了這個工具使用 一、前言…