FIFO即First In First Out,是(shì)一(yī)種(zhǒng)先(xiān)進(jìn)先(xiān)出(chū)數據(jù)存儲、緩沖器,我(wǒ)们(men)知道(dào)一(yī)般的(de)存儲器是(shì)用(yòng)外(wài)部(bù)的(de)读(dú)写地(dì)址来(lái)進(jìn)行读(dú)写,而(ér)FIFO这(zhè)種(zhǒng)存儲器的(de)結構并不(bù)需要(yào)外(wài)部(bù)的(de)读(dú)写地(dì)址而(ér)是(shì)通(tòng)过(guò)自(zì)動(dòng)的(de)加一(yī)操作来(lái)控制读(dú)写,这(zhè)也(yě)就(jiù)決定(dìng)了(le)FIFO只(zhī)能(néng)順序的(de)读(dú)写數據(jù)。
2、FIFO分(fēn)類(lèi)
FIFO根(gēn)據(jù)读(dú)写时(shí)鐘(zhōng)是(shì)否相同(tóng)分(fēn)为(wèi) SCFIFO(同(tóng)步FIFO)和(hé) DCFIFO(异(yì)步FIFO)
同(tóng)步FIFO,读(dú)和(hé)写應(yìng)用(yòng)同(tóng)一(yī)个(gè)时(shí)鐘(zhōng)。它(tā)的(de)作用(yòng)一(yī)般是(shì)做交互數據(jù)的(de)一(yī)个(gè)緩沖,也(yě)就(jiù)是(shì)说(shuō)它(tā)的(de)主(zhǔ)要(yào)作用(yòng)就(jiù)是(shì)一(yī)个(gè)buffer。
异(yì)步FIFO,读(dú)写應(yìng)用(yòng)不(bù)同(tóng)的(de)时(shí)鐘(zhōng),它(tā)有(yǒu)两(liǎng)个(gè)主(zhǔ)要(yào)的(de)作用(yòng),一(yī)个(gè)是(shì)实現(xiàn)數據(jù)在(zài)不(bù)同(tóng)时(shí)鐘(zhōng)域進(jìn)行傳遞,另(lìng)一(yī)个(gè)作用(yòng)就(jiù)是(shì)实現(xiàn)不(bù)同(tóng)數據(jù)宽(kuān)度(dù)的(de)數據(jù)接口(kǒu)。
3、FIFO使用(yòng)情(qíng)況
FIFO一(yī)般用(yòng)于(yú)不(bù)同(tóng)时(shí)鐘(zhōng)域之間(jiān)的(de)數據(jù)傳輸,比如(rú)FIFO的(de)一(yī)端时(shí)AD數據(jù)采集,另(lìng)一(yī)端时(shí)計(jì)算機(jī)的(de)PCI總(zǒng)線(xiàn),假設其AD采集的(de)速率为(wèi)16位 100K SPS,那(nà)麼(me)每秒(miǎo)的(de)數據(jù)量(liàng)为(wèi)100K×16bit=1.6Mbps, 而(ér)PCI總(zǒng)線(xiàn)的(de)速度(dù)为(wèi)33MHz,總(zǒng)線(xiàn)宽(kuān)度(dù)32bit,其最(zuì)大傳輸速率为(wèi)1056Mbps,在(zài)两(liǎng)个(gè)不(bù)同(tóng)的(de)时(shí)鐘(zhōng)域間(jiān)就(jiù)可(kě)以(yǐ)采用(yòng)FIFO来(lái)作为(wèi)數據(jù)緩沖。另(lìng)外(wài)对(duì)于(yú)不(bù)同(tóng)宽(kuān)度(dù)的(de)數據(jù)接口(kǒu)也(yě)可(kě)以(yǐ)用(yòng)FIFO,例如(rú)單片(piàn)機(jī)位8位數據(jù)輸出(chū),而(ér)DSP可(kě)能(néng)是(shì)16位數據(jù)輸入(rù),在(zài)單片(piàn)機(jī)與(yǔ)DSP連(lián)接时(shí)就(jiù)可(kě)以(yǐ)使用(yòng)FIFO来(lái)达(dá)到(dào)數據(jù)匹(pǐ)配的(de)目的(de)。
FIFO存儲器是(shì)系(xì)統的(de)緩沖环(huán)节(jié),如(rú)果(guǒ)沒(méi)有(yǒu)FIFO存儲器,整个(gè)系(xì)統就(jiù)不(bù)可(kě)能(néng)正(zhèng)常工作,它(tā)主(zhǔ)要(yào)有(yǒu)幾(jǐ)方(fāng)面(miàn)的(de)功能(néng):
1) 对(duì)連(lián)續的(de)數據(jù)流進(jìn)行緩存,防止在(zài)進(jìn)機(jī)和(hé)存儲操作时(shí)丢失數據(jù);
2) 數據(jù)集中(zhōng)起来(lái)進(jìn)行進(jìn)機(jī)和(hé)存儲,可(kě)避免頻繁的(de)總(zǒng)線(xiàn)操作,減輕(qīng)CPU的(de)負担;
3) 允许系(xì)統進(jìn)行DMA操作,提(tí)高(gāo)數據(jù)的(de)傳輸速度(dù)。这(zhè)是(shì)至(zhì)關(guān)重(zhòng)要(yào)的(de)一(yī)點(diǎn),如(rú)果(guǒ)不(bù)采用(yòng)DMA操作,數據(jù)傳輸将达(dá)不(bù)到(dào)傳輸要(yào)求,而(ér)且大大增加CPU的(de)負担,无法同(tóng)时(shí)完成(chéng)數據(jù)的(de)存儲工作。
4、FIFO的(de)主(zhǔ)要(yào)參數
同(tóng)步FIFO和(hé)异(yì)步FIFO略有(yǒu)不(bù)同(tóng),下(xià)面(miàn)的(de)參數适用(yòng)于(yú)两(liǎng)者(zhě)。
宽(kuān)度(dù),用(yòng)參數FIFO_data_size表(biǎo)示,它(tā)指的(de)是(shì) FIFO 一(yī)次(cì)读(dú)写操作的(de)數據(jù)位,也(yě)就(jiù)是(shì)FIFO存儲的(de)數據(jù)宽(kuān)度(dù);
深度(dù),用(yòng)參數FIFO_addr_size表(biǎo)示,也(yě)就(jiù)是(shì)地(dì)址的(de)大小,也(yě)就(jiù)是(shì)说(shuō)能(néng)存儲多(duō)少(shǎo)个(gè)數據(jù);
滿标(biāo)志,full,當FIFO中(zhōng)的(de)數據(jù)滿了(le)以(yǐ)後(hòu)将不(bù)再能(néng)進(jìn)行數據(jù)的(de)写入(rù),以(yǐ)阻止FIFO的(de)写操作繼續向(xiàng)FIFO中(zhōng)写數據(jù)而(ér)造成(chéng)溢出(chū)(overflow);
空标(biāo)志,empty,當FIFO为(wèi)空的(de)时(shí)候将不(bù)能(néng)進(jìn)行數據(jù)的(de)读(dú)出(chū),以(yǐ)阻止FIFO的(de)读(dú)操作繼續從FIFO中(zhōng)读(dú)出(chū)數據(jù)而(ér)造成(chéng)无效數據(jù)的(de)读(dú)出(chū)(underflow);
写地(dì)址,w_addr,由(yóu)自(zì)動(dòng)加一(yī)生(shēng)成(chéng),将數據(jù)写入(rù)該地(dì)址;
读(dú)地(dì)址,r_addr,由(yóu)自(zì)動(dòng)加一(yī)生(shēng)成(chéng),将該地(dì)址上(shàng)的(de)數據(jù)读(dú)出(chū);
同(tóng)步FIFO和(hé)异(yì)步FIFO的(de)最(zuì)主(zhǔ)要(yào)的(de)不(bù)同(tóng)就(jiù)體(tǐ)現(xiàn)在(zài)空滿标(biāo)志産生(shēng)的(de)方(fāng)式上(shàng),由(yóu)此(cǐ)引出(chū)两(liǎng)者(zhě)一(yī)些不(bù)同(tóng)的(de)參數。
同(tóng)步FIFO
时(shí)鐘(zhōng),clk,rst,读(dú)写應(yìng)用(yòng)同(tóng)一(yī)个(gè)时(shí)鐘(zhōng);
計(jì)數器,count,用(yòng)計(jì)數器来(lái)進(jìn)行空滿标(biāo)志的(de)判斷;
异(yì)步FIFO
时(shí)鐘(zhōng),clk_w,rst_w,clk_r,rst_r,读(dú)写應(yìng)用(yòng)不(bù)同(tóng)的(de)时(shí)鐘(zhōng);
指針(zhēn),w_pointer_gray,r_pointer_gray,用(yòng)指針(zhēn)来(lái)判斷空滿标(biāo)識;
同(tóng)步指針(zhēn),w_pointer_gray_sync,r_pointer_gray_sync,指針(zhēn)的(de)同(tóng)步操作,用(yòng)来(lái)做对(duì)比産生(shēng)空滿标(biāo)志符;
5、FIFO設計(jì)的(de)難點(diǎn)
FIFO設計(jì)的(de)難點(diǎn)在(zài)于(yú)怎樣(yàng)判斷FIFO的(de)空/滿狀态。为(wèi)了(le)保證數據(jù)正(zhèng)确的(de)写入(rù)或(huò)读(dú)出(chū),而(ér)不(bù)發(fà)生(shēng)溢出(chū)或(huò)读(dú)空的(de)狀态出(chū)現(xiàn),必須保證FIFO在(zài)滿的(de)情(qíng)況下(xià),不(bù)能(néng)進(jìn)行写操作。在(zài)空的(de)狀态下(xià)不(bù)能(néng)進(jìn)行读(dú)操作。怎樣(yàng)判斷FIFO的(de)滿/空就(jiù)成(chéng)了(le)FIFO設計(jì)的(de)核心(xīn)問(wèn)題(tí)。由(yóu)于(yú)同(tóng)步FIFO幾(jǐ)乎很少(shǎo)用(yòng)到(dào),这(zhè)里(lǐ)只(zhī)描述异(yì)步FIFO的(de)空/滿标(biāo)志産生(shēng)問(wèn)題(tí)。
5.1、亞稳态
在(zài)用(yòng)到(dào)觸發(fà)器的(de)設計(jì)中(zhōng),不(bù)可(kě)避免的(de)会(huì)遇到(dào)亞稳态的(de)問(wèn)題(tí)。亞稳态主(zhǔ)要(yào)發(fà)生(shēng)在(zài)异(yì)步信(xìn)号(hào)檢测、跨时(shí)鐘(zhōng)域信(xìn)号(hào)傳輸以(yǐ)及(jí)複位電(diàn)路(lù)等常用(yòng)設計(jì)中(zhōng)。在(zài)涉及(jí)到(dào)觸發(fà)器的(de)電(diàn)路(lù)中(zhōng),亞稳态无法徹底消除,只(zhī)能(néng)想(xiǎng)辦(bàn)法将其發(fà)生(shēng)的(de)概率将到(dào)最(zuì)低。
亞稳态發(fà)生(shēng)的(de)原因(yīn):
(1)在(zài)跨时(shí)鐘(zhōng)域信(xìn)号(hào)傳輸时(shí),由(yóu)于(yú)源寄存器时(shí)鐘(zhōng)和(hé)目的(de)寄存器时(shí)鐘(zhōng)相移未知,所(suǒ)以(yǐ)源寄存器數據(jù)發(fà)出(chū)數據(jù),數據(jù)可(kě)能(néng)在(zài)任何时(shí)間(jiān)到(dào)达(dá)异(yì)步时(shí)鐘(zhōng)域的(de)目的(de)寄存器,所(suǒ)以(yǐ)无法保證滿足目的(de)寄存器Tsu和(hé)Th的(de)要(yào)求;
(2)在(zài)异(yì)步信(xìn)号(hào)采集中(zhōng),由(yóu)于(yú)异(yì)步信(xìn)号(hào)可(kě)以(yǐ)在(zài)任意(yì)时(shí)間(jiān)點(diǎn)到(dào)达(dá)目的(de)寄存器,所(suǒ)以(yǐ)也(yě)无法保證滿足目的(de)寄存器Tsu和(hé)Th的(de)要(yào)求;
(3)在(zài)异(yì)步複位電(diàn)路(lù)中(zhōng),如(rú)果(guǒ)複位信(xìn)号(hào)的(de)釋放(fàng)时(shí)間(jiān)刚好(hǎo)是(shì)發(fà)生(shēng)在(zài)时(shí)鐘(zhōng)的(de)有(yǒu)效邊(biān)沿,難以(yǐ)保證滿足恢複时(shí)間(jiān)(Recovery Time)以(yǐ)及(jí)去(qù)除时(shí)間(jiān)(Removal Time),從而(ér)出(chū)現(xiàn)亞稳态。
當數據(jù)在(zài)目的(de)寄存器Tsu-Th时(shí)間(jiān)窗(chuāng)口(kǒu)發(fà)生(shēng)變(biàn)化(huà),也(yě)即當數據(jù)的(de)建立时(shí)間(jiān)或(huò)者(zhě)保持(chí)时(shí)間(jiān)不(bù)滿足时(shí),就(jiù)可(kě)能(néng)發(fà)生(shēng)亞稳态現(xiàn)象(xiàng)。
由(yóu)图(tú)可(kě)知,當産生(shēng)亞稳态後(hòu)Tco时(shí)間(jiān)後(hòu)会(huì)有(yǒu)Tmet(決斷时(shí)間(jiān))的(de)振蕩时(shí)間(jiān)段(duàn),當振蕩結束(shù)回(huí)到(dào)稳定(dìng)狀态时(shí)为(wèi)“0”或(huò)者(zhě)“1”,这(zhè)个(gè)是(shì)随機(jī)的(de)。因(yīn)此(cǐ),会(huì)对(duì)後(hòu)續電(diàn)路(lù)判斷造成(chéng)影響。
亞稳态産生(shēng)的(de)後(hòu)果(guǒ)
1、亞稳态中(zhōng)間(jiān)态时(shí)間(jiān)變(biàn)长:亞稳态是(shì)觸發(fà)器的(de)一(yī)个(gè)固有(yǒu)特(tè)性(xìng),正(zhèng)常采樣(yàng)也(yě)会(huì)有(yǒu)一(yī)个(gè)亞稳态时(shí)間(jiān)。如(rú)果(guǒ)觸發(fà)器觸發(fà)器的(de)輸入(rù)電(diàn)壓采樣(yàng)时(shí)間(jiān)过(guò)短(duǎn),則觸發(fà)器需要(yào)花很长时(shí)間(jiān)来(lái)实現(xiàn)輸出(chū)邏輯达(dá)到(dào)标(biāo)準電(diàn)平,在(zài)这(zhè)段(duàn)时(shí)間(jiān)里(lǐ)輸出(chū)端在(zài)高(gāo)低電(diàn)平之間(jiān)处于(yú)振蕩狀态,而(ér)不(bù)是(shì)等于(yú)理想(xiǎng)輸出(chū)值。當建立时(shí)間(jiān)和(hé)保持(chí)时(shí)間(jiān)滿足时(shí),觸發(fà)器也(yě)会(huì)經(jīng)曆采樣(yàng)—亞稳态—随後(hòu)稳定(dìng)輸出(chū)。而(ér)出(chū)現(xiàn)亞稳态問(wèn)題(tí)时(shí),亞稳态(中(zhōng)間(jiān)态)时(shí)間(jiān)變(biàn)长。
2、亞稳态的(de)輸出(chū)不(bù)一(yī)定(dìng)正(zhèng)确:正(zhèng)常工作时(shí),觸發(fà)器經(jīng)曆較短(duǎn)的(de)亞稳态时(shí)間(jiān),随後(hòu)会(huì)正(zhèng)确輸出(chū);而(ér)出(chū)現(xiàn)亞稳态問(wèn)題(tí)时(shí),觸發(fà)器經(jīng)曆較长的(de)亞稳态时(shí)間(jiān),最(zuì)終(zhōng)輸出(chū)稳定(dìng)但无法保證正(zhèng)确(是(shì)稳定(dìng)的(de)标(biāo)準電(diàn)平信(xìn)号(hào),但難以(yǐ)保證是(shì)輸入(rù)对(duì)應(yìng)輸出(chū));
常用(yòng)对(duì)亞稳态消除有(yǒu)三(sān)種(zhǒng)方(fāng)式:
对(duì)跨时(shí)鐘(zhōng)域的(de)信(xìn)号(hào)做跨时(shí)鐘(zhōng)域傳輸处理
采用(yòng)异(yì)步FIFO或(huò)者(zhě)握手(shǒu)協議对(duì)跨时(shí)鐘(zhōng)域數據(jù)通(tòng)信(xìn)進(jìn)行緩沖設計(jì)
对(duì)异(yì)步複位電(diàn)路(lù)采用(yòng)异(yì)步複位、同(tóng)步釋放(fàng)处理
对(duì)异(yì)步信(xìn)号(hào)進(jìn)行同(tóng)步处理
5.2、FIFO設計(jì)的(de)方(fāng)法
(1)使用(yòng)格雷(léi)碼
格雷(léi)碼在(zài)相鄰的(de)两(liǎng)个(gè)碼元(yuán)之間(jiān)只(zhī)由(yóu)一(yī)位變(biàn)換(二(èr)進(jìn)制碼在(zài)很多(duō)情(qíng)況下(xià)是(shì)很多(duō)碼元(yuán)在(zài)同(tóng)时(shí)變(biàn)化(huà))。这(zhè)就(jiù)会(huì)避免計(jì)數器與(yǔ)时(shí)鐘(zhōng)同(tóng)步的(de)时(shí)候發(fà)生(shēng)亞稳态現(xiàn)象(xiàng)。但是(shì)格雷(léi)碼有(yǒu)个(gè)缺點(diǎn)就(jiù)是(shì)只(zhī)能(néng)定(dìng)義2n的(de)深度(dù),而(ér)不(bù)能(néng)像二(èr)進(jìn)制碼那(nà)樣(yàng)随意(yì)的(de)定(dìng)義FIFO的(de)深度(dù),因(yīn)为(wèi)格雷(léi)碼必須循环(huán)一(yī)个(gè)2n,否則就(jiù)不(bù)能(néng)保證两(liǎng)个(gè)相鄰碼元(yuán)之間(jiān)相差一(yī)位的(de)条(tiáo)件(jiàn),因(yīn)此(cǐ)也(yě)就(jiù)不(bù)是(shì)真(zhēn)正(zhèng)的(de)各(gè)雷(léi)碼了(le)。
格雷(léi)碼实現(xiàn)多(duō)比特(tè)跨时(shí)鐘(zhōng)域轉(zhuǎn)換的(de)原理:因(yīn)为(wèi)fifo中(zhōng)地(dì)址是(shì)逐次(cì)+1的(de),而(ér)格雷(léi)碼相鄰两(liǎng)位數據(jù)一(yī)次(cì)只(zhī)有(yǒu)一(yī)位數據(jù)發(fà)生(shēng)變(biàn)化(huà)。因(yīn)此(cǐ),将写地(dì)址(读(dú)地(dì)址)變(biàn)換成(chéng)格雷(léi)碼,虽然地(dì)址是(shì)多(duō)比特(tè)的(de),但是(shì)每次(cì)變(biàn)化(huà)只(zhī)有(yǒu)1bit發(fà)生(shēng)變(biàn)化(huà)。这(zhè)就(jiù)是(shì)将二(èr)進(jìn)制的(de)地(dì)址轉(zhuǎn)換成(chéng)格雷(léi)碼的(de)好(hǎo)处了(le)。
如(rú)果(guǒ)是(shì)将写地(dì)址變(biàn)成(chéng)格雷(léi)碼,轉(zhuǎn)換完以(yǐ)後(hòu)再進(jìn)行垮时(shí)鐘(zhōng)域到(dào)读(dú)时(shí)鐘(zhōng)域去(qù)就(jiù)能(néng)最(zuì)大限度(dù)的(de)降低垮时(shí)鐘(zhōng)域带(dài)来(lái)的(de)风险(亞稳态)。(敲黑(hēi)板:先(xiān)轉(zhuǎn)換成(chéng)格雷(léi)碼再跨时(shí)鐘(zhōng)域)
二(èr)進(jìn)制到(dào)格雷(léi)碼:
二(èr)進(jìn)制右(yòu)移一(yī)位後(hòu)與(yǔ)原来(lái)的(de)二(èr)進(jìn)制按位异(yì)或(huò) = 格雷(léi)碼
格雷(léi)碼轉(zhuǎn)二(èr)進(jìn)制:
格雷(léi)碼的(de)最(zuì)高(gāo)位作为(wèi)二(èr)進(jìn)制的(de)最(zuì)高(gāo)位,然後(hòu)将二(èr)進(jìn)制的(de)最(zuì)高(gāo)位和(hé)格雷(léi)碼的(de)次(cì)高(gāo)位异(yì)或(huò)作为(wèi)二(èr)進(jìn)制的(de)次(cì)高(gāo)位,依次(cì)類(lèi)推。
(2)使用(yòng)冗餘的(de)觸發(fà)器
假設一(yī)个(gè)觸發(fà)器發(fà)生(shēng)亞稳态的(de)概率为(wèi)P,那(nà)麼(me)两(liǎng)个(gè)及(jí)聯的(de)觸發(fà)器發(fà)生(shēng)亞稳态的(de)概率就(jiù)为(wèi)P的(de)平方(fāng)。但这(zhè)回(huí)導致(zhì)延时(shí)的(de)增加。亞稳态的(de)發(fà)生(shēng)会(huì)使得FIFO出(chū)現(xiàn)錯誤,读(dú)/写时(shí)鐘(zhōng)采樣(yàng)的(de)地(dì)址指針(zhēn)会(huì)與(yǔ)真(zhēn)实的(de)值之間(jiān)不(bù)同(tóng),这(zhè)就(jiù)導致(zhì)写入(rù)或(huò)读(dú)出(chū)的(de)地(dì)址錯誤。由(yóu)于(yú)考慮延时(shí)的(de)作用(yòng),空/滿标(biāo)志的(de)産生(shēng)并不(bù)一(yī)定(dìng)出(chū)現(xiàn)在(zài)FIFO真(zhēn)的(de)空/滿时(shí)才出(chū)現(xiàn)。可(kě)能(néng)FIFO還(huán)未空/滿时(shí)就(jiù)出(chū)現(xiàn)了(le)空/滿标(biāo)志。这(zhè)并沒(méi)有(yǒu)什麼(me)不(bù)好(hǎo),只(zhī)要(yào)保證FIFO不(bù)出(chū)現(xiàn)overflow or underflow 就(jiù)OK了(le)。
(3)空滿狀态的(de)判斷
要(yào)判斷fifo的(de)狀态,就(jiù)需要(yào)知道(dào)读(dú)写地(dì)址。通(tòng)过(guò)判斷读(dú)写地(dì)址的(de)差值来(lái)判斷狀态。其中(zhōng)存在(zài)一(yī)直(zhí)特(tè)殊情(qíng)況:读(dú)写地(dì)址指針(zhēn)指向(xiàng)同(tóng)一(yī)个(gè)地(dì)址,但是(shì)可(kě)能(néng)是(shì)滿,也(yě)可(kě)能(néng)是(shì)空。
具體(tǐ)分(fēn)析:因(yīn)为(wèi)fifo是(shì)回(huí)卷(juǎn)式的(de)写和(hé)读(dú),这(zhè)也(yě)就(jiù)是(shì)说(shuō)如(rú)果(guǒ)fifo深度(dù)为(wèi)1023,如(rú)果(guǒ)写地(dì)址在(zài)1023,写地(dì)址指針(zhēn)会(huì)重(zhòng)新回(huí)到(dào)0地(dì)址,如(rú)果(guǒ)此(cǐ)时(shí)读(dú)地(dì)址還(huán)在(zài)地(dì)址0,就(jiù)会(huì)存在(zài)读(dú)写地(dì)址都在(zài)地(dì)址0。而(ér)空的(de)时(shí)候,读(dú)写地(dì)址也(yě)存在(zài)都在(zài)0地(dì)址的(de)問(wèn)題(tí)。
方(fāng)法:将读(dú)写地(dì)址擴展(zhǎn)一(yī)位,當读(dú)写地(dì)址的(de)值相等时(shí),为(wèi)空;读(dú)写地(dì)址除最(zuì)高(gāo)位不(bù)同(tóng),其餘相同(tóng)为(wèi)滿。
6、FIFO深度(dù)(存儲容量(liàng))計(jì)算
异(yì)步FIFO,读(dú)写时(shí)鐘(zhōng)不(bù)同(tóng)頻,那(nà)麼(me)FIFO主(zhǔ)要(yào)用(yòng)于(yú)數據(jù)緩存,我(wǒ)们(men)選擇的(de)FIFO深度(dù)應(yìng)該能(néng)够保證在(zài)最(zuì)极(jí)端的(de)情(qíng)況下(xià),仍然不(bù)会(huì)溢出(chū)。因(yīn)此(cǐ)考慮的(de)前(qián)提(tí)一(yī)般都是(shì)写时(shí)鐘(zhōng)頻率大于(yú)读(dú)时(shí)鐘(zhōng)頻率,但是(shì)若写操作是(shì)連(lián)續的(de)數據(jù)流,那(nà)麼(me)再大的(de)FIFO都无法保證數據(jù)不(bù)溢出(chū)。因(yīn)此(cǐ)可(kě)以(yǐ)認为(wèi)这(zhè)種(zhǒng)情(qíng)況下(xià)写數據(jù)的(de)傳輸是(shì)“突發(fà)Burst”的(de),即写操作并不(bù)連(lián)續,設計(jì)者(zhě)需要(yào)根(gēn)據(jù)滿标(biāo)志控制或(huò)者(zhě)自(zì)己来(lái)控制写操作的(de)起止。
宏观地(dì),從整个(gè)时(shí)間(jiān)域上(shàng)看(kàn),"写數據(jù)=读(dú)數據(jù)",这(zhè)个(gè)条(tiáo)件(jiàn)必須要(yào)滿足,如(rú)果(guǒ)这(zhè)个(gè)大条(tiáo)件(jiàn)不(bù)滿足的(de)話(huà),用(yòng)FIFO是(shì)沒(méi)有(yǒu)效果(guǒ)的(de)。但是(shì)在(zài)發(fà)送方(fāng)"突發(fà)"發(fà)送數據(jù)的(de)时(shí)間(jiān)T內(nèi),是(shì)很有(yǒu)可(kě)能(néng)写數據(jù)>读(dú)數據(jù)的(de),因(yīn)此(cǐ)FIFO的(de)深度(dù)要(yào)能(néng)够保證,在(zài)这(zhè)段(duàn)时(shí)間(jiān)T內(nèi),如(rú)果(guǒ)接收(shōu)方(fāng)未能(néng)将發(fà)送方(fāng)發(fà)送的(de)數據(jù)接收(shōu)完畢的(de)話(huà),剩下(xià)的(de)數據(jù)都是(shì)可(kě)以(yǐ)存儲在(zài)FIFO內(nèi)部(bù)而(ér)且不(bù)会(huì)溢出(chū)的(de),那(nà)麼(me)在(zài)發(fà)送方(fāng)停止發(fà)送數據(jù)的(de)"空閑时(shí)隙"內(nèi),接收(shōu)方(fāng)可(kě)以(yǐ)從容地(dì)接收(shōu)剩下(xià)来(lái)的(de)數據(jù)。
如(rú)果(guǒ)數據(jù)流連(lián)續不(bù)斷則FIFO深度(dù)无論多(duō)少(shǎo),只(zhī)要(yào)读(dú)写时(shí)鐘(zhōng)不(bù)同(tóng)源同(tóng)頻則都会(huì)丢數;
FIFO用(yòng)于(yú)緩沖块(kuài)數據(jù)流,一(yī)般用(yòng)在(zài)写快(kuài)读(dú)慢(màn)时(shí),
FIFO深度(dù) / (写入(rù)速率 - 读(dú)出(chū)速率) = FIFO被(bèi)填滿时(shí)間(jiān) 應(yìng)大于(yú) 數據(jù)包(bāo)傳送时(shí)間(jiān) = 數據(jù)量(liàng) / 写入(rù)速率。
FIFO深度(dù)計(jì)算的(de)關(guān)鍵在(zài)于(yú):在(zài)規定(dìng)时(shí)間(jiān)內(nèi)傳輸的(de)數據(jù)等于(yú)接收(shōu)的(de)數據(jù),写快(kuài)读(dú)慢(màn)的(de)情(qíng)況下(xià),突發(fà)burst写入(rù)的(de)數據(jù)減去(qù)該burst时(shí)間(jiān)內(nèi)读(dú)出(chū)的(de)數據(jù),多(duō)餘的(de)數據(jù)需要(yào)能(néng)緩沖下(xià)来(lái),讓接收(shōu)端在(zài)剩下(xià)空閑的(de)时(shí)間(jiān)能(néng)從容地(dì)把多(duō)餘的(de)數據(jù)读(dú)出(chū)来(lái)。
例題(tí)
1.读(dú)写沒(méi)有(yǒu)空閑周期(qī)。(fA>fB)
fA = 80MHz;fB = 50MHz;Burst Length = 120
读(dú)写之間(jiān)沒(méi)有(yǒu)空閑周期(qī),这(zhè)意(yì)味着突發(fà)中(zhōng)的(de)所(suǒ)有(yǒu)項目都将在(zài)連(lián)續的(de)时(shí)鐘(zhōng)周期(qī)內(nèi)写入(rù)和(hé)读(dú)取(qǔ)。
計(jì)算方(fāng)法:
總(zǒng)數據(jù)傳輸:120
写一(yī)个(gè)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 1 / 80MHz = 12.5ns
写入(rù)所(suǒ)有(yǒu)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 120 * 12.5ns = 1500ns
读(dú)一(yī)个(gè)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 1 / 50MHz = 20ns
每1500ns,120个(gè)數據(jù)被(bèi)写入(rù)FIFO,但读(dú)一(yī)个(gè)數據(jù)需要(yào)20ns的(de)时(shí)間(jiān)
則1500ns內(nèi)读(dú)出(chū)多(duō)少(shǎo)个(gè)數據(jù),1500 / 20 = 75
剩下(xià)的(de)沒(méi)有(yǒu)读(dú)出(chū),就(jiù)存在(zài)FIFO中(zhōng),則多(duō)餘的(de)數據(jù)为(wèi)120 - 75 = 45
快(kuài)捷方(fāng)法:FIFO的(de)最(zuì)小深度(dù) =120 - 120*50/80 = 45
補充:读(dú)写沒(méi)有(yǒu)空閑,若fA<=fB,則FIFO不(bù)会(huì)写滿,深度(dù)为(wèi)1即可(kě)。
2.读(dú)写都有(yǒu)空閑周期(qī)。(读(dú)写速率大小随意(yì),可(kě)以(yǐ)相等)
fA = 80MHz;fB = 50MHz;Burst Length = 120
两(liǎng)个(gè)連(lián)續写入(rù)之間(jiān)的(de)空閑周期(qī)为(wèi) = 1(写使能(néng)占得百(bǎi)分(fēn)比为(wèi)50%)
两(liǎng)个(gè)連(lián)續读(dú)取(qǔ)之間(jiān)的(de)空閑周期(qī)为(wèi) = 3(读(dú)使能(néng)占得百(bǎi)分(fēn)比为(wèi)25%)
計(jì)算方(fāng)法:
每写入(rù)一(yī)个(gè)數據(jù)等待1个(gè)周期(qī)再写入(rù)下(xià)个(gè)數據(jù),即2周期(qī)写入(rù)1个(gè)數據(jù)。
每读(dú)出(chū)一(yī)个(gè)數據(jù)等待3个(gè)周期(qī)再读(dú)出(chū)下(xià)个(gè)數據(jù),即4周期(qī)读(dú)出(chū)1个(gè)數據(jù)。
写一(yī)个(gè)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 2 * (1 / 80MHz) = 25ns
写一(yī)个(gè)突發(fà)需要(yào)的(de)时(shí)間(jiān) = 120 * 25ns = 3000ns
读(dú)一(yī)个(gè)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 4 * (1 / 50MHz) = 80ns
每3000ns,120个(gè)數據(jù)被(bèi)写入(rù)FIFO,但读(dú)一(yī)个(gè)數據(jù)需要(yào)80ns的(de)时(shí)間(jiān)
則3000ns內(nèi)读(dú)出(chū)多(duō)少(shǎo)个(gè)數據(jù),3000 / 80 = 37.5,FIFO深度(dù)=120-37.5=83。
快(kuài)捷方(fāng)法:FIFO深度(dù) = 120 - 120*(50/4)/(80/2)=82.5=83。
3.考慮背靠背,读(dú)写速率相等。
读(dú)写速率相等;每100个(gè)时(shí)鐘(zhōng)写入(rù)80个(gè)數據(jù);每10个(gè)时(shí)鐘(zhōng)读(dú)取(qǔ)8个(gè)數據(jù);突發(fà)长度(dù)为(wèi)160 (这(zhè)个(gè)条(tiáo)件(jiàn)其实多(duō)餘)
計(jì)算方(fāng)法:
每100个(gè)时(shí)鐘(zhōng)写入(rù)80个(gè)數據(jù),那(nà)剩下(xià)20个(gè)时(shí)鐘(zhōng)周期(qī)去(qù)哪了(le)?
每10个(gè)时(shí)鐘(zhōng)读(dú)取(qǔ)8个(gè)數據(jù),那(nà)剩下(xià)2个(gè)时(shí)鐘(zhōng)周期(qī)去(qù)哪了(le)?
剩下(xià)的(de)周期(qī)在(zài)哪我(wǒ)们(men)不(bù)管(guǎn),只(zhī)考慮最(zuì)差的(de)情(qíng)況,即前(qián)20个(gè)时(shí)鐘(zhōng)周期(qī)空閑,後(hòu)80个(gè)周期(qī)写完80个(gè)數據(jù),立马又是(shì)写請求,这(zhè)次(cì)是(shì)前(qián)80个(gè)时(shí)鐘(zhōng)周期(qī)写完80个(gè)數據(jù),後(hòu)20个(gè)时(shí)鐘(zhōng)周期(qī)空閑。即連(lián)續的(de)写入(rù),又稱为(wèi)背靠背。也(yě)就(jiù)可(kě)以(yǐ)看(kàn)成(chéng)一(yī)个(gè)突發(fà)写入(rù)是(shì)80+80=160。
写一(yī)个(gè)突發(fà)需要(yào)的(de)时(shí)間(jiān):160时(shí)鐘(zhōng)周期(qī)
則160个(gè)时(shí)鐘(zhōng)周期(qī)內(nèi)读(dú)出(chū)多(duō)少(shǎo)个(gè)數據(jù),160*8/10=128。
FIFO深度(dù) = 160 - 128 = 32。
4.考慮背靠背,读(dú)写速率不(bù)等。
fA = 20MHz;fB = 40MHz;每1000个(gè)时(shí)鐘(zhōng)周期(qī)写入(rù)500个(gè)數據(jù);每4个(gè)时(shí)鐘(zhōng)周期(qī)读(dú)出(chū)1个(gè)數據(jù)
計(jì)算方(fāng)法:
考慮到(dào)“背靠背”的(de)情(qíng)況突發(fà)长度(dù)則为(wèi)500 * 2 = 1000
則为(wèi)每1000个(gè)时(shí)鐘(zhōng)周期(qī)写入(rù)1000个(gè)數據(jù)
每4个(gè)周期(qī),读(dú)取(qǔ)一(yī)个(gè)數據(jù)。
写一(yī)个(gè)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 1 / 20MHz = 50ns
写一(yī)个(gè)突發(fà)需要(yào)的(de)时(shí)間(jiān) = 1000 * 50ns = 50000ns
读(dú)一(yī)个(gè)數據(jù)需要(yào)的(de)时(shí)間(jiān) = 4 * (1 / 40MHz) = 100ns
每50000ns,120个(gè)數據(jù)被(bèi)写入(rù)FIFO,但读(dú)一(yī)个(gè)數據(jù)需要(yào)100ns的(de)时(shí)間(jiān)
可(kě)以(yǐ)計(jì)算出(chū),50000ns內(nèi)读(dú)出(chū)多(duō)少(shǎo)个(gè)數據(jù),50000 /100 = 500
剩下(xià)的(de)沒(méi)有(yǒu)读(dú)出(chū),就(jiù)存在(zài)FIFO中(zhōng),則需要(yào)1000- 500 = 500
温(wēn)馨提(tí)示:明(míng)德揚2023推出(chū)了(le)全(quán)新課程——
邏輯設計(jì)基本(běn)功修煉課,降低学習FPGA門(mén)檻的(de)同(tóng)时(shí),增加了(le)学習的(de)趣味性(xìng)
http://old.mdy-edu.com/chanpinzhongxin/peixunkecheng/2023/0215/1889.html
(點(diǎn)擊→了(le)解(jiě)課程詳情(qíng)☝)
明(míng)德揚除了(le)培訓学習還(huán)有(yǒu)項目承接業务,擅长的(de)項目主(zhǔ)要(yào)包(bāo)括的(de)方(fāng)向(xiàng)有(yǒu)以(yǐ)下(xià)幾(jǐ)个(gè)方(fāng)面(miàn):
1. MIPI視頻拼接
2. SLVS-EC轉(zhuǎn)MIPI接口(kǒu)(IMX472 IMX492)
3. PCIE采集系(xì)統
4. 图(tú)像項目
5. 高(gāo)速多(duō)通(tòng)道(dào)ADDA系(xì)統
6. 基于(yú)FPGA板卡(kǎ)研發(fà)
7. 多(duō)通(tòng)道(dào)高(gāo)靈敏電(diàn)荷放(fàng)大器
8. 射頻前(qián)端
http://old.mdy-edu.com/xmucjie/2023/0201/1865.html
(點(diǎn)擊→了(le)解(jiě)項目承接業务詳情(qíng)☝)
需要(yào)了(le)解(jiě)相關(guān)信(xìn)息可(kě)以(yǐ)聯系(xì):江老(lǎo)师(shī)13326430732、18022859964(微信(xìn)同(tóng)号(hào))








