by yang
最近準備數(shù)字IC崗時復習整理的知識點蜓斧,參考了比較火的fpga面試題,和一些相關知識睁冬。主要是寫著自己看著方便的挎春,有很多不嚴謹?shù)牡胤剑行┑胤接袇⒖兼溄佣共Γ切┎┛蛯懙亩己芎谩?/p>
Part.3
同步與異步
1:同步電路與異步電路
2:多時域設計中,不同時鐘域數(shù)據(jù)如何交換直奋? ★
3:同步時序電路 & 異步時序電路 如何實現(xiàn)延時?
4:非同源時鐘如何同步化施禾?
同步與異步
1:同步電路與異步電路
同步時序電路:用各種觸發(fā)器實現(xiàn)脚线,主要信號與OUT都是一個時鐘沿經過各種觸發(fā)器觸發(fā)的。所以只有時鐘脈沖到來才能改變電路的狀態(tài)弥搞,所以不論IN如何變化邮绿,狀態(tài)表中的每個狀態(tài)都是穩(wěn)定的。
異步時序電路:用組合邏輯電路(與非門)實現(xiàn)拓巧,電路中沒有統(tǒng)一的時鐘斯碌,典型的有FIFO/RAM讀寫信號一死、地址譯碼器等肛度。主要信號與OUT 不是某個時鐘信號驅動FF產生的。
核心區(qū)別在于是否所有觸發(fā)器都與唯一時鐘脈沖同步投慈。always后面是變量還是沿承耿。比如一個觸發(fā)器的輸出連接到另一個觸發(fā)器的時鐘端去觸發(fā)就是異步冠骄。
同步時序很好避免毛刺,異步時序電路的最大缺點是容易產生毛刺加袋。同步電路的問題在于時鐘偏差Clock skew
.
比如a+b=c.如果ab不同步凛辣,會有毛刺。
PS:阻塞賦值生成組合邏輯职烧,非阻塞生成時序邏輯扁誓。
2:多時域設計中,不同時鐘域數(shù)據(jù)如何交換? ★
不同的時鐘域之間信號通信時需要進行同步處理蚀之,這樣可以防止新時鐘域中第一級觸發(fā)器的亞穩(wěn)態(tài)信號對下級邏輯造成影響蝗敢。
- 當單個信號跨時鐘域時,可以采用兩級觸發(fā)器(一位同步器)來同步足删;
- 數(shù)據(jù)流或地址總線跨時鐘域時可以采用異步FIFO(或雙口RAM)來實現(xiàn)時鐘同步寿谴;
- 多位數(shù)據(jù)可以采用保持寄存器加握手信號的方法(多數(shù)據(jù),控制信號失受,地址信號)讶泰。
3:同步時序電路 & 異步時序電路 如何實現(xiàn)延時?
異步電路一般是通過插入1個buffer拂到、兩級非門等痪署,但這是不適合同步電路實現(xiàn)延時的。
在同步電路中的延時兄旬,一般通過時序控制實現(xiàn)惠桃,作為電路邏輯進行設計。
1)對于比較大的和特殊要求的延時辖试,一般通過高速時鐘產生計數(shù)器辜王,通過計數(shù)器來控制延時;
2)對于比較小的延時罐孝,可以通過D觸發(fā)器打一拍呐馆,延時了一個時鐘周期,而且完成了信號與時鐘的初次同步莲兢,在輸入信號采樣和增加時序約束余量中使用汹来。
像#5 這種語句是“行為級代碼描述”,仿真可以改艇,電路綜合會被忽略收班。
4:非同源時鐘如何同步化?
當系統(tǒng)中有兩個或兩個以上非同源時鐘的時候谒兄,數(shù)據(jù)的建立和保持時間很難得到保證摔桦。
我們可以使用帶使能端的 D 觸發(fā)器,并引入一個高頻時鐘(頻率高于系統(tǒng)中的所有源時鐘) ,便可以達到使系統(tǒng)中所有源時鐘同步的效果邻耕。
例:系統(tǒng)時鐘設計:
系統(tǒng)有兩個不同源時鐘鸥咖,一個為 3MHz,一個為 5MHz兄世,不同的觸發(fā)器使用不同的時鐘啼辣。為了使系統(tǒng)穩(wěn)定,假設我們引入一個 20MHz 時鐘御滩,那么這個 20MHz 的時鐘怎么才能將 3M和 5M 時鐘同步化呢鸥拧?
20M 的高頻時鐘將作為系統(tǒng)時鐘,輸入到所有觸發(fā)器的的時鐘端削解。3M_EN 和 5M_EN將控制所有觸發(fā)器的使能端住涉。即原來接 3M 時鐘的觸發(fā)器,接 20M 時鐘钠绍,同時 3M_EN 將控制該觸發(fā)器使能舆声,原接 5M 時鐘的觸發(fā)器,也接 20M 時鐘柳爽,同時 5M_EN 將控制該觸發(fā)器使能媳握。這樣我們就可以將任何非同源時鐘同步化。
異步信號輸入總是無法滿足數(shù)據(jù)的建立保持時間磷脯, 所以建議大家把所有異步輸入都先經過雙觸發(fā)器進行同步化蛾找。
FIFO問題 ★★
深入理解FIFO
FIFOFirst In First Out
是一種先進先出的數(shù)據(jù)緩存器,與普通存儲器的區(qū)別是沒有外部讀寫地址線赵誓,這樣使用起來非常簡單打毛,但缺點就是只能順序寫入數(shù)據(jù),順序的讀出數(shù)據(jù)俩功, 其數(shù)據(jù)地址由內部讀寫指針自動加1完成幻枉,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。
FIFO一般用于不同時鐘域之間的數(shù)據(jù)傳輸诡蜓,或不同寬度的數(shù)據(jù)接口相連熬甫。F根據(jù)FIFO讀寫時鐘域是否相同,可以將FIFO分為同步FIFO和異步FIFO蔓罚。
FIFO的常見參數(shù):
- 寬度:即FIFO一次讀寫操作的數(shù)據(jù)位椿肩;
- 深度:指的是FIFO可以存儲多少個N位的數(shù)據(jù)(如果寬度為N)。
- 滿標志豺谈,空標志郑象,讀時鐘,寫時鐘
- 讀指針:總是指向下一個將要被寫入的單元茬末,復位時厂榛,指向第1個單元(編號為0)
- 寫指針:總是指向當前要被讀出的數(shù)據(jù),復位時,指向第1個單元(編號為0)
FIFO設計的難點在于怎樣判斷FIFO的空/滿狀態(tài)噪沙。異步FIFO需要解決跨時鐘域傳遞為了保證數(shù)據(jù)正確的寫入或讀出,而不發(fā)生溢出或讀空的狀態(tài)出現(xiàn)吐根,必須保證FIFO在滿的情況下正歼,不能進行寫操作。在空的狀態(tài)下不能進行讀操作拷橘。怎樣判斷FIFO的滿/空就成了FIFO設計的核心問題局义。
空/滿檢測: 當讀寫指針相等時~
- FIFO 空:如果是復位或讀操作引起(當讀指針讀出FIFO中最后一個字后,追趕上了寫指針時)
- FIFO 滿:如果是寫操作引起
- 還可以用多加一位extra bit來記錄折回冗疮,如果extra也一樣代表空萄唇,不一樣代表寫滿
寫操作無條件清除空標志;讀操作無條件清除滿標志术幔。
而異步FIFO不同時間域另萤,將指針同步到其它時鐘域時,用兩級FF傳遞格雷碼地址防止亞穩(wěn)態(tài)诅挑,gray碼可以保證即使亞穩(wěn)態(tài)數(shù)據(jù)不準四敞,也能正確判斷空滿,需要一個always塊專門進行bin2gray的轉換拔妥。gray碼每次只變一個寄存器一位忿危,這樣僅僅1bit可能產生亞穩(wěn)態(tài)。采錯最多錯到上一位去没龙,不會有影響铺厨。
6個模塊實現(xiàn):頂層;雙口RAM硬纤;2個跨域同步指針模塊解滓;空判斷邏輯;滿判斷邏輯筝家;
- 根據(jù)異步FIFO的設計架構伐蒂,歸納以下設計步驟:
寫時鐘域:
(1)根據(jù)寫使能wr_en和寫滿標志位wr_full產生二進制寫指針
(2)根據(jù)二進制寫指針產生雙端口RAM的寫地址
(3)由二進制寫指針轉換成格雷碼寫指針
(4)對格雷碼讀指針在寫時鐘域中進行兩級同步得同步后格雷碼讀指針
(5)同步后格雷碼讀指針轉化成同步后二進制讀指針
(6)步驟(3)與步驟(4)比較得寫滿標志位wr_full
(7)步驟(1)與步驟(5)相減得指示寫FIFO的數(shù)據(jù)量
讀時鐘域:
(8)根據(jù)讀使能rd_en和讀空標志位rd_empty產生二進制讀指針
(9)根據(jù)二進制讀指針產生雙端口RAM的讀地址
(10)由二進制讀指針轉換成格雷碼讀指針
(11)對格雷碼寫指針在讀時鐘域中進行兩級同步得同步后格雷碼寫指針
(12)同步后格雷碼寫指針轉化成同步后二進制寫指針
(13)步驟(10)與步驟(11)比較得讀空標志位rd_empty
(14)步驟(8)與步驟(12)相減得指示讀FIFO的數(shù)據(jù)量
關鍵代碼:
reg[DATA_SIZE-1:0] mem_name[RAM_Depth-1:0]; //RAM深度=2^ADDR_WIDTH
assign rdata = Mem[raddr];
assign rempty = (rgraynext == rq2_wptr); //指針是否相等
assign wfull = (wgraynext == {~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]}); // ??
[1]異步fifo的verilog實現(xiàn)
[2]步驟參考
[3] 三種同步FIFO的實現(xiàn)方法(verilog實現(xiàn))
例:用verilog/vhdl寫一個fifo控制器(包括空,滿肛鹏,半滿信號)逸邦?
八個always模塊實現(xiàn),兩個用于讀寫FIFO在扰,兩個用于產生頭地址head和尾地址tail缕减,一個產生counter計數(shù),剩下三個根據(jù)counter的值產生空芒珠,滿桥狡,半滿信號產生空,滿,半滿信號裹芝。
例:用系統(tǒng)任務$readmemb初始化memory.mem:
reg[DATA_SIZE-1:0] mem_name[RAM_Depth-1:0]; //RAM深度=2^ADDR_WIDTH
$readmemb("init.dat",mem_name)