verilog面試寶典[3]-同步與異步球碉,F(xiàn)IFO

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個跨域同步指針模塊解滓;空判斷邏輯;滿判斷邏輯筝家;

異步FIFO.png

  • 根據(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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末部逮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嫂易,更是在濱河造成了極大的恐慌兄朋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怜械,死亡現(xiàn)場離奇詭異颅和,居然都是意外死亡,警方通過查閱死者的電腦和手機缕允,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門峡扩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人障本,你說我怎么就攤上這事教届。” “怎么了驾霜?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵巍佑,是天一觀的道長。 經常有香客問我寄悯,道長萤衰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任猜旬,我火速辦了婚禮脆栋,結果婚禮上,老公的妹妹穿的比我還像新娘洒擦。我一直安慰自己椿争,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布熟嫩。 她就那樣靜靜地躺著秦踪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天境蜕,我揣著相機與錄音树碱,去河邊找鬼寒波。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播合住,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绰精,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了透葛?” 一聲冷哼從身側響起笨使,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僚害,沒想到半個月后硫椰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡贡珊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年最爬,在試婚紗的時候發(fā)現(xiàn)自己被綠了涉馁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门岔。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烤送,靈堂內的尸體忽然破棺而出寒随,到底是詐尸還是另有隱情,我是刑警寧澤帮坚,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布妻往,位于F島的核電站,受9級特大地震影響试和,放射性物質發(fā)生泄漏讯泣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一阅悍、第九天 我趴在偏房一處隱蔽的房頂上張望好渠。 院中可真熱鬧,春花似錦节视、人聲如沸拳锚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霍掺。三九已至,卻和暖如春拌蜘,著一層夾襖步出監(jiān)牢的瞬間杆烁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工简卧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留连躏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓贞滨,卻偏偏與公主長得像入热,于是被迫代替她去往敵國和親拍棕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容