【FPGA技巧篇】時(shí)鐘設(shè)計(jì)技巧
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
時(shí)鐘信號(hào)在很大程度上決定了整個(gè)設(shè)計(jì)的性能和可靠性,盡量避免使用FPGA內(nèi)部邏輯產(chǎn)生的時(shí)鐘,因?yàn)樗苋菀讓?dǎo)致功能或時(shí)序出現(xiàn)問題。內(nèi)部邏輯(組合邏輯)產(chǎn)生的時(shí)鐘容易出現(xiàn)毛刺,影響設(shè)計(jì)的功能實(shí)現(xiàn);組合邏輯固有的延時(shí)也容易導(dǎo)致時(shí)序問題。
一、內(nèi)部邏輯產(chǎn)生的時(shí)鐘
若使用組合邏輯的輸出作為時(shí)鐘信號(hào)或異步復(fù)位信號(hào),設(shè)計(jì)者必須對(duì)有可能出現(xiàn)的問題采取必要的預(yù)防措施。我們知道,在正常的同步設(shè)計(jì)中,一個(gè)時(shí)鐘一個(gè)節(jié)拍的數(shù)據(jù)流控制能夠保證系統(tǒng)持續(xù)穩(wěn)定的工作。但是,組合邏輯產(chǎn)生的時(shí)鐘不可避免地會(huì)有毛刺出現(xiàn),如果此時(shí)輸入端口的數(shù)據(jù)正處于變化過程,那么它將違反建立和保持時(shí)間要求,從而影響后續(xù)電路的輸出狀態(tài),甚至導(dǎo)致整個(gè)系統(tǒng)運(yùn)行失敗。
對(duì)于必須采用內(nèi)部邏輯作時(shí)鐘或者復(fù)位信號(hào)的應(yīng)用,也還是有解決辦法的。思路并不復(fù)雜,和異步復(fù)位、同步釋放的原理是一樣的。在輸出時(shí)鐘或者復(fù)位信號(hào)之前,再用系統(tǒng)專用時(shí)鐘信號(hào)(通常指外部晶振輸入時(shí)鐘或者PLL處理后的時(shí)鐘信號(hào))打一拍,從而避免組合邏輯直接輸出,達(dá)到同步處理的效果。對(duì)于輸出的時(shí)鐘信號(hào)或復(fù)位信號(hào),最好讓它走全局時(shí)鐘網(wǎng)絡(luò),從而減小時(shí)鐘網(wǎng)絡(luò)延時(shí),提升系統(tǒng)時(shí)序性能。
內(nèi)部邏輯產(chǎn)生的時(shí)鐘處理如下:
二、分頻時(shí)鐘與使能時(shí)鐘
設(shè)計(jì)中往往需要用到主時(shí)鐘的若干分頻信號(hào)作為時(shí)鐘,即分頻時(shí)鐘??蓜e小看這個(gè)所謂的分頻時(shí)鐘,簡(jiǎn)簡(jiǎn)單單不加處理的亂用時(shí)鐘那就叫時(shí)鐘滿天飛,是很不好的設(shè)計(jì)風(fēng)格。言歸正傳,如果設(shè)計(jì)中確實(shí)需要用到系統(tǒng)主時(shí)鐘的分頻信號(hào)來降低頻率時(shí),該如何處理呢?
對(duì)于資源較豐富的FPGA,一般都有內(nèi)嵌的多個(gè)PLL或者DLL專門用于時(shí)鐘管理,利用它們就可以很容易地達(dá)到多個(gè)時(shí)鐘的設(shè)計(jì),輸出時(shí)鐘能夠配置成設(shè)計(jì)者期望的不同頻率和相位差(相對(duì)于輸入時(shí)鐘),這樣的時(shí)鐘分頻是最穩(wěn)定的。但是對(duì)于某些無法使用PLL或者DLL資源的器件又該怎么辦呢?推薦使用“使能時(shí)鐘”進(jìn)行設(shè)計(jì),在“使能時(shí)鐘”設(shè)計(jì)中只使用原有的時(shí)鐘,讓分頻信號(hào)作為使能信號(hào)來用。
下面舉一個(gè)實(shí)例來說明如何進(jìn)行使能時(shí)鐘的設(shè)計(jì),該設(shè)計(jì)需要得到一個(gè)50MHz鐘的5分頻信號(hào)即10MHz。
input clk; //50MHz時(shí)鐘信號(hào)input rst n; reg[2:0]ent;wire en; //使能信號(hào),高電平有效 //5分頻計(jì)數(shù)0~4always@( posedge clk or negedge rst _n)begin if(!rst _n) ent<=3'd0; else if(ent<3'd4) ent<=ent+1b1; else ent<=3'd0;endassign en=(cnt==3'd4);//每5個(gè)時(shí)鐘周期產(chǎn)生1個(gè)時(shí)鐘周期高脈沖 //使用使能時(shí)鐘always@( posedge clk or negedge rst _n)begin if(!rst _n)…; else if(en)…; ... end
如下圖所示,使能信號(hào)不直接作為時(shí)鐘使用,而是作為數(shù)據(jù)輸入端的選擇信號(hào),這避免了使用分頻時(shí)鐘。
三、門控時(shí)鐘
組合邏輯中多用門控時(shí)鐘,一般驅(qū)動(dòng)門控時(shí)鐘的邏輯都是只包含一個(gè)與門(或門).如其他的附加邏輯,容易因競(jìng)爭(zhēng)產(chǎn)生不希望的毛刺。如圖a所示,門控時(shí)鐘通過一個(gè)使號(hào)控制時(shí)鐘的開或者關(guān)。當(dāng)系統(tǒng)不工作時(shí)可以關(guān)閉時(shí)鐘,整個(gè)系統(tǒng)就處于非激活狀態(tài),這種夠在某種程度上降低系統(tǒng)功耗。
圖a:門控時(shí)鐘
然而,使用門控時(shí)鐘并不符合同步設(shè)計(jì)的思想,它可能會(huì)影響系統(tǒng)設(shè)計(jì)的實(shí)現(xiàn)和驗(yàn)證。單純從功能實(shí)現(xiàn)來看,使用使能時(shí)鐘替代門控時(shí)鐘是一個(gè)不錯(cuò)的選擇;但是使能時(shí)鐘在使能信號(hào)關(guān)閉時(shí),時(shí)鐘信號(hào)仍然在工作,它無法像門控時(shí)鐘那樣降低系統(tǒng)功耗。
是否有一種設(shè)計(jì)方法既可以降低系統(tǒng)功耗,又能夠穩(wěn)定可靠的替代門控時(shí)鐘呢?Altera就提出了一種解決方案,且待我慢慢道來。如圖b所示,對(duì)于上升沿有效的系統(tǒng)時(shí)鐘cì k,它的下降沿先把門控信號(hào)(gating signal)打一拍,然后再用這個(gè)使能信號(hào)(enable)和系統(tǒng)時(shí)鐘(clk)相與后作為后續(xù)電路的門控時(shí)鐘。
圖b:推薦的門控時(shí)鐘
這樣的門控時(shí)鐘電路很好地解決了組合邏輯常見的一些問題。它避免了毛刺的出現(xiàn),同時(shí)也有效抑制了亞穩(wěn)態(tài)可能帶來的危害。但是從另一個(gè)方面來說,如果這個(gè)設(shè)計(jì)的系統(tǒng)時(shí)鐘(clk)占空比不是很穩(wěn)定,或者輸出的使能信號(hào)(enable)與時(shí)鐘信號(hào)(clk)的邏輯過于復(fù)雜(不止這個(gè)例子中一個(gè)與門那么簡(jiǎn)單),那么它也會(huì)帶來一些功能或時(shí)序上的問題。總的來說,只要設(shè)計(jì)者控制好這個(gè)設(shè)計(jì)中時(shí)鐘的占空比和門控邏輯復(fù)雜度,它還是比圖a給出的門控時(shí)鐘方案更可行。





