|
玩轉(zhuǎn) FPGA 前言
一直以來(lái)都想寫(xiě)點(diǎn)什么,關(guān)于 FPGA 設(shè)計(jì),因?yàn)橛悬c(diǎn)不太服氣。為什么同樣是設(shè)計(jì),有些人可以好像玩一樣的擺弄,photoshop,很時(shí)尚,很跩。有些人可以用所謂的廣告創(chuàng)意玩弄人們的智商。而硬件工程師則一律的被人以為呆板沒(méi)有創(chuàng)意。我是說(shuō),為什么我們不可以享受設(shè)計(jì)本身的樂(lè)趣,發(fā)揮我們自己的創(chuàng)意,為什么就不可以很隨心所欲的擺弄我們手里的那些玩具到處?kù)乓屆琅畟兛粗覀兊难劬Χ及l(fā)光?難道一定就是那些冷冰冰的 Datasheet, 死板的 Schedule, 老板的豬肝臉?所以我寫(xiě)這些東西的目的,就是想讓大家可以和我一起起來(lái),玩轉(zhuǎn) FPGA。所以大家千萬(wàn)別抱著學(xué)習(xí)的態(tài)度來(lái)看。看累了,不如去打打游戲,看煩了,不如自己去試著做幾個(gè)項(xiàng)目玩玩。FPGA 是可以玩的,而設(shè)計(jì) FPGA 的工具也是很好玩的,為什么?我們先了解一下我們的玩具。和所有的玩具一樣,這款玩具也有它的適合玩家。你如果有一些準(zhǔn)備,你可以玩得更開(kāi)心些。首先是語(yǔ)言,你需要至少知道一樣設(shè)計(jì)方式吧。Verilog 或者 VHDL.我個(gè)人比較喜歡 Verilog,不過(guò)這并不重要。不會(huì)?那會(huì)畫(huà)電路圖也可以啊。或者呢,會(huì)用 Simulink 搭個(gè)模型什么的也可以。如果會(huì)寫(xiě)一點(diǎn) C,恐怕就更好了。那么什么是 FPGA (已經(jīng)知道的朋友盡可以跳過(guò)去不看)。想知道學(xué)名,去查一下字典,想知道他的歷史,去問(wèn)一下你的教授。我不說(shuō)這些,因?yàn)槲覀兊哪康模褪峭妗D銘?yīng)該知道芯片吧。對(duì),好像因特爾的 CPU,還有 AMD。好像德州儀器的 DSP。還有 ASIC, ASSP, 反正現(xiàn)在這個(gè)世界,沒(méi)有芯片你恐怕活不下去。而學(xué)電子的,如果不知道芯片,那也不用活了。還有一樣?xùn)|西,你一定也知道,就是 CD-RW, DVD-RW.反復(fù)可擦寫(xiě)光盤(pán)。而 FPGA 就是反復(fù)可擦寫(xiě)的芯片。這樣你就知道他能有多好玩了,是否還記得第一次拿到 CD-RW 的時(shí)候那種驚喜的感覺(jué)?想放什么就放什么,想做什么就做什么。你拿到的這東西就是一片巨大的空白,就看玩家怎么往里面塞東西了。 因?yàn)樗呀?jīng)是現(xiàn)成的半成品,完全不需要去等待漫長(zhǎng)的流片時(shí)間,你就可以看到你的設(shè)計(jì)在板上實(shí)現(xiàn)。這就是為什么這個(gè)玩具,它可以玩,而且因?yàn)槭菙?shù)字電路,所以隨便你怎么玩,只要你不插錯(cuò)電源,都可以。不會(huì)著火的安全玩具。
下面一個(gè)問(wèn)題是,為什么要玩 FPGA。FPGA 一開(kāi)始是一種附屬的玩具,主要的玩具是 ASIC。人們?yōu)榱蓑?yàn)證 ASIC 設(shè)計(jì)的功能,往往用 FPGA 來(lái)測(cè)試。因?yàn)樗恍枰L(zhǎng)的制造時(shí)間。就好像看看這個(gè)小孩子長(zhǎng)什么樣吧,也就知道他長(zhǎng)大了大概是什么樣子。但是現(xiàn)在這個(gè)小孩子居然也慢慢長(zhǎng)大了。他開(kāi)始普遍的被用在非常多的產(chǎn)品里面。首先一個(gè)原因是價(jià)格。現(xiàn)在的工藝水平是越來(lái)越高,這當(dāng)然是好事情,但是壞事情是,也變得越來(lái)越貴。可以想象啊,線寬越來(lái)越窄,不是需要更厲害一點(diǎn)的放大鏡嗎?而這種高工藝導(dǎo)致的高價(jià)格是很多產(chǎn)量并不大的 ASIC 無(wú)法承受。而 FPGA 作為一個(gè)通用的器件呢,它完全可以去追求最新最好的工藝,而讓它的買(mǎi)家一起分?jǐn)偹某杀尽K悄壳靶酒瑯I(yè)擁有利潤(rùn)空間最大的一個(gè)分支。可以想象,如果有一天,F(xiàn)PGA 公司把這塊利潤(rùn)釋放出來(lái),對(duì) ASIC,ASSP 設(shè)計(jì)公司的打擊是致命的。第二個(gè)原因,就是他可以玩,可以反復(fù)擦寫(xiě)。玩這個(gè),比玩 ASIC 要快很多,產(chǎn)品可以早點(diǎn)賣(mài)出去。另外如果有一天,你又想出了更好的玩法,你完全可以去把你已經(jīng)賣(mài)給別人的東西換掉,變成更好的東西。而如果這個(gè)時(shí)候你面對(duì)的是你設(shè)計(jì)的ASIC,你只好哭吧。第三個(gè)原因,就好像廣告里面說(shuō)的:方~~~~~便。
再來(lái)看看這套玩具里面有些什么.首先是硬件,各種款式的 FPGA 芯片,各種應(yīng)用的開(kāi)發(fā)板。根據(jù)各自己不同的玩法,選擇,拼接各種不同的產(chǎn)品系列。如果現(xiàn)成的不夠用了,完全可以自己做一塊。然后是工具。QuartusII,這是一個(gè)魔盒,它就好像 photoshop 一樣,可以把你原本看上去有點(diǎn)尷尬的照片,變成美輪美奐的藝術(shù)品。NiosII,嵌入式 CPU,是的,你沒(méi)聽(tīng)錯(cuò),就是 CPU,而且是你想放多少就可以放多少的 CPU。還不過(guò)癮?那看看 DSPbuilder 吧(這是我的至愛(ài))。幫你把 Simulink 模型算法變成最終硬件的工具。是的,你完全不需要寫(xiě)一行代碼。好了,不要摩拳擦掌了,開(kāi)始玩吧。
關(guān)于 QuartusII 的一些事情
QuartusII 其實(shí)就是一個(gè)轉(zhuǎn)換器。一個(gè)把你理解的邏輯語(yǔ)言轉(zhuǎn)換成為器件能理解的語(yǔ)言,然后可以讓 FPGA 按照你的想法去工作。我們寫(xiě)的那些 VHDL 啦,Verilog 啦什么的,其實(shí)都是人類自己定義的語(yǔ)言,對(duì)機(jī)器來(lái)說(shuō),就是對(duì)牛彈琴了,它沒(méi)可能知道人類這些傻瓜坐在那里想做什么。所以為了交流,我們需要讓他們理解我們的意圖,而你也不至于因此而去學(xué)牛說(shuō)話,所以,我們需要用 QuartusII,因?yàn)?QuartusII 就是幫助你進(jìn)行這種翻譯的工具。我們分兩部分來(lái)完成這么一件事情,首先把你的邏輯思路轉(zhuǎn)變成用已經(jīng)有的元件搭建出來(lái)的電路。好比你說(shuō)我要一個(gè)加法,器件沒(méi)你那么聰敏,他不知道什么叫做加法,加法對(duì)他來(lái)說(shuō)是沒(méi)有意義的。工具會(huì)把加法轉(zhuǎn)換成為一組邏輯,用與,或,與非,或非這些亂七八糟的連在一起,變成和加法結(jié)果一樣的電路。這樣器件一看就知道了,哦,對(duì)了,我有這些的。當(dāng)然這個(gè)時(shí)候你再去看那些東西,可能就蒙了。這個(gè)過(guò)程就是綜合。綜合結(jié)果是一個(gè)網(wǎng)表文件(netlist),也就是一堆很無(wú)聊的電路。而這種電路還只是停留在概念上,并沒(méi)有映射到實(shí)物上面。
然后工具會(huì)做第二件事情: fitting。QuartusII 把你選擇的器件找出來(lái),對(duì)照它擁有的資源來(lái)放剛才轉(zhuǎn)成的電路。FPGA 里面的資源都是現(xiàn)成已經(jīng)做好的,好處是你不需要做,壞處是,你也改不了。第一步首先是放置,就是把那些邏輯一個(gè)個(gè)放到器件的相應(yīng)位置上。最后,把所有的放置好的點(diǎn)連接起來(lái)。這樣,你的思想就在硬件上面完美的體現(xiàn)出來(lái)了。然后我們?cè)倩剡^(guò)來(lái)看看每個(gè)點(diǎn)都在做什么,把這些信息存成一個(gè)文件,以后你只需要每次告訴器件這個(gè)文件,就可以實(shí)現(xiàn)你的設(shè)計(jì)。
這一切都不需要你來(lái)做,工具都可以自動(dòng)完成,因?yàn)閷?duì)器件世界的理解,工具比你要熟悉的多,所以你可以相信,他一定比你做的好。但是這樣是不是太容易了呢?當(dāng)然不會(huì),否則就不好玩了,你需要知道工具去實(shí)現(xiàn),因?yàn)楹芏嗍虑槭枪ぞ卟粫缘玫模阈枰嬖V工具你的要求來(lái)實(shí)現(xiàn)你的設(shè)計(jì)。這就是約束。好像女孩子喜歡漂亮,當(dāng)然不會(huì)隨便穿戴,要點(diǎn)綴這里,束縛那里,讓自己看上去至少很美。打扮沒(méi)有約束,可能頂多就是難看點(diǎn)。但是翻譯過(guò)程沒(méi)有約束,就完全不是一個(gè)東西了。所以,約束很重要,后果很嚴(yán)重。你要告訴工具很多信息。比如:時(shí)鐘信息,工具不可能聰明到知道你從外面送進(jìn)來(lái)的時(shí)鐘是多少的。比如管腳信息,你要告訴他哪些輸入,哪些是輸出,而這些輸入輸出分別應(yīng)該是什么樣子的。這些是最基本的信息,還可以提出一些更苛刻的要求出來(lái)。比如說(shuō)功耗。QuartusII 在完成編譯以后會(huì)對(duì)編譯的結(jié)果進(jìn)行分析,看是不是能滿足你的要求。如果不滿足,它可以再試幾次。最后告訴你:帥哥,按照你的要求,我們完成了工作了,或者說(shuō),小子,你的要求是在太過(guò)分了,我做不了。那么可能你得調(diào)整一下設(shè)計(jì),代碼,約束條件,甚至器件。
到此為止,其實(shí) QuartusII 的工作已經(jīng)可以說(shuō)完成了。但如果只是這樣,你一定會(huì)很郁悶,
因?yàn)槟悴⒉恢滥愕脑O(shè)計(jì)是不是真的可以工作。或者說(shuō),你會(huì)想知道你的設(shè)計(jì)為什么不工作。
所以必須提供仿真和 debug 工具。QuartusII 提供一個(gè)相對(duì)比較簡(jiǎn)單的仿真工具,讓你可以通過(guò)畫(huà)波形圖的方式來(lái)做仿真。這種工具非常容易用,但是能力比較有限。他可以很直白的實(shí)現(xiàn)激勵(lì)和觀察輸出波形的平臺(tái),但是他無(wú)法實(shí)現(xiàn)很好的交互能力。好比你需要因?yàn)橐粋(gè)信號(hào)而發(fā)動(dòng)下一個(gè)動(dòng)作時(shí)?你恐怕很難猜得出來(lái)什么時(shí)候這個(gè)信號(hào)就來(lái)了吧。所以很多時(shí)候,我們會(huì)比較喜歡用第三方工具 ModelSim. 這個(gè)東西不好的地方就是你需要自己寫(xiě)仿真代碼。你會(huì)發(fā)現(xiàn)這是一件蠻痛苦的事情,很多時(shí)候仿真代碼比電路代碼本身還要復(fù)雜。但是,真的沒(méi)有辦法,我很同情你,因?yàn)橹挥心悴胖滥阆胱鍪裁矗瑳](méi)有人能代替你來(lái)寫(xiě)仿真。仿真畢竟只是仿真而已,不是真的,很多時(shí)候你會(huì)發(fā)現(xiàn)電路還是不能工作,雖然仿真看上去完全沒(méi)問(wèn)題。千萬(wàn)不要太自信的以為這一定就是工具的 bug,從而很興高采烈的報(bào)告說(shuō),我找到你們一個(gè) bug。絕大多數(shù)的情況下,要么是因?yàn)槟愕募s束有問(wèn)題,要么是因?yàn)槟愕姆抡婧驼鎸?shí)情況不符合。所以,QuartusII 不得不提供一種途徑,讓你看到,芯片里面到底發(fā)生了一些什么事情,那就是在片 debug 工具,signaltapII。我知道名字不太好聽(tīng),但是其實(shí)真的還蠻有用的。
QuartusII 就是這樣一個(gè)工具,很簡(jiǎn)單,但要玩得好,還是需要一點(diǎn)功夫的。后面我會(huì)比較細(xì)化的聊聊怎么玩這個(gè)東西。我不會(huì)很老土的說(shuō)怎么創(chuàng)建一個(gè)工具,然后按這里,按那里。這些要你自己去玩,去摸索,否則,完全沒(méi)有樂(lè)趣了。
門(mén)規(guī)
別擔(dān)心,這里不是黑幫。
我喜歡把寄存器比喻為門(mén)。所謂的電路就是由一堆這樣的門(mén)包圍著的。每個(gè)門(mén)都有一個(gè)相應(yīng)的時(shí)鐘來(lái)驅(qū)動(dòng),在相同間隔后,門(mén)將會(huì)打開(kāi)。一些信號(hào)從一個(gè)門(mén)出來(lái),經(jīng)過(guò)一系列的變化(組合邏輯)變成一個(gè)新的信號(hào),走到另一個(gè)門(mén)口,當(dāng)門(mén)打開(kāi)的時(shí)候,進(jìn)入。這就是 FPGA 里面發(fā)生的一切。或許速度會(huì)快一些,或許情況會(huì)復(fù)雜一些,但是大體就是這么回事而已。而我們要保證的就是所有的信號(hào)都可以高高興興來(lái),安安全全回去。不會(huì)遲到,也不會(huì)早退,更不會(huì)被門(mén)夾到,就萬(wàn)事大吉了。但是事情容易說(shuō)不容易做,所以需要注意一些細(xì)節(jié)方面的問(wèn)題。如果因?yàn)槟惆堰壿嫿o做錯(cuò)了,那我們就不提了。而有些事情,即使你感覺(jué)一切都做得足夠完美了,卻還是沒(méi)有結(jié)果。在這里提一些會(huì)有好處。
門(mén)規(guī)之組合電路篇
雖然我們要討論的是門(mén),但其實(shí)我們更關(guān)注的應(yīng)該是門(mén)與門(mén)之間發(fā)生的一切。因?yàn)殚T(mén)的作用只是把階段和另一個(gè)階段分割開(kāi)來(lái),而更多的事情,其實(shí)是在這個(gè)階段里面做的。門(mén)與門(mén)之間,或者門(mén)外面的,就都是這些組合電路了。組合電路最終影響了你的時(shí)鐘能夠飆到多快。
1. 進(jìn)來(lái)的時(shí)候,請(qǐng)隨手關(guān)門(mén)
這是一個(gè)再簡(jiǎn)單不過(guò)的規(guī)則。在進(jìn)來(lái)的時(shí)候,請(qǐng)關(guān)一下門(mén)。相信如果你呆在一個(gè)有一部分沒(méi)有被包圍在墻和門(mén)里面的房子里,一定很沒(méi)安全感。尤其是在門(mén)外面的東西吧,你會(huì)整夜整夜的睡不著覺(jué)。所以進(jìn)來(lái)的時(shí)候,最好可以隨手關(guān)門(mén),把自己包圍在一個(gè)安全的環(huán)境里面。所以信號(hào)也是這樣,信號(hào)是很敏感很沒(méi)安全感的東西。所以,進(jìn)來(lái)的時(shí)候最好被時(shí)鐘打一下。這在 FPGA 設(shè)計(jì)中是非常重要的,尤其是復(fù)位信號(hào)。外部信號(hào)的觸發(fā)事件是隨機(jī)的,連它自己都不曉得什么時(shí)候那個(gè) reset 鍵就被按了一下,加上進(jìn)來(lái)以后的線路會(huì)有一點(diǎn)延遲,恰好在時(shí)鐘觸發(fā)的時(shí)候,前面一個(gè)信號(hào)被觸發(fā)了,后一個(gè)信號(hào)恰好被門(mén)夾到。就好像指揮抬手的時(shí)候,鋼琴開(kāi)始彈奏了,小提琴手還在擺 pose。 這樣導(dǎo)致的結(jié)果就是大家不是同時(shí)開(kāi)始工作。
門(mén)分很多種,材質(zhì)不一樣(時(shí)鐘頻率),大小不一樣(時(shí)鐘相位),還有很多屬性不同(全局時(shí)鐘?)。所以為了進(jìn)入不同的區(qū)域,你必須關(guān)一下相應(yīng)的門(mén)。這其實(shí)很容易理解,你進(jìn)廚房,關(guān)廁所的門(mén),就有點(diǎn)奇怪了。還是以復(fù)位信號(hào)為例,對(duì)所有你需要用到復(fù)位信號(hào)的時(shí)鐘域,最好可以被相應(yīng)的時(shí)鐘打一下。提出這樣一點(diǎn),是因?yàn)樗?jīng)常被忽略,而且發(fā)生問(wèn)題的狀況可能變成隨機(jī)的。如果你的設(shè)計(jì)仿真沒(méi)有問(wèn)題,而在板子上發(fā)生一些隨機(jī)的事件,那么很有可能是你的異步信號(hào)造成的。
2. 在門(mén)與門(mén)之間請(qǐng)不要來(lái)回走動(dòng)
門(mén)(寄存器)與門(mén)之間是什么?是組合邏輯電路。信號(hào)的傳遞就是不斷的打開(kāi)一個(gè)門(mén),然后進(jìn)入另外一個(gè)門(mén),這樣一級(jí)一級(jí)的不斷傳遞,你才可以一直從起點(diǎn)走到終點(diǎn)。在有些時(shí)候也許你并沒(méi)有注意,你在到達(dá)另外一個(gè)門(mén)之前,你轉(zhuǎn)了一個(gè)圈又回來(lái)了。雖然這只是一個(gè)簡(jiǎn)單的圈,但是這個(gè)動(dòng)作會(huì)被無(wú)限循環(huán),因?yàn)檫@個(gè)動(dòng)作沒(méi)有被時(shí)鐘限制。所以導(dǎo)致的后果可想而知了。舉一個(gè)最簡(jiǎn)單的例子:
D = A + B + C;
Reg C = D + B;
A 和 B 都是輸入,而 C 是輸出,你會(huì)發(fā)現(xiàn)其實(shí)這個(gè) C 偷偷的回去轉(zhuǎn)了一圈,而結(jié)果是使自己又多做了幾次循環(huán)。而最終結(jié)果是多少要看這段邏輯自身的延遲和你的時(shí)鐘頻率,對(duì)不起,誰(shuí)都不可能預(yù)測(cè)結(jié)果。而且每次編譯的結(jié)果都會(huì)不同,因?yàn)榫幾g導(dǎo)致的電路延遲是隨機(jī)的。但是如果我們把 D 也用門(mén)關(guān)一下(寄存器),那么結(jié)果就會(huì)舒服了。
Reg D = A + B + C;
Reg C = D + B;
不妨在 QuartusII 里面嘗試這兩種電路。 工具會(huì)報(bào)告一個(gè) combinational loop 的警告給你。也可以嘗試做一些仿真體會(huì)一下。
3. 不要為了省錢(qián),用假門(mén) (Latch Vs Register)
讓我們把這個(gè)門(mén)再好好的研究一下,首先是定義。我這里說(shuō)的門(mén)更多是 flip-flop register. 作為現(xiàn)成的資源,它遍布于器件的四面八方。另外有一種叫 Latch 的東西,我把它叫做假門(mén)。
在普通數(shù)字電路中,人們會(huì)喜歡用到它。因?yàn)樗慕Y(jié)構(gòu)相對(duì)簡(jiǎn)單,所以資源上比較節(jié)約。所以我們需要說(shuō)說(shuō)這個(gè)假門(mén)的問(wèn)題。
那么首先需要了解一下什么是假門(mén),其實(shí)就是一個(gè)偷工減料的門(mén)。我們來(lái)看一個(gè)簡(jiǎn)單的圖:
0.png (7.2 KB, 下載次數(shù): 172)
下載附件
2018-8-16 16:29 上傳
這確實(shí)是一個(gè)再簡(jiǎn)單不過(guò)的邏輯了,比 flip-flop 的那個(gè)寄存器要簡(jiǎn)單許多。當(dāng) gate 為高的時(shí)候,Q 變成 D,否則,就保持 Q 的值。很顯然這是一個(gè)用電平來(lái)保存數(shù)據(jù)的一個(gè)邏輯,但是為什么我們不喜歡它呢?
1. 不穩(wěn)定,和 flip-flop 做一個(gè)比較,register 是在開(kāi)門(mén)的時(shí)候數(shù)據(jù)進(jìn)去的,然后這個(gè)門(mén)馬上就關(guān)掉了,所以數(shù)據(jù)只要在開(kāi)門(mén)的前后保持穩(wěn)定,那么從輸出看都是可以保持一致的。但是 Latch 的結(jié)構(gòu)中,當(dāng) Gate 為高的時(shí)候,Q 的數(shù)據(jù)會(huì)隨著 D 的變化而變化。所以他無(wú)法保持一個(gè)穩(wěn)定的狀態(tài)。
2. 它給工具制造了麻煩。因?yàn)殡娐肥怯赡阍O(shè)計(jì)的,工具并無(wú)法知道你的思路,所以他不會(huì)知道你想要的到底是什么時(shí)候的輸入。因?yàn)槟悻F(xiàn)在門(mén)是一直那么開(kāi)著的。在這過(guò)程中,狐貍也來(lái)過(guò)了,狼也來(lái)過(guò)了,老鼠也來(lái)過(guò)了,工具不知道究竟以什么為標(biāo)準(zhǔn)來(lái)判斷這個(gè)電路是不是能符合時(shí)序要求。這樣的話,或許你會(huì)很幸運(yùn)的在一顆片子上面完成任務(wù)。但是一旦換一顆,情況就變了。
3. 最后,作為一個(gè)精打細(xì)算的人,我們需要知道他是不是真的就省了那些傳說(shuō)中的資源了。大家不妨自己做一個(gè) Latch 出來(lái)(QuartusII 的 megacore 中是可以找到 LPM_LATCH 的)。
0.png (52.08 KB, 下載次數(shù): 139)
下載附件
2018-8-16 15:49 上傳
真是不劃算,你發(fā)現(xiàn)其實(shí)整個(gè)查找表都給用上了。而后面一個(gè)簡(jiǎn)簡(jiǎn)單單的 register 可憐巴巴的放在那里用不到。作為 FPGA 設(shè)計(jì)中比較獨(dú)特的一個(gè)原則就是,這個(gè)世界不是你創(chuàng)造的,所以你必須去適應(yīng)它,而不是頑固自己的意圖。換句話說(shuō):壞人也是人,不是說(shuō)你不能做,但都已經(jīng)告訴你壞人不好了,你干嘛還要去做呢?留一個(gè)問(wèn)題給大家去嘗試,或者玩一下。什么狀況下,或者說(shuō)怎么寫(xiě)代碼的時(shí)候,可以把Latch 寫(xiě)出來(lái)。4. 除了門(mén),其他的一切過(guò)程都只是暫時(shí)的在 FPGA 中,除了門(mén)與門(mén)之間的延遲是固定的(時(shí)鐘頻率)外,一切的組合電路的延遲都是不確定的。你不能依靠一次編譯的延遲結(jié)果來(lái)做你的設(shè)計(jì),雖然這樣看上去的效率會(huì)非常高。就好像接力跑一樣,可以一棒一棒的傳下去。但是電路是需要可以不斷重復(fù)的一個(gè)過(guò)充。相信每次接力跑交棒的時(shí)間點(diǎn)都是不同的吧,你再做一次編譯以后,你會(huì)發(fā)現(xiàn)整個(gè)世界都變了。所以在設(shè)計(jì)中,盡量避免使用這種手段。延遲鏈,經(jīng)常會(huì)使用這種手段,比如幾級(jí)非門(mén)來(lái)增加延遲。但是它也是具有不穩(wěn)定性的,所以在不到萬(wàn)不得已的狀況下,不要用它來(lái)增加認(rèn)為的延遲。延遲鏈在 ASIC 中另外一種用途是增加扇出。而這在 FPGA 設(shè)計(jì)中是畫(huà)蛇添足了。因?yàn)椴季資源中已經(jīng)加入了 buffer 了。記住這樣一個(gè)規(guī)律就好了,凡是沒(méi)有被門(mén)關(guān)過(guò)的信號(hào)都是不穩(wěn)定的,都只是暫時(shí)的。
門(mén)規(guī)之時(shí)鐘篇
門(mén)本身沒(méi)什么復(fù)雜的地方,但是門(mén)的種類一多,麻煩就來(lái)了。而好玩的地方也來(lái)了。所以我們對(duì)門(mén)(主要是時(shí)鐘)的選擇就會(huì)有很多講究。好像廚房應(yīng)該配什么門(mén),臥室配什么門(mén)?對(duì)于門(mén)的屬性把握也影響到你知道工具工作的準(zhǔn)確性。如果你給工具的信息本身就不是符合事實(shí)的話,那么結(jié)果一定是不堪的。所以,我們需要對(duì)門(mén),提醒一些門(mén)規(guī)。
1. 再生門(mén)很多時(shí)候我們不得不用一些邏輯的結(jié)果作為時(shí)鐘去驅(qū)動(dòng)一個(gè)門(mén),我們且管他叫作再生門(mén)吧,這種門(mén)所造成的問(wèn)題是最多不過(guò)的,因?yàn)橛幸恍┫忍觳蛔恪K晕覀儼蚜庵饕嗟姆旁谶@里。首先這些門(mén)的驅(qū)動(dòng)時(shí)鐘是由組合電路組成的,還記得之前的規(guī)則么?所有的組合電路都是不可信的。是的,往往有很多的毛刺啊,或者中間過(guò)程啊不可避免的出現(xiàn),這當(dāng)然不是我們想要的東西。所以,在生成新的再生門(mén)之前,你最好把這個(gè)時(shí)鐘信號(hào)用原來(lái)的那種門(mén)在關(guān)一下。這樣你獲得的會(huì)是一個(gè)干凈的,純粹的時(shí)鐘信號(hào)。
2. 門(mén)之相關(guān)再生門(mén)也可以分成兩種,一種是鎖相環(huán)所產(chǎn)生的時(shí)鐘驅(qū)動(dòng)的門(mén)。另一種是你用邏輯搭建出來(lái)的時(shí)鐘。就好像有的門(mén)是工廠制作的,有的門(mén)是你自己劈木頭造出來(lái)的,工廠造出來(lái)的驅(qū)動(dòng)門(mén)會(huì)比較準(zhǔn)確,效果比較好,可以省掉你很多麻煩,所以很多時(shí)候我們還是推薦用這種門(mén)。而且因?yàn)槭枪S制造,所以工廠對(duì)這種驅(qū)動(dòng)的屬性,狀態(tài)會(huì)非常清楚,所以在分析的時(shí)候,會(huì)自動(dòng)獲得很多信息,而不需要你來(lái)提供。但是有的時(shí)候,你或許不得不自己造一個(gè)門(mén)。那么這個(gè)時(shí)候你就需要比較細(xì)心的呵護(hù)一下。首先就是剛才說(shuō)的毛刺問(wèn)題,然后就是相關(guān)性問(wèn)題。你需要告訴工具你造的這個(gè)門(mén)和原始的那個(gè)門(mén)的關(guān)系。好比時(shí)鐘頻率,相位。工具是很蠢的,它沒(méi)可能了解高級(jí)生物的語(yǔ)言,所以你必須告訴它。所以再生門(mén)與原始門(mén)之相關(guān)性會(huì)非常重要 (derived clock )
3. 門(mén)鎖 (gated clock)門(mén)當(dāng)然應(yīng)該可以上鎖,就是可以把時(shí)鐘停掉,那么門(mén)就不會(huì)被打開(kāi)了。而最大的好處是什么?對(duì)了,就是省電。門(mén)不會(huì)一直開(kāi)來(lái)關(guān)去的,信號(hào)也不會(huì)頻繁的翻上墜下的。對(duì)芯片電力的貢獻(xiàn)可是相當(dāng)大了。但是同時(shí)也帶來(lái)很多問(wèn)題,主要是時(shí)鐘的不穩(wěn)定性增強(qiáng)了。最最簡(jiǎn)單的做法就是把門(mén)鎖信號(hào)和時(shí)鐘與一下。但是這樣的組合電路通過(guò)了查找表以后的驅(qū)動(dòng)能力降低了,導(dǎo)致了時(shí)鐘從這一點(diǎn)到另一點(diǎn)的傳輸延遲變長(zhǎng)了。另外你的門(mén)鎖信號(hào)上面可能本身帶有毛刺,那么可能反映到時(shí)鐘上,那結(jié)果就不得了了。你可能不小心就被門(mén)夾扁了。針對(duì)新的一些器件,器件本身可以提供一些時(shí)鐘控制模塊,當(dāng)你需要使用門(mén)鎖的時(shí)候,盡量的使用這些模塊,會(huì)讓你的時(shí)鐘變得安全(clock control block)。或許你會(huì)說(shuō),我并不是太在乎是不是省電,我只是希望這一塊地方不需要因?yàn)樾碌臄?shù)據(jù)而變化,等于是把功能停掉。那么這樣的話,你可以不需要去控制你的時(shí)鐘,而選擇控制你的數(shù)據(jù)。讓你的門(mén)鎖來(lái)選擇進(jìn)去的是你剛才已經(jīng)進(jìn)去的信號(hào),還是新的信號(hào)。想象一下,如果反復(fù)進(jìn)去的都是剛才的信號(hào),那么你的電路大部分情況下是不太會(huì)有變化的。這當(dāng)然不是絕對(duì)的。但是這可以作為一種方法來(lái)避免不安全感。
當(dāng)然總會(huì)有萬(wàn)不得已無(wú)奈的時(shí)候,好比老板腦袋被門(mén)夾到了。你不得不使用邏輯電路來(lái)鎖門(mén),而你的器件又沒(méi)有特定的模塊。那么最好的情況就是,你可以先用那個(gè)時(shí)鐘,把你的門(mén)鎖信號(hào)關(guān)一下。這樣的好處就是可以把毛刺信號(hào)完全的規(guī)避在門(mén)外面,使你的時(shí)鐘更加安全。
好了,好了,先就說(shuō)這些好了,再說(shuō)下去恐怕會(huì)因?yàn)殚T(mén)規(guī)太多,很多人要倒戈投降了。這些是比較容易被忽略的地方而已。如果還有什么補(bǔ)充,也可以一起交流一下。
你的 Q-zone,你做不了主
我的地盤(pán)我做主,這其實(shí)是一句鬼話。你很少真的有什么地盤(pán)你可以做主的,因?yàn)槟愫茈y作為規(guī)則制造者存在。你只有更好的依循規(guī)則,你才能更好的讓事情按照你的想法去做。所以為了做主你的地盤(pán),你最好依照一些規(guī)則,而不是按照自己的喜好來(lái)做,好比寫(xiě)代碼。
上電初始值
在通常的狀況下,所有的門(mén)在上電的時(shí)候輸出為低。但是這并不是不能改變的。你可以把上電設(shè)置為高,這樣綜合工具可能會(huì)做兩種事情,把輸出反向,或者使用 preset 控制(如果存在的話)把初始值放進(jìn)門(mén)里。
當(dāng)時(shí)上電為高的做法,并不是非常必要,因?yàn)槟闫鋵?shí)是可以使用復(fù)位信號(hào)來(lái)獲得你想要的初始狀態(tài)的。
如果你覺(jué)得這是必須的,那么有幾種方法你可以做:
z首先是在 QuartusII 里面你可以針對(duì)某個(gè)或者某些 門(mén)設(shè)置 power-up level 為高或低。
z在代碼中使用 altera_attribute
z直接寫(xiě)代碼設(shè)置初始值:
reg q = 1'b1;
always @ (posedge clk or posedge aclr)
begin
if (aclr)
q <= 1'b0;
else
q <= d;
end
門(mén)的次級(jí)管理信號(hào)
每個(gè)門(mén)都有一些次級(jí)的管理裝置,好比清除信號(hào)啊,時(shí)鐘使能信號(hào)啊。而這些裝置當(dāng)然都有他們自己的操作規(guī)律。如果你在寫(xiě)代碼的時(shí)候可能適當(dāng)?shù)氖褂盟鼈儯敲淳C合的時(shí)候很容易就可以使得王八看到綠豆,大家都對(duì)上了。其實(shí)實(shí)現(xiàn)一個(gè)功能是沒(méi)有問(wèn)題的,但是如果你把功能按照它的自然規(guī)律來(lái)實(shí)現(xiàn),從資源消耗還是很劃算的。當(dāng)然我知道大家現(xiàn)在都很有錢(qián),不太在乎這些的,但是省吃儉用似乎還是硬件設(shè)計(jì)師德傳統(tǒng)美德。你會(huì)發(fā)現(xiàn)年資越大的工程師在這方面越是注意,所以,如果你希望在別人眼里看上去比較牛的話,適當(dāng)?shù)氖褂眠@種手段,還是蠻炫的。
我們把這些信號(hào)按照優(yōu)先級(jí)排列一下(不知道什么是優(yōu)先級(jí)?找本字典先)
1. 異步清零信號(hào) – aclr
2. 上電復(fù)位信號(hào), - pre
3. 異步載入信號(hào) – aload
4. 使能信號(hào) – ena
5. 同步清零信號(hào) – sclr
6. 同步載入信號(hào) – sload
7. 數(shù)據(jù)輸入信號(hào) – data
我建議大家可以嘗試自己用這些信號(hào)來(lái)做一個(gè)門(mén)出來(lái)看看,嘗試怎么可以使用這些信號(hào)。然后使用 quartus 來(lái)編譯驗(yàn)證自己的結(jié)果。這是一種非常有趣的玩法。首先,它可以使你對(duì)器件的結(jié)構(gòu)更加了解,同時(shí)也鍛煉了你寫(xiě)代碼的能力。一旦兩相結(jié)合,就可以牛的亂七八糟的。
雙向信號(hào)
首先說(shuō)明一件基本知識(shí),在 FPGA 設(shè)計(jì)中,只有在輸入輸出上可以使用雙向信號(hào),雙向信號(hào)是不能使用在內(nèi)部邏輯上的。一定不要用這種信號(hào),否則工具會(huì)綜合出一個(gè)你都不知道會(huì)是什么東西的東西。
針對(duì)一個(gè)雙向端口,你需要把它變成一個(gè)輸入信號(hào) in,一個(gè)輸出信號(hào):out, 和一個(gè)輸出使能信號(hào): output_enable. 所以代碼其實(shí)很簡(jiǎn)單:
Assign birsignal = output_enable ? out: 1’bz;
Assign in = birsignal
這里有一個(gè)小小的提示,在寫(xiě)代碼的時(shí)候突然不太清楚語(yǔ)法怎么寫(xiě)的時(shí)候,你可以在 quartus里面按一下右鍵,你可以發(fā)現(xiàn)一個(gè) insert template…的選擇。試試看吧。
加法器
加法器的做法就比較有趣了,這會(huì)涉及到器件本身的結(jié)構(gòu)問(wèn)題。相比大家都看到了,F(xiàn)PGA的單元結(jié)構(gòu)是前面一個(gè)查找表結(jié)果,后面接一個(gè)門(mén)(寄存器)。我們當(dāng)然希望可能盡可能的使用這些結(jié)構(gòu)。
最好的狀況是什么?就是使用前面的那個(gè)查找表做一個(gè)加法,然后直接送到后面的那個(gè)門(mén)里面,然后傳到下一級(jí)做加法。這樣說(shuō)好像很沒(méi)意思,我們舉個(gè)例子來(lái)看看可以怎么玩:
比如我們要做這樣一個(gè)加法 res = A + B + C + D + E
我們首先需要知道一下加法是怎么做出來(lái)的,加法本身其實(shí)是很簡(jiǎn)單的邏輯,但是問(wèn)題是,你不是一個(gè)人在戰(zhàn)斗,你需要有進(jìn)位,你還需要送進(jìn)位出去。但是你真的等到進(jìn)位來(lái)了你才做計(jì)算,這樣一個(gè) 100 位的加法,你大概要等到天黑了。所以,其實(shí)在實(shí)現(xiàn)一個(gè)加法的時(shí)候,我們會(huì)同時(shí)做兩次,一次假設(shè)進(jìn)位為一,一次假設(shè)進(jìn)位為二。然后用前一級(jí)下來(lái)的進(jìn)位來(lái)進(jìn)行選擇。所以用這種方式我們就可以理解怎么進(jìn)一步在 FPGA 中實(shí)現(xiàn)加法了。
我們有兩種查找表類型首先是 4 輸入查找表 ( Stratix, Cyclone, 和其他那些老古董)。作為四輸入的查找表,就比較適合兩個(gè)數(shù)加,然后可以直接連到后面的門(mén)上去關(guān)一下。進(jìn)位是通過(guò)進(jìn)位鏈鏈接的。 所以這樣我們可以做成這樣的算法。
一號(hào)門(mén) = A + B 二號(hào)門(mén) = C + D.
三號(hào)門(mén) = 一號(hào)門(mén) + 二號(hào)門(mén)
四號(hào)門(mén) = 三號(hào)門(mén) + E
這樣通過(guò)一個(gè)三層門(mén)的結(jié)構(gòu)做一個(gè)五輸入的加法器,來(lái)達(dá)到最好的效果。
6 輸入查找表 (StratixII, CycloneII, 和其他那些比較新的器件)
在新的結(jié)構(gòu)中,我們可以使用 6 輸入的查找表,這樣,就可以用三個(gè)數(shù)加在一起 變成:
一號(hào)門(mén) = A + B + C
二號(hào)門(mén) = 一號(hào)門(mén) + D + E
這樣就變成一種兩重門(mén)的結(jié)構(gòu)。
說(shuō)這些,可以說(shuō)是一種提醒吧。我們?cè)趯?xiě)代碼的時(shí)候就可以考慮硬件的結(jié)構(gòu),用這種方法,讓你的實(shí)現(xiàn)可以變得更加專業(yè)起來(lái)。在 FPGA 中的硬件結(jié)構(gòu)都已經(jīng)是固定的,所以如果按照你的地盤(pán)的規(guī)律來(lái)寫(xiě),那一定更完美。大家不妨嘗試各種寫(xiě)代碼的方式來(lái)實(shí)現(xiàn)。
狀態(tài)機(jī)
狀態(tài)機(jī)是設(shè)計(jì)過(guò)程中的核心部分,所以我們需要特別的提一下寫(xiě)狀態(tài)機(jī)的一些注意事項(xiàng)。為了實(shí)現(xiàn)利益最大化,建議在 FPGA 中使用 one hot 模式的狀態(tài)機(jī),而在 CPLD 中使用最少比特?cái)?shù)的狀態(tài)機(jī)。在具體的設(shè)計(jì)中需要注意的是:
把狀態(tài)機(jī)寫(xiě)全,也就是說(shuō)不要漏寫(xiě)了 Default:。 沒(méi)有這個(gè)首先會(huì)出現(xiàn)什么?對(duì)了,會(huì)有假門(mén)(latch)。
狀態(tài)機(jī)作為控制核心部分,盡量把它和算法功能和數(shù)據(jù)分離開(kāi)來(lái)。好像你看到好的流水線,控制流水線的電腦和流水線本身是分開(kāi)的。這樣可以保持相對(duì)的獨(dú)立性。
如果一種操作設(shè)計(jì)到幾個(gè)狀態(tài),盡量把操作剝離狀態(tài)機(jī)本身。
使用一個(gè)簡(jiǎn)單的復(fù)位信號(hào)來(lái)定義上電狀態(tài)。如果你的狀態(tài)機(jī)會(huì)被比較多的復(fù)位信號(hào)復(fù)位的話,工具就不會(huì)把它當(dāng)作狀態(tài)機(jī)來(lái)對(duì)待。
總之,盡量的保持狀態(tài)機(jī)的很傻很單純是很重要的。盡量的不要加重核心部分的復(fù)雜性。其實(shí)道理很簡(jiǎn)單,好比在一個(gè)公司里面,真正在工作的,其實(shí)一定不是一個(gè)這個(gè)公司的核心。
小明和小強(qiáng)的故事
一直以來(lái)都在想寫(xiě)這么一個(gè)故事,這個(gè)故事的目的是為了說(shuō)明清楚關(guān)于 timing 的一些概念。所以如果你對(duì)時(shí)序已經(jīng)非常清楚的話,大可不必看下去以至于把自己反而搞糊涂了。有一天天氣很好,所以小明決定去小強(qiáng)家里。小明和小強(qiáng)家的門(mén)都是自動(dòng)門(mén),不是你想開(kāi),就可以開(kāi)了的,而是在一定的時(shí)間后打開(kāi),而這時(shí)間間隔是固定的。為了讓時(shí)間變得簡(jiǎn)單一點(diǎn),我們假設(shè)它是一個(gè)小時(shí)。于是,小明在自己家門(mén) 4:00 打開(kāi)的時(shí)候出去了。然后他就向小強(qiáng)家里走過(guò)去,小強(qiáng)家的門(mén)是 5:00 打開(kāi)的,小明在這之前到達(dá)小強(qiáng)家門(mén)口。這樣小明就順利到小強(qiáng)家里了。這個(gè)故事就講完了。讓我們重新把它推演一下,這個(gè)故事里面關(guān)鍵的是兩點(diǎn),一個(gè)就是小明到達(dá)小強(qiáng)家的時(shí)間,還有一個(gè)就是小強(qiáng)家的門(mén)的狀況。這兩個(gè)相對(duì)來(lái)說(shuō)是兩件獨(dú)立事件。我們首先看一個(gè)小明從家里到小強(qiáng)家門(mén)口這么一個(gè)過(guò)程。首先是開(kāi)門(mén)的時(shí)間點(diǎn)(Launch Edge),開(kāi)門(mén)需要一點(diǎn)時(shí)間,你不能在它剛開(kāi)的時(shí)候就出去吧(Tco)。最后就是從門(mén)口走到小強(qiáng)家門(mén)口的時(shí)間(Tdata),這個(gè)時(shí)間是不一定的,因?yàn)橛泻芏喾绞娇梢缘叫?qiáng)家里。我們會(huì)比較關(guān)心極端事件,就是最快的時(shí)間,和最慢的時(shí)間。這還沒(méi)結(jié)束呢,最容易忽略的,其實(shí)就是時(shí)間的問(wèn)題。好比小明以為他是四點(diǎn)點(diǎn)鐘出門(mén)的,但其實(shí)他家里的鐘其實(shí)晚了 10(Tclk1)分鐘的。如果我們以一個(gè)標(biāo)準(zhǔn)時(shí)間來(lái)判斷小強(qiáng)和小明家的鐘。而他們家里的鐘只有可能比標(biāo)準(zhǔn)時(shí)間要晚一些 ( 時(shí)鐘傳遞到門(mén)的延遲 )。差不多可以了,我們看到這么一個(gè)公式
到達(dá)時(shí)間 = Launch Edge + Tclk1 + Tco + Tdata
如果非要給這些值賦一個(gè)固定的值,那么我來(lái)具體看一下。這里面 Launch Edge, Tco 都是固定的,我們假設(shè)他們?yōu)?Launch Edge = 4:00, Tco = 5。如果我們說(shuō)小明花了半小時(shí)走過(guò)了中間的路,那么我們可以知道,當(dāng)小明到小強(qiáng)家里的時(shí)候應(yīng)該是 4:00 + 5 + 10 + 30 = 4:45。
好了,我們?cè)賮?lái)研究一下小強(qiáng)家的門(mén)。這個(gè)比較簡(jiǎn)單一點(diǎn),就是小強(qiáng)家時(shí)間不準(zhǔn)的時(shí)間,假如說(shuō)為 5(Tclk2)分鐘好了,再加上開(kāi)門(mén)時(shí)間點(diǎn) Latch edge。這其實(shí)說(shuō)明門(mén)是晚開(kāi)了 5 分鐘。所以小強(qiáng)家開(kāi)門(mén)的時(shí)間是:
開(kāi)門(mén)時(shí)間 = 時(shí)間點(diǎn) + Tclk2 + Latch Edge
這其實(shí)就是 5:05 了。我們一直在說(shuō)小明要在小強(qiáng)家門(mén)開(kāi)之前到,那么究竟多久之前到他就可以安全的進(jìn)去呢?這里面有一個(gè)建立時(shí)間(Tsu)好比要通過(guò)安檢啦什么的。把這個(gè)值設(shè)為 3 好了,所以其實(shí)小明應(yīng)該在 5:02 (5:05 – 3)到是安全的。這點(diǎn)條件小明是符合了的(4:46)。但是還有一個(gè)條件。小強(qiáng)看到小明會(huì)很開(kāi)心,所以他要和小明聊幾句才讓他進(jìn)去,我們管這個(gè)叫做保持時(shí)間,在這段時(shí)間里面小明不能走了,走了的話,也就進(jìn)不去門(mén)了。我們假設(shè)這個(gè)時(shí)間也是三分鐘的話。就是說(shuō),從 5:02 到 5:08 之間,小明應(yīng)該很安心,很穩(wěn)定的呆在小強(qiáng)家門(mén)口他才能進(jìn)去。小明進(jìn)步了小強(qiáng)家可能不是什么大不了的事情,不過(guò)如果你的設(shè)計(jì)時(shí)序不合格,就要打屁股了。所以我們來(lái)看看什么情況下,小明進(jìn)不了門(mén)。
首先我們倆安排幾個(gè)參數(shù)。
Fmax:什么是最理想的狀況,就是小明走最長(zhǎng)的路到達(dá)小強(qiáng)家門(mén)口的時(shí)候,恰好在小強(qiáng)家門(mén)口的建立時(shí)間點(diǎn)上。而我們把這中間的門(mén)開(kāi)的時(shí)間間隔的頻率稱為 Fmax.以這個(gè)為例:小明 4:46 分到了,如果小強(qiáng)家的門(mén)在 4:49 分開(kāi)就是最好的時(shí)間點(diǎn)了。而小強(qiáng)家的鐘的延遲有給了我們 5 分鐘的冗余。所以最短的時(shí)間應(yīng)該是 44 分鐘。這就是 Fmax。 這也就是你的電路能夠達(dá)到的最快的頻率了。而我們規(guī)定的時(shí)間間隔大于 44 分鐘就可以保證小明可以在建立時(shí)間點(diǎn)前到達(dá)。
我們給這個(gè)差異一個(gè)名字 setup slack。就是建立時(shí)間點(diǎn)減去小明的到達(dá)時(shí)間點(diǎn)。結(jié)果如果是正的,說(shuō)明小明可以順利到達(dá),如果是負(fù)的,就不行。
剛才我們說(shuō)過(guò)了,還有一個(gè)保持時(shí)間,我們來(lái)看看什么情況下保持時(shí)間會(huì)失敗。我們給小明在找一個(gè)弟弟,這個(gè)弟弟呢會(huì)在下一次門(mén)開(kāi)的時(shí)候出來(lái),也來(lái)小強(qiáng)家。弟弟來(lái)的時(shí)候,小明就必須要離開(kāi)了。如果我們把小強(qiáng)家的鐘再搞晚一點(diǎn),晚了 20 分鐘的話,那么開(kāi)門(mén)的時(shí)間就會(huì)晚到 5:25。而保持時(shí)間點(diǎn)是 5:28 分。弟弟從 5:00 + 10 + 1 +5 = 5:16 出發(fā),假設(shè)他走了一條近路,很快的就到了,比如只花了 10 分鐘,那么他在 5:26 分到了,小明就不得不走了。所以我們這里其實(shí)可以得到一個(gè)很有意思的結(jié)論,當(dāng)發(fā)生保持時(shí)間問(wèn)題的時(shí)候,往往是兩種可能。
1. 相互之間的時(shí)間誤差差距比較大
2. 中間的路徑非常的短。
所以我們往往需要分析電路的最快表現(xiàn)來(lái)分析保持時(shí)間。這里面也有一個(gè) hold time slack.就是小明弟弟到的時(shí)間點(diǎn)減去保持時(shí)間點(diǎn)。
這個(gè)故事差不多講完了,大家可能已經(jīng)暈了,其實(shí)我自己也差不多了。但是我們還要再接再厲。如果把兩個(gè)門(mén)開(kāi)關(guān)的時(shí)間間隔變得不同。做時(shí)序分析的時(shí)候,工具會(huì)找到所有狀況中最糟糕的那個(gè)狀況來(lái)分析。不用擔(dān)心聽(tīng)上去好像很復(fù)雜,這都是工具自己會(huì)做的事情。你知需要規(guī)定你想要的間隔時(shí)間,工具就會(huì)為了你的目標(biāo)而努力。 對(duì)這個(gè)故事的整個(gè)的了解讓我們對(duì)電路的具體過(guò)程有更深的理解。讓我們來(lái)看看我們可以做些什么來(lái)規(guī)避 Slack 出現(xiàn)負(fù)值的情況。
首先看看 setup slack:
1. 把時(shí)間間隔變大,也就是降低頻率(這是廢話)
2. 把路徑縮短,就是把最長(zhǎng)的那條路徑變短,使用各種優(yōu)化手段。
3. 有的時(shí)候,我們會(huì)發(fā)現(xiàn),其實(shí)小明根本不認(rèn)識(shí)小強(qiáng),所以我們完全沒(méi)必要管他是不是能進(jìn)小強(qiáng)家門(mén)。(false path)我們可以告訴工具,不要去管它。
4. 如果在 5:00 到不了,6:00 到也可以,有的時(shí)候我們可能并不在乎他什么時(shí)候到,只要能到就好。我們可以設(shè)置為 multi-cycle.我們告訴工具說(shuō),沒(méi)關(guān)系不用太著急的,下次開(kāi)門(mén)的時(shí)候再到也可以的。
再看看 hold time slack:
1. 把時(shí)間誤差變小。首先我們看看什么情況下可能導(dǎo)致小明家的鐘差 5 分鐘,而小強(qiáng)家卻差 20 分鐘。如果這個(gè)時(shí)鐘是一個(gè) gated clock,那么他的驅(qū)動(dòng)能力是有線的,所以時(shí)鐘傳遞的延遲會(huì)因此而變大。我們可以使用 PLL 來(lái)驅(qū)動(dòng)時(shí)鐘,這樣的話驅(qū)動(dòng)能力會(huì)加強(qiáng),時(shí)鐘傳遞的延遲因此而變短。
2. 把最短路徑變長(zhǎng),這可以通過(guò)添加 LCell 來(lái)人為制造延遲
辦公室的故事 ( Incremental Compilation)
我們總是在想,有沒(méi)有那么一種可能,讓我可以少花力氣多賺錢(qián),我們這里就開(kāi)始討論這樣一個(gè)問(wèn)題。
好比你現(xiàn)在有一個(gè)很大的公司,你有一個(gè)辦公室,里面空空的,你可以有很多方法把你的員工放在里面。當(dāng)然你可以一股腦兒的把所有人全部很隨意的放在里面。但是導(dǎo)致的結(jié)果會(huì)是什么樣的呢?你會(huì)發(fā)現(xiàn)兩個(gè)工作關(guān)系很精密的人,每天需要從這頭走到那頭的交流。這樣的工作效率不可能好的。所以我們會(huì)比較希望把他們整合在一起。至少可以讓一個(gè)部門(mén)坐在一起。然后我們?cè)僭谶@個(gè)相對(duì)比較小的區(qū)域里面做調(diào)整來(lái)提高工作效率,這樣會(huì)容易很多了。每個(gè)部門(mén)當(dāng)然就是公司的一部分(design patition),我們需要把這個(gè)部門(mén)的人都放在一個(gè)限定的空間里面,而給每個(gè)部門(mén)提供的空間,我們定義為 Logic Lock. 空間是一個(gè)物理的概念,而部門(mén)是一個(gè)人為理念造成的一個(gè)概念。我們并不是一定要把他們倆結(jié)合起來(lái)。但是,如果結(jié)合起來(lái)會(huì)有這樣一個(gè)好處。
好比,我有五個(gè)部門(mén) A,B,C,D,E。而不給他們限制空間,他們可能隨意的去做。也許相對(duì)來(lái)說(shuō)部門(mén)內(nèi)的人士坐在一起了,但是這中間留下的空間變得很沒(méi)規(guī)律。兩種情況下會(huì)有問(wèn)題,一個(gè)是,需要加一個(gè)新的部門(mén),那么這個(gè)部門(mén)就需要拆開(kāi)放,另外就是某些部門(mén)擴(kuò)張了,新人就沒(méi)地方放了。所以,宏觀調(diào)控是非常重要的。所以我們需要把設(shè)計(jì)理念的分割和物理空間的分割緊密的結(jié)合在一起。
增量編譯的思想和這個(gè)故事是完全一致的。我們需要把設(shè)計(jì)分成一些相對(duì)比較大的部分,然后給他們安排相應(yīng)的位置去放置。這樣有非常多的好處:
1. 關(guān)系相對(duì)精密的電路的位置比較接近,減少了連接線上的延遲。
2. 對(duì)一些已經(jīng)表現(xiàn)很好的模塊可以保留他們的編譯結(jié)果。這樣可以獲得最大的好處。每一次編譯都獲得一個(gè)比較好的結(jié)果加以保留,這樣整個(gè)設(shè)計(jì)就一點(diǎn)點(diǎn)按照增量的方式獲得了最好的那個(gè)結(jié)果。
3. 由于一些模塊已經(jīng)保留了,所以工具不會(huì)在那些模塊上面耗費(fèi)時(shí)間,所以編譯時(shí)間大大縮短。
我們來(lái)看看有這種思想可以實(shí)現(xiàn)的兩種編譯過(guò)程:
自上而下:我是公司的總經(jīng)理,我們?nèi)フ辛艘欢讶耍缓蟀阉鼈兎旁诟鱾(gè)部門(mén)里面。根據(jù)每個(gè)部門(mén)人數(shù)的多少,給他們劃分相應(yīng)的資源。
自下而上:我是公司的總經(jīng)理,我手下有一些部門(mén)的負(fù)責(zé)人,我讓這些人去招人。我給他們一些人數(shù)的預(yù)算,然后給他們提供空間。那些部門(mén)經(jīng)理自己去招人來(lái)填充自己的一畝三分地。最后把這個(gè)辦公室填滿。
和其他所有工具一樣,我們需要有一些行為準(zhǔn)則來(lái)獲得最好的效果:
1. 盡量把工作關(guān)系精密的人放在同一個(gè)部門(mén)里面。部門(mén)和部門(mén)之間是不能進(jìn)行優(yōu)化的。好比兩個(gè)人需要每小時(shí)都交流工作,但是你把他們放在兩個(gè)部門(mén),即使是相互隔壁的部門(mén),也不能保證他們正好墻對(duì)墻的做。工具只對(duì)部門(mén)內(nèi)部進(jìn)行調(diào)整優(yōu)化,出了部門(mén),他們就死人不管了。
2. 關(guān)門(mén)原則。在部門(mén)和部門(mén)之間都按上門(mén)。就是說(shuō)對(duì)輸出和輸入的數(shù)據(jù)都用 register 打一下。這其實(shí)是和第一條是相關(guān)的。因?yàn)椴块T(mén)之間不進(jìn)行任何優(yōu)化,為怕避免麻煩,建議大家都按上門(mén)來(lái)提高效率
3. 部門(mén)和部門(mén)之間盡量少串門(mén)。盡可能的減少互動(dòng)。這個(gè)其實(shí)是可以在設(shè)計(jì)的過(guò)程中進(jìn)行調(diào)整挑選的。
4. 保證一個(gè)部門(mén)的人數(shù),不是太少(大于 2,000LE)。這很好理解,就那么幾個(gè)人,還優(yōu)化什么呀。
5. 不要放不用的接口。沒(méi)有結(jié)果的連接在編譯中是會(huì)被優(yōu)化掉的。但是在增量編譯中,卻會(huì)被保留。所以如果已經(jīng)知道一個(gè)接口是沒(méi)有用的,不如把它干掉算了。
6. 大家知道,F(xiàn)PGA 內(nèi)部是沒(méi)有雙向信號(hào)的,所以一定避免雙向信號(hào)。除非你這個(gè)型號(hào)是要直接連到芯片管腳上的。
7. 避免同一個(gè)信號(hào)重復(fù)輸出。
8. 不要把直接從輸入到輸出的信號(hào)放到部門(mén)內(nèi)部。這是一種資源浪費(fèi)
9. 公司有一些資源,好比打印機(jī)啊,傳真機(jī)啊之類的,在分配辦公區(qū)域的時(shí)候,盡量考慮資源的合理使用。由于資源位置是固定的,所以當(dāng)你把區(qū)域分配給部門(mén)的時(shí)候,其實(shí)也把資源分配給他們使用了。而如果他們用不上,也就浪費(fèi)了。
10. 多給部門(mén)與部門(mén)之間的交流留一些時(shí)間預(yù)算。這么看起來(lái),如果你學(xué)會(huì)了增量編譯,好像順便把 HR 也個(gè)學(xué)了。
(本節(jié)的思維導(dǎo)圖請(qǐng)下載附件)
8. 優(yōu)化那些事兒
優(yōu)化是一個(gè)很麻煩的問(wèn)題,因?yàn)檫@個(gè)話題非常的雜,細(xì)碎。好像我們介紹一個(gè)人,你會(huì)一下子不知道從什么方面說(shuō)比較好,因?yàn)樗麜?huì)同時(shí)擁有不同的身份,存在于社會(huì)當(dāng)中。所以,我盡量的完成了這么一張圖表,讓大家對(duì)優(yōu)化這個(gè)懸浮于平衡中間的一個(gè)游戲方法有一定的了解。平衡,其實(shí)是優(yōu)化中的一個(gè)最關(guān)鍵的詞。當(dāng)然針對(duì)不同的應(yīng)用,我們會(huì)有完全不同的需求,平衡點(diǎn)也會(huì)有算偏向。但是畢竟不能矯枉過(guò)正,太過(guò)苛求,否則只能是過(guò)猶不及了。這么說(shuō),似乎很沒(méi)意思,讓我們來(lái)說(shuō)三個(gè)考量,時(shí)序,資源,功耗。這就是優(yōu)化中的三個(gè)平衡極限。在有的設(shè)計(jì)中,算法對(duì)時(shí)序有要求,所以會(huì)要求設(shè)計(jì)能跑在一定的時(shí)鐘頻率上,這就需要對(duì)時(shí)序進(jìn)行優(yōu)化。有的公司在設(shè)計(jì)的后期開(kāi)始考慮成本的問(wèn)題,會(huì)希望選擇盡量小的器件,那么這個(gè)時(shí)候,資源消耗變成了重點(diǎn)。而在手提式器件的設(shè)計(jì)中,功耗是至關(guān)重要的。而這三點(diǎn),是沒(méi)可能同時(shí)做到的。為了達(dá)到某種目的,你必須要付出其他的代價(jià)。所以,在做優(yōu)化之前,做好一個(gè)優(yōu)化目標(biāo)是很有必要的。當(dāng)然最基本的是時(shí)序,和資源。在這里我們比較重點(diǎn)的討論這兩方面的話題。 大家一定看到了前面這種讓你暈得亂七八糟的圖,我的任務(wù),就是把他們解釋一下。
(本節(jié)的思維導(dǎo)圖請(qǐng)下載附件)
優(yōu)化之前
在提優(yōu)化之前,我們當(dāng)然需要有一個(gè)提供優(yōu)化的基本形態(tài),就是你的設(shè)計(jì)。如果你的設(shè)計(jì)還沒(méi)怎么完成,大可不必就著急的開(kāi)始優(yōu)化。因?yàn)槊看尉幾g都會(huì)把你的優(yōu)化努力隨機(jī)掉。而最好的優(yōu)化方法,其實(shí)就是可以不優(yōu)化。那就是把代碼寫(xiě)的很優(yōu)化,退而求其次,就是把代碼寫(xiě)的容易優(yōu)化。這里又要提老掉牙的事情了,代碼要寫(xiě)得有層次化,好處就不羅嗦了。那么在寫(xiě)代碼的時(shí)候需要考慮什么問(wèn)題呢?首先是你使用的目標(biāo)器件的資源狀況。通過(guò)一些小實(shí)驗(yàn),你可以知道,你寫(xiě)出來(lái)的代碼,大概會(huì)實(shí)現(xiàn)成什么樣。這對(duì)你寫(xiě)代碼有一種感官上的映射非常有幫助。然后就是一些特殊零件的數(shù)目和位置,比如存儲(chǔ)器(memory),計(jì)算器(DSP block),特殊的管腳資源(LVDS)。其實(shí)是把模塊按照功能分割開(kāi)來(lái)。從頂層電路看起來(lái),真?zhèn)設(shè)計(jì)就是一些功能模塊的組合,看上去和規(guī)劃的功能圖一模一樣。這樣做的好處,自然是不言而喻的。也比較符合常規(guī)的美學(xué)思想。然后是狀態(tài)機(jī)的問(wèn)題,盡量不要寫(xiě)出太大的狀態(tài)機(jī),寧愿用一些小型的狀態(tài)機(jī)來(lái)相互關(guān)聯(lián)。(除非你希望不被老板替換掉而寫(xiě)出很炫的,不過(guò)那樣你自己以后也會(huì)很麻煩,因?yàn)槟愕挠浶圆⒉幌衲阆胂裰心敲纯煽浚┕ぞ邥?huì)耗盡心機(jī)去實(shí)現(xiàn)你一個(gè)很宏偉的狀態(tài)機(jī),結(jié)果可能還不能讓人足夠滿意。Glue logic. 就是兩個(gè)模塊之間的黏合邏輯。這或許是很難避免的。但他們往往會(huì)成為優(yōu)化的一個(gè)盲點(diǎn)。這種三不管地區(qū),最容易導(dǎo)致臟亂差等社會(huì)問(wèn)題。所以,盡量把它們放進(jìn)某個(gè)模塊的勢(shì)力范圍。在知道了寫(xiě)代碼的大概規(guī)則以后,我們來(lái)看看約束。約束本身并不是優(yōu)化,而是給優(yōu)化制定的一個(gè)目標(biāo)。你需要工具達(dá)到什么樣的目標(biāo),你當(dāng)然盡可能的要告訴工具,否則讓他這么放任自流下去,后果會(huì)很嚴(yán)重。所以最簡(jiǎn)單的,你必須要提供所有的時(shí)序信息。好比,所有的時(shí)鐘頻率,所有的管腳時(shí)序要求。這樣 fitter 才會(huì)有一個(gè)著眼點(diǎn),針對(duì)距離目標(biāo)最遠(yuǎn)的路徑去努力。時(shí)序報(bào)告也才有可能報(bào)告哪些路徑是沒(méi)有通過(guò)要求的。我還是推薦大家使用timequest 來(lái)做時(shí)序約束,好處是,它可能對(duì)你的時(shí)序約束和你的設(shè)計(jì)對(duì)照做分析,在做時(shí)序分析之前,先對(duì)你的約束做分析,然后告訴你,你有多少該做的事情而沒(méi)有做的(為被約束的路徑)還有多少你要求做的,而沒(méi)有被做的(被忽略的時(shí)序要求)。這里提出一個(gè)話題,false path,有人叫假路,有人叫錯(cuò)路,都是英語(yǔ)惹得禍,我們還是叫它flase path。具體來(lái)說(shuō),就是不該存在的路,或者說(shuō),即使存在,也沒(méi)人去走的路。那么對(duì)這種路,我們是可以讓工具看都不用看的。關(guān)于 false path,其實(shí)倒不用太過(guò)著急。大可以在發(fā)生問(wèn)題以后,再去看是不是。否則讓你把每條 false path 挑出來(lái),其實(shí)也是個(gè)蠻無(wú)聊的事情。對(duì)時(shí)鐘的約束,要重點(diǎn)關(guān)注兩個(gè)現(xiàn)象。首先是盡量少的在時(shí)鐘路徑上引入邏輯。這樣認(rèn)為的造成了時(shí)鐘和時(shí)鐘之間的 skew。我們都知道這不是什么好事情。另外就是一種上下沿都需要用來(lái)采集數(shù)據(jù)的時(shí)鐘。對(duì)于時(shí)鐘的約束有很多的地方需要注意,否則你的電路都不知道會(huì)飛到哪里去。不過(guò)這東西需要一些體驗(yàn),靠嘴巴說(shuō)是說(shuō)不出感覺(jué)的。現(xiàn)在來(lái)說(shuō)約束中最重要的一個(gè)關(guān)鍵,不要過(guò)約束。過(guò)約束的壞處一大堆,增加編譯時(shí)間(你可能不太在乎),資源使用過(guò)度(可能也還可以忍受),導(dǎo)致其他的時(shí)序問(wèn)題(那可是個(gè)大麻煩了)如果你對(duì)自己的約束有些不太放心,又或者說(shuō)可能器件和器件之間會(huì)有很細(xì)微的差別,你可以給約束做一些余量,但是過(guò)約束是萬(wàn)萬(wàn)要不得的。
時(shí)序優(yōu)化:
寫(xiě)了半天,終于開(kāi)始寫(xiě)優(yōu)化了,首先我們看看這個(gè)時(shí)序優(yōu)化的問(wèn)題。還是先看幾個(gè)關(guān)鍵詞吧。
優(yōu)化目標(biāo):一個(gè)是全局的設(shè)置,告訴工具你這個(gè)設(shè)計(jì)的優(yōu)化偏向。當(dāng)時(shí)序優(yōu)化偏重要的時(shí)候,可以設(shè)置為 Speed。當(dāng)然這使以犧牲 area, power 為代價(jià)的。也可以對(duì)某個(gè)獨(dú)立模塊做局部設(shè)置,就是說(shuō)在這個(gè)模塊中,優(yōu)化目標(biāo)是時(shí)序。
網(wǎng)表再綜合( netlist re-synthesis): QuarutsII 支持一些第三方的綜合工具(說(shuō)實(shí)話,Quaruts 自己的綜合工具,也還是可以的)。他們把代碼變成可以映射到 FPGA 上的網(wǎng)表文件,就是由一堆查找表和寄存器組成的東西。再綜合會(huì)把這些網(wǎng)表還原成為與非門(mén)結(jié)構(gòu)的電路,然后再根據(jù) quartus 綜合工具的算法再做綜合。這當(dāng)然未必是一件好事,可能會(huì)因此而破壞了原來(lái)工具中一些好的算法做出來(lái)的邏輯而導(dǎo)致結(jié)果更差。
物理綜合:這是時(shí)序工具中效果最明顯的工具。它對(duì) fitter 以后的結(jié)果,在關(guān)鍵路徑上,對(duì)電路進(jìn)行調(diào)整。既然布局布線都做好了,還有什么可以做的呢?有很多。首先是組合電路。組合電路,無(wú)非就是一堆查找表的連接。而布局布線本身是一個(gè)比較隨機(jī)的過(guò)程。在完成以后,我們會(huì)發(fā)現(xiàn)一些路徑是比較差的,那么我們可以對(duì)這些路徑做一些調(diào)整,他們選擇更短的一條路徑,同時(shí)功能保持不變。對(duì)異步控制信號(hào)做一級(jí)同步流水線。這樣可以規(guī)避一些recovery 和 removal 的時(shí)序問(wèn)題。還有一個(gè)功能是復(fù)制寄存器,比如說(shuō)一個(gè)寄存器的 fanout比較多,或者說(shuō),其中的一條線會(huì)連到比較遠(yuǎn)的地方。那么我們可以在那個(gè)比較遠(yuǎn)的地方復(fù)制一個(gè)和這個(gè)寄存器完全一樣的寄存器,這樣可以大大提高時(shí)序效果。當(dāng)然這需要犧牲一個(gè)寄存器了。還有一個(gè)好玩的事情,是寄存器的 re-timing,如果我們把寄存器看成流水線中的一層的話,它其實(shí)就是位于一條路徑中的某個(gè)點(diǎn)而已。他的前后兩個(gè)組合電路的延遲可能是不同的。而可能恰巧那個(gè)長(zhǎng)的變成了一個(gè)關(guān)鍵路徑(就是大大的壞的一條),那么我們是不是可以移動(dòng)一下這個(gè)寄存器的位置,讓大家的時(shí)間可以平衡一下,而結(jié)果是時(shí)序上去了。但是在功能上會(huì)有一點(diǎn)小小的變化,所以這個(gè)選項(xiàng)還是慎用。
可能造成的幾種時(shí)序問(wèn)題:時(shí)鐘路徑導(dǎo)致問(wèn)題,這個(gè)時(shí)鐘可能是個(gè) gated clock,或者非全局時(shí)鐘。這個(gè)調(diào)整的余地相對(duì)比較小。
數(shù)據(jù)路徑導(dǎo)致問(wèn)題,這個(gè)比較復(fù)雜,首先可能是 Fan-out 太大導(dǎo)致的延遲過(guò)大。也有可能是邏輯門(mén)的層數(shù)過(guò)多導(dǎo)致。或者布局布線的隨機(jī)隨得不好,兩個(gè)點(diǎn)的距離很大。還有就是一些物理限制,比如 DSP block 之間的相對(duì)位置。
用來(lái)觀察時(shí)序問(wèn)題的工具:
Technology map viewer: 這東西,實(shí)在是沒(méi)辦法用中文說(shuō)了,我私自反了,恐怕你會(huì)恨死我,因?yàn)樵?Quartus 里面死活找不到了。它是可以用來(lái)觀察你的綜合結(jié)果以后的電路實(shí)現(xiàn)的。所以用它,你可以看到你的電路經(jīng)過(guò)了多少層次的路徑。
Chip planner: 這是用來(lái)看你的電路具體在芯片上的實(shí)現(xiàn)的,通過(guò)它你可以觀察到相對(duì)之間的位置的距離,和連線上的延遲。
TimeQuest: 這是時(shí)序分析的最佳工具,無(wú)論是觀察時(shí)鐘或者路徑延遲,fanout, 或者邏輯層次,都可以使用它。雖然不一定比其他的工具更直觀,但是它是最全面的。
針對(duì)一些經(jīng)典的可能性,表格里面列出了一些,大家可以自己看一下。
0.jpg (29.67 KB, 下載次數(shù): 164)
下載附件
2018-8-16 16:36 上傳
資源優(yōu)化
和時(shí)序優(yōu)化相對(duì)的,我們可以給 Quartus 一個(gè)優(yōu)化指導(dǎo)方向,當(dāng)你把它設(shè)置為 area 的時(shí)候,工具會(huì)盡量考慮資源的使用。可以做全局設(shè)置,也可以做局部設(shè)置。
Register packing: 這是一個(gè)針對(duì) LE 資源優(yōu)化的工具,在新的 Quartus 中一共有七級(jí)設(shè)置。比如把兩個(gè)互不相干的電路擠到同一個(gè) LE 中。根據(jù)等級(jí)設(shè)置的不同,會(huì)有不同的資源消耗結(jié)果,當(dāng)然付出的代價(jià)就是時(shí)序的降低。
當(dāng)然對(duì)特定模塊的使用,是需要一個(gè)整體規(guī)劃的。什么樣的狀況下去使用存儲(chǔ)器資源,什么樣的狀況下使用 DSP-block,都需要有一定的評(píng)估。更多的時(shí)候,其實(shí)在寫(xiě)代碼的時(shí)候就已經(jīng)做好了計(jì)劃。
幫手:相信大家已經(jīng)有點(diǎn)暈了,幸運(yùn)的時(shí)候,我們不是一個(gè)人在戰(zhàn)斗。我們還是有很多幫手的。讓我們來(lái)看看這些家伙:
Design assistant: 這是一個(gè)會(huì)提供給你一些提示的助手工具。他會(huì)顯示出設(shè)計(jì)中會(huì)導(dǎo)致編譯結(jié)果的地方。你可以自己定制一些設(shè)計(jì)規(guī)則,他會(huì)幫助你去監(jiān)督你自己,尤其在一個(gè)團(tuán)隊(duì)設(shè)計(jì)中,對(duì)大家設(shè)計(jì)的同一性有比較好的效果。
Optimization advisor: 優(yōu)化指導(dǎo),會(huì)提出一些相關(guān)的優(yōu)化選項(xiàng)的指導(dǎo)。當(dāng)然這種指導(dǎo)是非常通用的,不可能非常針對(duì)你自己的應(yīng)用,所以在是否使用這些建議的時(shí)候,還是要自己權(quán)衡一下。所以簡(jiǎn)單的了解一些優(yōu)化選項(xiàng),還是有必要的。否則,莫名其妙的就被工具耍了。
Early timing estimate: 這個(gè)工具會(huì)做一些最基本的布局布線,這樣它可以很快的得到一些時(shí)序方面的信息,這在你做時(shí)序約束,和logic lock設(shè)置的時(shí)候有很多的指導(dǎo)意義,同時(shí)也節(jié)省了一些時(shí)間。
Seeds: 誰(shuí)都靠不上,我們靠老天。布局布線基本上是一個(gè)隨機(jī)的事情,沒(méi)有人能夠了解結(jié)果能使什么樣子的。而seeds就好像一個(gè)賭博用的骰子一樣,告訴編譯從什么狀況開(kāi)始布局。沒(méi)有人知道seeds 中的具體某個(gè)數(shù)字代表什么樣的狀況,所以就是不斷的碰運(yùn)氣吧。給大家一個(gè)迷信,似乎17這個(gè)數(shù)字特別好,結(jié)果會(huì)比較理想一些。
Design Space Explorer: 這個(gè)是一個(gè)實(shí)在沒(méi)辦法的辦法,但凡還有一線生路,最好不要用這個(gè)東西。他會(huì)自動(dòng)的對(duì)你的設(shè)計(jì)根據(jù)一些設(shè)置,不斷的嘗試布局布線。比如使用不同的優(yōu)化方法,不同的算法,甚至不同的種子來(lái)做編譯,最后給你一個(gè)最符合約束要求的編譯結(jié)果。但是這樣的工作量有多大,大家可想而知了。如果你有比較多的時(shí)間,你可以試試把它扔在那里跑個(gè)幾天。
Handbook: 啥也不用說(shuō)了。
我想用一種比較有效的方式來(lái)描述關(guān)于系統(tǒng)設(shè)計(jì)的一些事情。設(shè)計(jì)是沒(méi)有一個(gè)固定規(guī)則的過(guò)程,否則也就沒(méi)有樂(lè)趣可言了。雖然有很多標(biāo)準(zhǔn),有很多限制,但是依然有非常多的變化空間。其實(shí)最重要的事情,是知道什么是重要的,什么是次要的。精力應(yīng)該集中在重要的東西上面,而不是一些細(xì)節(jié)。做系統(tǒng)設(shè)計(jì)需要有一種大的氣魄,一些不拘小節(jié)的氣質(zhì),當(dāng)然,還需要?jiǎng)e出心裁的創(chuàng)意。FPGA 本身提供了一個(gè)非常靈活的平臺(tái),如何最大化的利用這個(gè)平臺(tái),是我們脫離呆板的嵌入式系統(tǒng)的一個(gè)重要關(guān)鍵,也是如何玩轉(zhuǎn)系統(tǒng)的關(guān)鍵。
不求甚解之 NiosII
所有的系統(tǒng)都是由模塊組成的,或大或小的模塊,拼接成一個(gè)大積木。所以我們首先需要了解這些模塊 (IP)。關(guān)于怎么去了解一個(gè) IP,其實(shí)是很重要的問(wèn)題。NiosII CPU 作為一個(gè)比較大型的模塊,可以作為一個(gè)例子來(lái)講。一個(gè)關(guān)鍵詞是不求甚解。不求甚解的目的,并不是偷懶,而是更準(zhǔn)確,更有針對(duì)性,更快捷。IP 的作用就是為了完成一個(gè)特定的功能,所以我們并不需要知道它是如何實(shí)現(xiàn)的,事實(shí)上,由于很多的 IP 都是加密的代碼,所以也不可能知道具體的電路狀態(tài)。同時(shí)也不需要花很多的時(shí)間把文檔里面的每一行都了解清楚。作為工程師,大家的脾氣一般都是一種超強(qiáng)的好奇心和鉆研精神的集合。而往往會(huì)鉆進(jìn)牛角尖里面。而作為系統(tǒng)設(shè)計(jì),是需要有一種粗曠型的大氣魄,不需要在細(xì)節(jié)上浪費(fèi)時(shí)間。你會(huì)發(fā)現(xiàn)很多的細(xì)節(jié)是沒(méi)有意義的。并不是說(shuō)我們不需要去研究細(xì)節(jié),細(xì)節(jié)是很重要的,但是細(xì)節(jié)需要在被用到的時(shí)候才去關(guān)注就好了。
作為一個(gè) IP,最重要的,其實(shí)是接口。因?yàn)槟阕钪匾氖切枰朗窃趺醋屗ぷ髌饋?lái),而不是它怎么工作的。所以在看文檔的時(shí)候,最主要看的就是接口信號(hào),對(duì)所有的信號(hào)的作用有一個(gè)了解。NiosII 使用的是 Avalon MM 點(diǎn)對(duì)點(diǎn)接口,這其實(shí)是一個(gè)非常有趣的接口,因?yàn)樗慕涣鞲佣唐娇煲恍Kc普通的 PCI 接口不同的地方是,他可以支持同時(shí)多線控制。因?yàn)樗鼪](méi)有總線的概念,不會(huì)在總線被占據(jù)的時(shí)候,其他任何通訊都無(wú)法進(jìn)行。NiosII是在 SOPC builder 中被直接使用的,我們不需要知道具體有哪些信號(hào),因?yàn)闆](méi)有非常需要,我們是看不到這些接口的。在 NiosII 中,我們有兩個(gè) Master Avalon MM 接口,一個(gè)是Instruction Master Port, 這是 CPU 用來(lái)讀取指令的接口。CPU 通過(guò)這個(gè)端口從 Memory 上讀取指令。另一個(gè)是 Data master port, 很簡(jiǎn)單,這是用來(lái)連接數(shù)據(jù)通道的。比如說(shuō)你要讀取的數(shù)據(jù),你要存儲(chǔ)的數(shù)據(jù),都是走這個(gè)通道。這兩個(gè)端口可以連接同一個(gè)內(nèi)存,在這種時(shí)候需要特別小心,很有可能自己把自己的指令給改掉了。但是反過(guò)來(lái)思考一下,其實(shí)我們可以做什么?可以按照狀況改變軟件代碼。NiosII 中還有第三個(gè)端口,這是用來(lái)做 Debug 用的端口。還有其他的一些接口,比如 TCM 接口。我們需要知道這些接口的存在,但是不需要知道細(xì)節(jié),只有在用到的時(shí)候再去看相關(guān)的文檔就好了。
第二個(gè)需要關(guān)注的問(wèn)題就是參數(shù)設(shè)置。這里面是有講究的。IP 是廠家做出來(lái)的通用模塊,不是為你而特制的,所以必然有一些是你不需要的方面。我們可以通過(guò)參數(shù)的修改,讓它盡量的接近我們的需求。有很多人在做設(shè)計(jì)的時(shí)候是有思維定勢(shì)的,而且這種定勢(shì)的頑固性很強(qiáng)。這很容易對(duì)環(huán)境產(chǎn)生一種叛逆思想。就是說(shuō)除了他自己假想出來(lái)的做法,其他的一切都是不對(duì)的,或者說(shuō)不好的。而這在使用 IP 的時(shí)候,會(huì)遭遇到意想不到的痛苦的。所以,盡量不要依靠假設(shè)來(lái)臆想了模塊的設(shè)置。而是盡量的適應(yīng)環(huán)境,來(lái)配置自己的設(shè)計(jì)。作為一個(gè)FPGA 的玩家,這種依照環(huán)境來(lái)改變的能力是必須的。
NiosII 的參數(shù)中首先是指令集或者說(shuō) CPU 復(fù)雜度的選擇,有三個(gè)選擇,根據(jù)不同的選擇,CPU 的能力會(huì)有不同,當(dāng)然使用的資源也是完全不一樣的 NiosII/E (經(jīng)濟(jì)型)能力最弱,當(dāng)然資源也最小(600-700 LE )
NiosII/S (中間型) 中庸配置,資源消耗是 1200-1400 LEzNiosII/F (快速型) 能力最強(qiáng)配置,資源消耗是 1400-1800LE
然后我們考慮 Cashes 的設(shè)置,Cash 有兩種,一種是用來(lái)做指令緩存的,一種是用來(lái)做數(shù)據(jù)緩存的。Cash 的大小對(duì)程序的運(yùn)行速度是有影響的。當(dāng)然也沒(méi)必要使用過(guò)多的資源。夠用就好了。
再了解一下 Jtag Debug 的模式選擇,一共有五個(gè)等級(jí)的選擇。和選擇 CPU 一樣,從簡(jiǎn)單到復(fù)雜。一般來(lái)說(shuō)選擇 Level2 也就夠用的。
自定義指令設(shè)置。這是最有價(jià)值的設(shè)置。別忘記了,我們是在 FPGA 的世界里。所以 CPU并不像在其他地方那樣的鐵板一塊。我們可以選擇使用自定義的指令。所謂自定義指令,并不是一個(gè)軟件宏或者函數(shù)。而是一塊硬件。當(dāng) CPU 調(diào)用到這個(gè)指令的時(shí)候,事實(shí)上它調(diào)用的就是這個(gè)硬件模塊,它被嵌入在 CPU 中。而這其實(shí)就是 NiosII 好玩的地方。
好了,現(xiàn)在我們要考慮的問(wèn)題,就是使用。使用 CPU 的方法,當(dāng)然就是軟件編程。NiosII的軟件其實(shí)是非常簡(jiǎn)單的。就是普通的 C,或者 C++,需要做的就是不斷的對(duì)端口的地址讀啊,寫(xiě)啊,計(jì)算數(shù)據(jù),就好了。但也可能非常的復(fù)雜,因?yàn)槟悴粌H需要了解軟件編程,你更需要了解你使用的那些硬件,那些外設(shè)模塊。NiosII 的編程很硬件的依賴性是很強(qiáng)的。針對(duì)比較大型的一些外設(shè),可以寫(xiě)一些 HAL 程序。這是類似于驅(qū)動(dòng)的一些指令。而軟件只需要調(diào)用這些 API 就可以了。大部分的 NiosII 程序是不需要使用操作系統(tǒng)的,作為一個(gè)嵌入式系統(tǒng)的控制核心,更多的是一些存儲(chǔ)式的讀寫(xiě),算法的計(jì)算的操作。除非你需要運(yùn)行一些網(wǎng)絡(luò)協(xié)議啊,什么的。但其實(shí)我們可以用更加解構(gòu)的方式來(lái)看待一個(gè)操作系統(tǒng)。操作系統(tǒng)其實(shí)就是給我們提供了一大堆的操作指令而已。沒(méi)什么更特別的作用了。所以,思考一下吧。
我用了不求甚解的方式來(lái)介紹了一下 NiosII。這是一種偷懶的方式。我要做的,其實(shí)就是把一些關(guān)鍵的點(diǎn)指出來(lái),大家可以去看,同時(shí)不把時(shí)間消耗在細(xì)枝末節(jié)上面。要把 NiosII 完整的說(shuō)清楚,當(dāng)然不是這么三言兩語(yǔ)的就可以的了,否則事情也太簡(jiǎn)單了些了。我希望可以對(duì)大家有所幫助的地方就是,對(duì)一件復(fù)雜的事情,找一個(gè)聰明的方式。
囫圇吞棗之 SOPC
SOPC builder 是 QuartusII 中用來(lái)建立,開(kāi)發(fā),維護(hù)系統(tǒng)的平臺(tái)。雖然很多時(shí)候我們用它作為 NiosII 的一個(gè)嵌入式系統(tǒng)的開(kāi)發(fā)環(huán)境,但我希望大家不要把思路只是局限在 NiosII 上面。它將成為一個(gè)包容全部系統(tǒng)內(nèi)容的一個(gè)平臺(tái)。
讓我們把一個(gè)系統(tǒng)分割成為兩個(gè)部分。一個(gè)是控制部分。所謂的控制,就是對(duì)很多的寄存器進(jìn)行讀寫(xiě),或者是對(duì)內(nèi)存存儲(chǔ)器進(jìn)行操作。而這些操作往往是與地址相關(guān)的。所以,我們使用 Avalon-MM 進(jìn)行這部分的連接。好像很多的系統(tǒng)一樣,這個(gè)接口的兩端是主從設(shè)備。主設(shè)備發(fā)出要求,從設(shè)備被動(dòng)接受操作。舉個(gè)簡(jiǎn)單的例子,CPU 永遠(yuǎn)都是一個(gè)主設(shè)備,而一些存儲(chǔ)器,比如 Flash, SRAM 則是從設(shè)備。而 CPU 并不是唯一的主設(shè)備,比如 DMA 也可以作為主設(shè)備。由于 Avalon-MM 總線的點(diǎn)對(duì)點(diǎn)結(jié)構(gòu),當(dāng) DMA 對(duì)一個(gè)從設(shè)備進(jìn)行處理的時(shí)候,CPU 可以對(duì)另一個(gè)設(shè)備進(jìn)行出來(lái)。這就是這種結(jié)構(gòu)最大的優(yōu)勢(shì)。
但是單一的 Avalon-MM 并不能完全的解決問(wèn)題。因?yàn)閷?duì)于某些傳輸而言,地址是沒(méi)有意義的。而高的通過(guò)率可能更重要。這就是數(shù)據(jù)通道。一些數(shù)據(jù)的處理,比如濾波,視頻處理的操作。而這就需要用 Avalon-ST 的接口進(jìn)行連接。在這種結(jié)構(gòu)中,接口的兩端是相對(duì)平衡的地位。作為 SOPC builder 中的一個(gè)模塊,他可以同時(shí)擁有多個(gè)所有的端口。然后再端口和端口之間進(jìn)行連接。
………………
………限于篇幅這部分請(qǐng)下載附件………
………………
0.png (64.98 KB, 下載次數(shù): 146)
下載附件
2018-8-16 16:03 上傳
大家一起來(lái)搭積木好了。
啥是 DSP
終于寫(xiě)到 DSP 這部分了,由于是我的本行,我反而一下子不知道該怎么寫(xiě)好了。或許最主要的一個(gè)原因是 DSP 涉及的范圍實(shí)在是廣得亂七八糟了點(diǎn)。突然之間變得有點(diǎn)無(wú)所適從起來(lái)。所以只好暫且寫(xiě)到哪里看哪里了。
大家知道我們這里說(shuō)玩轉(zhuǎn) FPGA 的,每次我在 FPGA 里面提到了 DSP 的題目的時(shí)候,總是會(huì)有一些人打斷我說(shuō),兄弟啊,你大概走錯(cuò)地方了。我們這里都是硬件工程師,或者可能有些寫(xiě) C 的,但是 DSP,那東西不會(huì)寫(xiě)哦。那么好吧,我就跑到 DSP 那里去講,F(xiàn)PGA,然后就會(huì)有人問(wèn)我,你們這個(gè) FPGA 和 TI 的 DSP 比有什么區(qū)別呢?我暈。我想說(shuō)的是,我這里的 DSP 是 Digital Signal Processing (數(shù)字信號(hào)處理),而不是 Digital Signal Processor (數(shù)字信號(hào)處理器)。
不能否認(rèn)處理器在數(shù)字信號(hào)的歷史上擁有絕對(duì)的貢獻(xiàn)和近乎壟斷的地位。作為最簡(jiǎn)便的一種實(shí)現(xiàn)方式(軟件),數(shù)字信號(hào)處理器具備非常大的靈活性,以及對(duì)系統(tǒng)的升級(jí)能力。但是,隨著技術(shù)越來(lái)越復(fù)雜高端(很多其實(shí)是蠻沒(méi)必要的),處理器開(kāi)始不斷的在它的瓶頸上碰壁。一個(gè)是算法的復(fù)雜度,一個(gè)是對(duì)多通道的苛刻要求,使得產(chǎn)品對(duì)處理速度的要求幾乎成指數(shù)級(jí)增長(zhǎng)。這就使得 FPGA 有了施展拳腳的地方。是的 FPGA 就是硬件,或許那里面的一個(gè)乘法器無(wú)法和處理器里面的乘法器相比,但是架不住人多吧。我用 100 個(gè),兩百個(gè),四百個(gè)同時(shí)運(yùn)算呢?所以我們開(kāi)始觀察這個(gè)市場(chǎng)的時(shí)候,F(xiàn)PGA 已經(jīng)成為無(wú)法被忽略的一部分。再反過(guò)來(lái)看看 FPGA,那是什么玩意兒啊,一個(gè)只能用來(lái)做數(shù)字電路的芯片,不用它做數(shù)字信號(hào)處理,還真想不太出,它更適合做什么呀。
好了,讓我們重新考慮一下 DSP。DSP 的觀念其實(shí)是非常簡(jiǎn)單的,它就是一個(gè)轉(zhuǎn)換器。好像你從這里進(jìn)去,從那里出來(lái),出來(lái)的時(shí)候你就不是你自己了,要么瘦了,要么胖了,甚至可能說(shuō)性別都變了,或者可能說(shuō)別人的腦袋換到你的頭上去了。總之,作為數(shù)據(jù),你從這里進(jìn)去,經(jīng)過(guò)這么個(gè)玩意兒以后,變成一套新的數(shù)據(jù)。這就是 DSP。一定很多人說(shuō),你這不是廢話,要是都一樣的,要你芯片做什么?還真的,想要在數(shù)字電路里面脫離 DSP 真不是那么容易的事情了。當(dāng)然也不能把話說(shuō)得滿了,否則很多人要不高興了。好比網(wǎng)絡(luò)協(xié)議處理,就不是 DSP,因?yàn)橐话銜?huì)關(guān)注的都是包頭信息,而對(duì)包本身的內(nèi)容,從來(lái)都不關(guān)心。而 DSP關(guān)注的是要改變數(shù)據(jù)本身的。讓我們說(shuō)得更加具體一點(diǎn)好了,比如通訊,尤其是無(wú)線通訊。通訊嘛,很簡(jiǎn)單就是要把信號(hào)送出去吧,但是數(shù)字信號(hào)不能就這么送出去,除非有根線。所以要對(duì)數(shù)字信號(hào)做一些改變,比如說(shuō)調(diào)制,把信號(hào)變成什么 BPSK, QPSK,QAM 什么的。有了調(diào)制,在接受端,當(dāng)然就要有解調(diào)。這就是我們俗稱的調(diào)制解調(diào)器。我們這里來(lái)玩一下英語(yǔ),調(diào)制:Modulation,解調(diào):Demodulation,所以調(diào)制解調(diào)器就叫做 Modem。另一個(gè)比較大的應(yīng)用就是圖像處理,圖像那么大的數(shù)據(jù),沒(méi)辦法不變化的就用,所以要對(duì)圖像進(jìn)行編碼,當(dāng)然在播放的時(shí)候,需要解碼出來(lái),編碼:code,解碼:decoder,所以編解碼器我們叫做:codec。通過(guò)這些例子可以發(fā)現(xiàn),DSP 一般都是一對(duì)的,這很容易理解,對(duì)數(shù)據(jù)進(jìn)行變化,并不是因?yàn)槲覀兂燥柫藫蔚臎](méi)事情做,而是有一定的目的的。比如為了節(jié)省帶寬,我們需要對(duì)數(shù)據(jù)進(jìn)行壓縮。比如由于接受端的誤碼率會(huì)比較高,所以我們需要用糾錯(cuò)算法,為了達(dá)到糾錯(cuò)的目的,我們就必須對(duì)數(shù)據(jù)進(jìn)行卷積編碼。而接受端就要做解卷積糾錯(cuò)。所以在對(duì)數(shù)據(jù)進(jìn)行變化以后,我們通常會(huì)在另一端把它恢復(fù)出來(lái)。否則誰(shuí)知道那是什么東西呢。這也可以當(dāng)作是 DSP 的一個(gè)特點(diǎn)吧。
完全沒(méi)必要把 DSP 看成多么復(fù)雜的事情,算法,聽(tīng)上去多么高深的東西呀。其實(shí)只要是所有的學(xué)過(guò)加減乘除就可以自己做算法。而所有的算法都是有一個(gè)目的的,只要你理解了這個(gè)目的,至于說(shuō)具體的方法,是可以仁者見(jiàn)仁智者見(jiàn)智了。舉個(gè)例子,看是不是真的超出你的智商了。傳統(tǒng)電視,或者說(shuō)攝像的時(shí)候,我們是使用隔行掃描的方式。就是說(shuō)每幅圖片其實(shí)只有一半的數(shù)據(jù),比如我第一次給你 1,3,5,7,9 行,第二次給你 2,4,6,8,10 行。因?yàn)榘l(fā)現(xiàn)人的眼睛是很容易騙的,所以用這種方式你其實(shí)是察覺(jué)不出來(lái)的。但是我們現(xiàn)在用數(shù)字電視了,而且要高清,所以你不能那么忽悠我啊,為了省帶寬,可以少一半,但是放出來(lái)的時(shí)候不能那樣。所以我們要把這半幅圖在變成一幅完整的圖,這就變成了逐行掃描。你想象一下可以用什么辦法做呢?想一下。答對(duì)了,兩種方法,第一種方法是,可以直接把 1,3,5,7,9 copy 一下不就好了?這種模式叫 Bob 模式。還有一種方式,就是等到 2,4,6,8,10 也來(lái)了,再把它們兩拼起來(lái)變成一副圖,放兩次,這種模式叫做 Weave 模式。Weave 模式的好處是圖像看上去更加清晰。簡(jiǎn)單吧?但是有一個(gè)問(wèn)題,畢竟這是兩幀不一樣的圖片,是在不同時(shí)間點(diǎn)拍的。所以當(dāng)一個(gè)東西的移動(dòng)速度特別快的時(shí)候,你會(huì)發(fā)現(xiàn)兩幅圖片是有細(xì)微差別的。這就會(huì)在電視上看到一些鋸齒狀的邊緣。如果大家仔細(xì)看自己的電視,是可以發(fā)現(xiàn)的,尤其是很多廣告里面。那么為了解決這種問(wèn)題,我們可以比較一下他們之間的差別,如果差別超過(guò)了一定的值,我們就用Bob 模式,如果沒(méi)超過(guò),就用 Weave 模式。你看,簡(jiǎn)單吧,其實(shí)算法就是這么回事情,沒(méi)什么大不了的。做 DSP 需要有一種無(wú)招勝有招的精神。因?yàn)?DSP 的算法實(shí)在太多了,你完全沒(méi)可能記住,也完全沒(méi)必要一個(gè)個(gè)的去學(xué)。只有當(dāng)你需要實(shí)現(xiàn)的時(shí)候再去學(xué)習(xí)就好了,方法就是首先知道算法的自然原理,很容易就可以理解算法原理。而算法原理也不過(guò)就是一些加減乘而已,連除都很少的。
DSP builder 是干啥的?
DSPbuilder 就是 Altera 設(shè)計(jì)用來(lái)方便客戶設(shè)計(jì) DSP 的工具。首先我們了解一個(gè)背景,現(xiàn)在最牛的算法軟件毋庸置疑的就是 Matlab 了。或許在統(tǒng)計(jì)學(xué),或者其他的數(shù)學(xué)模型方面有更加專業(yè)的工具,但是對(duì)于 DSP 而言,Matlab 是不二的選擇。N 多的人在用他來(lái)搭建模型。我們可以把 Matlab 分成 matlab 和 simulink 兩部分。Matlab 更多的是對(duì)數(shù)組進(jìn)行一系列的計(jì)算,而這種計(jì)算是靜態(tài)的。而 simulink 是使用模塊化的方式來(lái)搭建一個(gè)模型,而這個(gè)模型才是動(dòng)態(tài)化的。當(dāng)我們用 matlab 做成一個(gè)算法的時(shí)候,先不用開(kāi)心太早,因?yàn)樗耆锌赡苁菬o(wú)法實(shí)現(xiàn)的。更多的只是一種理論上的公式。只有當(dāng)我們用 simulink 來(lái)搭建出一個(gè)模型的時(shí)候,我們可以知道,它是可以被實(shí)現(xiàn)出來(lái)的,無(wú)論是軟件,或者硬件的方式。
我們小的時(shí)候?qū)W數(shù)學(xué),學(xué)乘法,大家一定還有美好的回憶,個(gè)位乘,然后進(jìn)位到十位,然后在一步一步的算下去,算了長(zhǎng)長(zhǎng)的一溜,很有成就感的。我記得那個(gè)時(shí)候我們還要用尺來(lái)畫(huà)中間的那根線呢,因?yàn)槔蠋熣f(shuō)那條線要畫(huà)得直,好像畫(huà)不直的話就算不出正確答案了(大概所謂心誠(chéng)則靈的意思吧)。后來(lái)知道了,這個(gè)世界上,居然有一個(gè)東西叫做計(jì)算器。那個(gè)東西是你無(wú)論如何光著腳都攆不上的速度,而且不會(huì)出錯(cuò)(不過(guò)好像也見(jiàn)過(guò) 1+1=3 的計(jì)算器)。我們于是發(fā)現(xiàn)自己似乎被騙了,我們?yōu)槭裁匆瞿且婚L(zhǎng)串的中間過(guò)程呢?是的。如果我們用這種方式來(lái)考慮問(wèn)題的話,一邊是做好的算法模型,一邊是我們的 FPGA 芯片。為什么我們還需要很辛苦的寫(xiě)什么 Verilog, VHDL 代碼呢?就好像在學(xué) Verilog, VHDL 之前我們做什么?我們學(xué)數(shù)字電路,現(xiàn)在還有幾個(gè)人在用那些與非門(mén)搭電路呢?所謂社會(huì)的進(jìn)步一定是不斷從低端向高端發(fā)展的歷史過(guò)程。所以,與非們對(duì)于 Verilog 來(lái)說(shuō)是沒(méi)必要的中間過(guò)程。但其實(shí) Verilog 本身又何嘗不是呢?當(dāng)然了,Verilog, 與非門(mén)這些東西,對(duì)于我們對(duì)電路的理解和學(xué)習(xí)是做出過(guò)貢獻(xiàn)的,但是,是不是到了應(yīng)該把它們淘汰了的時(shí)候了呢(我這里說(shuō)的只是和算法相關(guān)的電路)?或許現(xiàn)在還沒(méi)有真的到了這個(gè)時(shí)期,但是它正在一步步的向我們靠近。而 DSP builder 就是基于這種思想的工具。讓我們看看用了 DSP builder,可以給我們省多少東西。
首先是省了時(shí)間,時(shí)間是這個(gè)功利社會(huì)最重要的東西,沒(méi)有人有耐心等待你做一個(gè)十全十美的東西出來(lái)。誰(shuí)最早出來(lái),哪怕是東西爛到不能用,都是成功的。所以時(shí)間比什么都重要。然后是省了人,不需要找一些人來(lái)把那些算法轉(zhuǎn)變成為代碼了。如果大家對(duì) Simulink 比較熟悉的話,可以看到,simulink 的庫(kù)里面有你的一切實(shí)驗(yàn)環(huán)境。好比信號(hào)發(fā)生器啊,信道啊。另外還有最全面的檢測(cè)系統(tǒng),比如說(shuō)示波器啊,頻譜分析儀啊,誤碼率分析器啊。有了這一切,你還要實(shí)驗(yàn)室做什么?至少你不需要那一大堆昂貴的儀器了吧。
物盡其用,人盡其能,我們還是希望盡量多的去發(fā)揮一些優(yōu)勢(shì)性的東西。所以千萬(wàn)不要說(shuō)用DSP builder 去做一個(gè)非常復(fù)雜的控制邏輯,那只能是得不償失。所以,我更建議大家用 DSPbuilder 來(lái)做一些算法方面的實(shí)現(xiàn)。然后作為整個(gè)系統(tǒng)中的一個(gè)模塊來(lái)使用。這樣可以使你的設(shè)計(jì)更有效率,并且可修改性增強(qiáng)。DSP builder 和 SOPC builder 的結(jié)合使用可以大大增強(qiáng)你的設(shè)計(jì)能力。比如說(shuō),我們可以用 DSP builder 來(lái)做一些運(yùn)算模塊,然后再 SOPC builder里面連接起來(lái)。再用一個(gè) NiosII 來(lái)作為控制,寫(xiě)一些軟件代碼。一個(gè)看上去非常復(fù)雜的系統(tǒng),其實(shí)已經(jīng)可以看到了。而這整個(gè)過(guò)程中,我們沒(méi)有寫(xiě)過(guò)一行硬件代碼。可以說(shuō),這種系統(tǒng)設(shè)計(jì)思路就是未來(lái)的一個(gè)趨勢(shì)。
DSP builder 設(shè)計(jì)看上去簡(jiǎn)單,但要精通也并不容易。有兩個(gè)方面是比較讓人困惑不已的。如果你是一個(gè)做算法的人,你對(duì) Simulink 非常熟悉,而你對(duì)硬件方面所知寥寥,那有可能犯第一個(gè)問(wèn)題:時(shí)序問(wèn)題。在設(shè)計(jì)中,你很難找到時(shí)序的節(jié)點(diǎn),就是寄存器,因?yàn)榧拇嫫鞫际谴嬖谟谀K本身里面的。有很多人設(shè)計(jì)了一個(gè)從頭到尾都是組合電路的設(shè)計(jì)。而這種設(shè)計(jì)是肯定無(wú)法通過(guò)時(shí)序驗(yàn)證的。解決這樣的問(wèn)題,現(xiàn)在有兩個(gè)模塊可以幫助。第一個(gè)是 8.0 里面新出來(lái)的,Display Pipeline Depth。很明顯,這個(gè)模塊的作用就是現(xiàn)實(shí)所有模塊的流水級(jí)數(shù),就是這個(gè)模塊里面有幾層寄存器。這樣你從模型上就可以很清楚的看到兩級(jí)寄存器之間的距離,規(guī)避冗長(zhǎng)的組合電路。另外一個(gè)就是 Resource Usage. 這個(gè)是資源使用顯示模塊,在編譯以后,可以顯示資源的使用量。但是它有一個(gè)附屬功能,其實(shí)更加有用,就是 timing。它可以用來(lái)顯示所有沒(méi)有通過(guò)時(shí)序分析的路徑,然后在模型中間 highlight 出來(lái)。這樣可以幫助你很容易的發(fā)現(xiàn)問(wèn)題所在,然后做些亡羊補(bǔ)牢的事情。
針對(duì)對(duì)硬件非常熟悉,但是對(duì) Simulink 這種東西非常不熟悉的人有一個(gè)麻煩,那就是時(shí)鐘。在 DSPbuilder 的設(shè)計(jì)中,所有的時(shí)鐘和時(shí)鐘復(fù)位信號(hào)都是隱藏的。在 simulink 中,時(shí)鐘是通過(guò)采樣率來(lái)定義的,或者叫時(shí)鐘域。從一個(gè)初始的采樣率開(kāi)始,后面的模塊都是使用相同的時(shí)鐘域的。我們可以使用 Rate Change 目錄下的模塊來(lái)對(duì)時(shí)鐘進(jìn)行切換。而這似乎讓人很容易暈。這里我們可以使用 simulink 的工具。它可以設(shè)置使得不同時(shí)鐘域的模塊顯示成為不同顏色。這樣看起來(lái)就舒服很多了。
再說(shuō)一個(gè) DSP builder 里面最讓人心動(dòng)的東西吧。HIL ( hardware in loop)。這是一個(gè)非常有趣的概念。我們現(xiàn)在討論的是一個(gè) FPGA 平臺(tái),這個(gè)芯片是可以無(wú)限次燒錄的。不會(huì)燒一次收你一塊錢(qián)的。而我們?cè)谧鲈O(shè)計(jì)的時(shí)候經(jīng)常有這樣的問(wèn)題,對(duì)設(shè)計(jì)本身沒(méi)有把握,不知道是不是對(duì),當(dāng)然可以做仿真。但是仿真有的時(shí)候很麻煩,一個(gè)是速度可能會(huì)太慢了點(diǎn)。一個(gè)是我依然不相信你們的這個(gè)仿真模型是不是真的夠仿真。所以,你就可以嘗試用 HIL 來(lái)加速你的仿真,同時(shí)增強(qiáng)你的信心。HIL 把你的設(shè)計(jì)包裹在一套接口中間,進(jìn)行編譯,然后下載到板子的 FPGA 中間。Simulink 通過(guò)下載電纜把測(cè)試數(shù)據(jù)不斷的灌入,然后在輸出端不斷的獲得硬件跑出來(lái)的結(jié)果。通過(guò)這么一個(gè)過(guò)程,保證你的仿真達(dá)到多快好省的境界。但是,這也只是仿真而已,我不管它叫做測(cè)試,因?yàn)樗皇窃谡鎸?shí)的時(shí)鐘頻率下操作的。時(shí)鐘是通過(guò)Jtag 的時(shí)鐘驅(qū)動(dòng)的。所以你不要指望它可以跑在 100,200 兆上。但是速度依然已經(jīng)夠快了。如果這樣的電路下載下去還有問(wèn)題,那可能性只有一個(gè),你的約束錯(cuò)了。或者是時(shí)序有問(wèn)題,或者是你的管腳出問(wèn)題。而你的算法設(shè)計(jì)本身不會(huì)有問(wèn)題。
咋還有個(gè) Advanced 呢?
為啥又出來(lái)了這么一個(gè)叫做 DSP builder 高級(jí)模塊組呢?(8.0 里面才有)。讓我們首先來(lái)看看DSP builder 本身。有這么幾個(gè)問(wèn)題。首先 DSP builder,號(hào)稱是用來(lái)做算法的,但是搭出來(lái)的模型看上去更像是電路圖,和本身算法的框圖區(qū)別巨大。其次,作為一個(gè)不太了解硬件的人,可能我并不知道如何才能達(dá)到我需要的能力。換句話說(shuō),我的時(shí)鐘是 100 兆的,但我并不知道怎么樣的電路就可以做成 100M 的。還有一些細(xì)節(jié)上的問(wèn)題,比如說(shuō)多通道的問(wèn)題,比如說(shuō)系統(tǒng)層面的問(wèn)題。所以,我們需要一套更加強(qiáng)大,有擴(kuò)展性的平臺(tái)來(lái)解決這些算法設(shè)計(jì)上的核心問(wèn)題。我們來(lái)看看這個(gè)高級(jí)模塊的四大特點(diǎn):
1. 多通道支持,在這個(gè)模塊組中,接口都異常的簡(jiǎn)單,基本上就是這樣三個(gè),V, D, C. V就是 Valid, D 就是 Data, C 就是 Channel。所以要告訴他的就是,是個(gè)數(shù)據(jù),是不是有效數(shù)據(jù),是那個(gè)通道上的有效數(shù)據(jù)。所以,無(wú)論你是多少通道的設(shè)計(jì),無(wú)論你怎么修改你的通道數(shù)目,模型就還是這么個(gè)模型,都是一樣的。這樣可以使你的模型和你的算法框圖看上去幾乎是一樣的。
2. 自動(dòng)插流水。這個(gè)是比較高級(jí)的一個(gè)功能。就是在設(shè)計(jì)中間自己加入寄存器。你不需要在設(shè)計(jì)里放任何一個(gè)寄存器。你只需要告訴工具,你想要的時(shí)鐘頻率,和你的目標(biāo)器件,工具可以自己在電路中間插入流水寄存器。這樣可以保證你的設(shè)計(jì)完全使用器件的最大能力,同時(shí)不會(huì)出現(xiàn)時(shí)序問(wèn)題。可能的缺點(diǎn)就是,你無(wú)法預(yù)知延時(shí),而大家知道,如果一個(gè)設(shè)計(jì)是流水線模式的,其實(shí)延時(shí)是多少并不重要了。
3. 系統(tǒng)層面的設(shè)計(jì)。這也是一個(gè)比較新鮮的東西。所有設(shè)計(jì)里面的寄存器都會(huì)被編入一個(gè)系統(tǒng)地址查找表,比如說(shuō) FIR 的系數(shù),一些控制寄存器都會(huì)有不同的地址。我們可以通過(guò)一個(gè)系統(tǒng)接口來(lái)對(duì)這些寄存器進(jìn)行操作。這樣使整個(gè)設(shè)計(jì)更具有系統(tǒng)化概念。在編譯的時(shí)候,同時(shí)非常高級(jí)的生成一個(gè)寄存器列表(網(wǎng)頁(yè)格式),包括寄存器名字,地址,初始值。所以可以見(jiàn)到,通過(guò)這個(gè)高級(jí)的模塊的增強(qiáng),使得算法方面的實(shí)現(xiàn)與設(shè)計(jì)變得更加容易。也可以很容易的實(shí)現(xiàn)非常復(fù)雜的系統(tǒng)。
后記
花了點(diǎn)時(shí)間,寫(xiě)了一大堆自己都看不太過(guò)去的東西。也不知道是不是把人都看得煩了。總是很容易的就陷入了技術(shù)的陷阱里面,而無(wú)法到達(dá)自己定義的娛樂(lè)的境界。很有點(diǎn)慚愧的味道。看來(lái)再不能自詡為芯片業(yè)中娛樂(lè)能力最強(qiáng)的人了。大概只能算是其中之一了。不過(guò)想想也沒(méi)太必要牽強(qiáng)于一種觀念,不能娛樂(lè)就不能娛樂(lè)罷,關(guān)鍵是能不能因此而有一些收獲。如果說(shuō)看了這么多,有了很多收獲,有一些觀念就這么莫名其妙的建立起來(lái)了。那這些別字百出的文字也就有他們存在的意義了。這些文字到這里算是一個(gè)斷點(diǎn),當(dāng)然我也并不希望就是一次結(jié)束。希望可以成為一種開(kāi)始,一種對(duì)技術(shù)討論的新的方式的嘗試。我并不能確定這種嘗試的意義具體能有多重大,因?yàn)槲夷芟氲降木褪俏易约捍策呑狼澳且恍K地皮上的雞毛蒜皮。但是無(wú)論如何,這算件挺有意思的事情。而我本身也算是在自?shī)首詷?lè)了吧。
但是,問(wèn)題是,我依然是盲目的。我不知道看我的這些文字的人在想些什么,他們具體的需要什么,他們想知道什么。我只是摸著腦袋猜,阿門(mén),他們大概應(yīng)該知道這些吧,于是我就寫(xiě)了。這當(dāng)然肯定是不精準(zhǔn)的。我也并不太想去寫(xiě)那些文檔中已經(jīng)有的東西,所以一些教科書(shū)式樣的文字在我這里是沒(méi)有的,雖然那樣可以消耗很多篇幅,比如說(shuō),第一步,第二步。拜托,大家都是成年人了,能不能有點(diǎn)創(chuàng)意呀?完蛋了,又跑題了。所以呢,其實(shí)我想說(shuō)的是,我需要反饋,我需要反饋來(lái)讓我做的更好。我不希望我只是一個(gè)孤獨(dú)的行走的人,我希望看到有多少人在看著我行走。
所以,如果你,可以給我一些你的想法,你的需求,或者你的問(wèn)題,哪怕你的理想。都可以一股腦的灌給我。垃圾郵件暫時(shí)還是免了。
祝大家玩得開(kāi)心。
完整的pdf格式文檔51黑下載地址(共52頁(yè)):
大話FPGA.pdf
(3.29 MB, 下載次數(shù): 294)
2018-8-16 14:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|