手把手教你學(xué)FPGA設(shè)計(jì)基于大道至簡(jiǎn)的至簡(jiǎn)設(shè)計(jì)法
序隨著微電子技術(shù)的發(fā)展,可編程門陣列(FPGA)技術(shù)已經(jīng)成為信息產(chǎn)業(yè)最熱門的技術(shù)之一,其應(yīng)用范圍遍及電子、通信、自動(dòng)化、醫(yī)療、軍事和航空航天等多個(gè)熱門領(lǐng)域。在數(shù)字集成電路設(shè)計(jì)領(lǐng)域,前端驗(yàn)證工作通常依托FPGA,并由那些精通硬件構(gòu)架的FPGA系統(tǒng)工程師來(lái)完成。因此,FPGA技術(shù)的設(shè)計(jì)和開發(fā)已成為當(dāng)前發(fā)展迅速的朝陽(yáng)行業(yè)之一。作者曾在華為海思、展訊通信等集成電路設(shè)計(jì)企業(yè)參與了FPGA大型項(xiàng)目的開發(fā)設(shè)計(jì),近年來(lái)又在明德?lián)P科技教育公司從事FPGA的教學(xué)培訓(xùn),從而有機(jī)會(huì)深入研究和采用多種教學(xué)方法進(jìn)行試驗(yàn),以便把那些構(gòu)成FPGA設(shè)計(jì)基礎(chǔ)的知識(shí)模塊和工具平臺(tái),變成FPGA學(xué)習(xí)者能夠?qū)嶋H運(yùn)用的方法,而更重要的是能夠幫助學(xué)習(xí)者消化核心功能及其設(shè)計(jì)流程。于是,本書便應(yīng)運(yùn)而生,旨在為FPGA學(xué)習(xí)者提供一種FPGA的至簡(jiǎn)設(shè)計(jì)方法。與一些將FPGA設(shè)計(jì)的理論知識(shí)和軟件工具作為敘述重點(diǎn)的教程不同,本書的重點(diǎn)不在于介紹FPGA設(shè)計(jì)是什么,而側(cè)重于引導(dǎo)學(xué)習(xí)者怎么做。經(jīng)過(guò)這樣設(shè)計(jì)后的內(nèi)容可以引起學(xué)習(xí)者濃厚的興趣,并使學(xué)習(xí)者在短時(shí)間內(nèi)快速掌握FPGA設(shè)計(jì)方法,正如諾貝爾文學(xué)獎(jiǎng)獲得者、法國(guó)作家AnatoleFrance的精辟格言:教學(xué)的全部藝術(shù)就是喚醒年輕心靈的天然好奇心。
黃君凱
2016年10月于廣州暨南園
前言
隨著我國(guó)工業(yè)智能化的發(fā)展,工業(yè)企業(yè)的個(gè)性化需求劇增。相應(yīng)的,對(duì)FPGA/IC行業(yè)人才的需求,特別是高端人才的需求也隨之劇增。然而,目前國(guó)內(nèi)的FPGA/IC教育相對(duì)落后:高等院校缺乏項(xiàng)目經(jīng)驗(yàn)豐富的教師;現(xiàn)有教材陳舊,無(wú)法跟上最新技術(shù)的發(fā)展;學(xué)習(xí)資料缺乏,大都重視軟件操作示范,不重視設(shè)計(jì)理念傳授等。這些客觀因素使學(xué)生對(duì)FPGA/IC望而生畏,即使有大量學(xué)生立志學(xué)好FPGA/IC設(shè)計(jì),但多數(shù)不得要領(lǐng),最終放棄學(xué)習(xí)。由于失去了群眾基礎(chǔ),導(dǎo)致國(guó)內(nèi)缺乏高素質(zhì)的FPGA人才,從而對(duì)我國(guó)工業(yè)智能化的發(fā)展產(chǎn)生了一定的影響。為了擴(kuò)大FPGA/IC設(shè)計(jì)的群眾基礎(chǔ),降低FPGA/IC設(shè)計(jì)的學(xué)習(xí)門檻,明德?lián)P科技教育公司(簡(jiǎn)稱明德?lián)P)結(jié)合培訓(xùn)班、企業(yè)內(nèi)訓(xùn),以及多年國(guó)內(nèi)頂尖企業(yè)的工作經(jīng)驗(yàn),研發(fā)出一套FPGA/IC設(shè)計(jì)流程至簡(jiǎn)設(shè)計(jì)法。至簡(jiǎn)設(shè)計(jì)法是明德?lián)P豐富項(xiàng)目經(jīng)驗(yàn)的結(jié)晶,它將高級(jí)的設(shè)計(jì)技巧轉(zhuǎn)化成幾條規(guī)則,掌握了這些規(guī)則就相當(dāng)于擁有多年的經(jīng)驗(yàn)。至簡(jiǎn)設(shè)計(jì)法流程中的每一步都簡(jiǎn)單易操作,容易上手,便于掌握。掌握至簡(jiǎn)設(shè)計(jì)法,可以實(shí)現(xiàn)0仿真、0調(diào)試、一次成功的設(shè)計(jì),極大地提高了工作效率。明德?lián)P致力于打造最簡(jiǎn)單、最實(shí)用、最高效的FPGA/IC設(shè)計(jì)法,不遺余力地為普及FPGA/IC設(shè)計(jì),提升客戶競(jìng)爭(zhēng)力,提高我國(guó)該行業(yè)整體的設(shè)計(jì)能力做貢獻(xiàn)。很多同學(xué)在剛開始學(xué)習(xí)FPGA/IC設(shè)計(jì)時(shí)都會(huì)走彎路,下面是兩位學(xué)員的學(xué)習(xí)經(jīng)歷與心得。學(xué)員一:①買一本書,花大量的時(shí)間學(xué)習(xí)語(yǔ)法;②到網(wǎng)上搜一些資料,類似大全、玩轉(zhuǎn)之類的速成之法;③買一個(gè)開發(fā)板,看代碼、下載例程看現(xiàn)象。學(xué)員一的情況具有普遍性,作為一個(gè)剛接觸FPGA的初學(xué)者,這似乎是必經(jīng)之路,很多學(xué)員在來(lái)明德?lián)P學(xué)習(xí)之前就以這樣的方式學(xué)了大約半年的時(shí)間。當(dāng)然,這樣的學(xué)習(xí)方法不是說(shuō)學(xué)不好,而是很難學(xué)好,或者需花費(fèi)很長(zhǎng)的時(shí)間。以看書學(xué)習(xí)為例,可以說(shuō)書是根源,學(xué)習(xí)任何知識(shí)都離不開書,書作為一個(gè)知識(shí)體系,要求全面、系統(tǒng),但作為初學(xué)者就沒(méi)有必要學(xué)得那么全面、系統(tǒng)了。很多學(xué)員在學(xué)Verilog時(shí),就是拿一本書,仔仔細(xì)細(xì)地看,花費(fèi)了不少時(shí)間,但效果卻不理想。我們都知道,Verilog的很多語(yǔ)法是不能綜合的,而這些語(yǔ)法也沒(méi)有實(shí)際的電路與之對(duì)應(yīng),當(dāng)然在具體的邏輯設(shè)計(jì)時(shí)也是不能用的,但書上并不會(huì)很明確地指出。再舉一個(gè)例子,也是很多人都犯過(guò)的一個(gè)錯(cuò)誤:以普通信號(hào)作為always的敏感信號(hào)列表。當(dāng)我們這樣寫的時(shí)候,根本不會(huì)意識(shí)到這是錯(cuò)誤的,因?yàn)闀暇褪沁@么教的。有經(jīng)驗(yàn)的工程師都知道,對(duì)于Verilog語(yǔ)法,書上是一個(gè)全集,很多用法作為知識(shí)點(diǎn)是對(duì)的,但在實(shí)際應(yīng)用中就是錯(cuò)誤的。因此,太依賴書本的學(xué)習(xí),反而會(huì)學(xué)得全而不好,還浪費(fèi)時(shí)間。學(xué)員二:一開學(xué)我立馬就買了當(dāng)時(shí)很多人推薦的某一品牌的一款開發(fā)板,但卻不知道怎么學(xué),上來(lái)就死摳代碼,感覺(jué)好費(fèi)勁啊!一方面我當(dāng)時(shí)的基礎(chǔ)確實(shí)很差,本科時(shí)候就沒(méi)寫過(guò)任何代碼;另一方面看別人寫的代碼本來(lái)就費(fèi)解,而賣家的視頻也是蜻蜓點(diǎn)水一帶而過(guò),視頻上提到的問(wèn)題不是我的問(wèn)題,我想解決的問(wèn)題視頻中又沒(méi)說(shuō),反正我的困惑與賣家的視頻就不在一個(gè)頻道上,可能我的問(wèn)題人家壓根兒就覺(jué)得不是問(wèn)題,因?yàn)槲耶?dāng)時(shí)就是不折不扣的零基礎(chǔ)。就這樣,我混混沌沌地看了好多天代碼,最終還是云里霧里。當(dāng)時(shí)有人跟我講過(guò)要去仿真看波形,而不是看代碼,但是裝什么軟件,怎么裝,軟件怎么用,我一點(diǎn)都不知道。確實(shí)蠻痛苦的。以上兩位同學(xué)遇到的問(wèn)題,相信大多數(shù)初學(xué)者也遇到過(guò),也很受困擾。明德?lián)P在培訓(xùn)學(xué)員的過(guò)程中發(fā)現(xiàn)了一個(gè)普遍存在的問(wèn)題:不同的人,代碼風(fēng)格往往也是不一樣的。而一套優(yōu)秀的代碼規(guī)范,對(duì)團(tuán)隊(duì)、企業(yè)有非常強(qiáng)的指導(dǎo)意義,可以給他人提供一個(gè)可讀性強(qiáng)、便于維護(hù)糾錯(cuò)的環(huán)境,這可以大大提高團(tuán)隊(duì)、企業(yè)的工作效率。而市面上大多數(shù)FPGA教材往往并不重視代碼規(guī)范,大篇幅的軟件使用、語(yǔ)法知識(shí)和大量理論知識(shí)令初學(xué)者望而生畏,其實(shí)很多語(yǔ)法在實(shí)際工程中并沒(méi)有機(jī)會(huì)用到。另外,很多FPGA書籍都會(huì)講一個(gè)個(gè)獨(dú)立的項(xiàng)目如何實(shí)現(xiàn),以及針對(duì)不同項(xiàng)目的相應(yīng)設(shè)計(jì)思路,但卻缺少一套通用的設(shè)計(jì)方法,這樣同學(xué)們最多只能學(xué)一個(gè)項(xiàng)目會(huì)一個(gè)項(xiàng)目,而不能舉一反三。也正是因?yàn)槿绱?才有這本書創(chuàng)作的初衷。為了幫助更多的FPGA學(xué)習(xí)者更好地理解FPGA設(shè)計(jì)的精髓,提高學(xué)習(xí)效率,明德?lián)P提出了至簡(jiǎn)的設(shè)計(jì)思想,并創(chuàng)作了這本書。大道至簡(jiǎn)與至簡(jiǎn)設(shè)計(jì)法大道至簡(jiǎn)出自老子的《道德經(jīng)》:萬(wàn)物之始,大道至簡(jiǎn),衍化至繁。大道至簡(jiǎn)是指大道理(基本原理、方法和規(guī)律)是極其簡(jiǎn)單的,簡(jiǎn)單到一兩句話就能說(shuō)明白,把復(fù)雜冗繁的表象層層剝離之后就是事物最本質(zhì)的東西。所謂真?zhèn)饕痪湓?假傳萬(wàn)卷書。一門技術(shù)一門學(xué)問(wèn),弄得很深?yuàn)W是因?yàn)闆](méi)有看穿實(shí)質(zhì),就像FPGA的學(xué)習(xí),搞得很復(fù)雜是因?yàn)闆](méi)有抓住代碼的關(guān)鍵。1.大道至簡(jiǎn),抓住根本大道理是極其簡(jiǎn)單的,簡(jiǎn)單到一兩句話就能說(shuō)明白。事情難就難在簡(jiǎn)單,簡(jiǎn)單不是敷衍了事,也不是單純幼稚,而是最高級(jí)的智慧和成熟睿智的表現(xiàn)。
至簡(jiǎn)設(shè)計(jì)法是明德?lián)P通過(guò)多年的教學(xué)經(jīng)驗(yàn)找到的學(xué)習(xí)FPGA的關(guān)鍵和根本方法。FPGA學(xué)習(xí)既不能花大量時(shí)間在軟件工具/語(yǔ)法上,也不能花精力在獨(dú)立的知識(shí)點(diǎn)上,而應(yīng)花費(fèi)80%的時(shí)間在20%的核心功能上。什么是核心功能?至簡(jiǎn)設(shè)計(jì)中一個(gè)完整的設(shè)計(jì)流程就是核心功能。注意,這里說(shuō)的是設(shè)計(jì)流程,而非項(xiàng)目流程。市面上的FPGA設(shè)計(jì)教程大部分講的都是項(xiàng)目流程,即介紹功能新建項(xiàng)目加入設(shè)計(jì)文件編譯工程配置引腳上板。這些流程都是介紹軟件是怎么用的,而最重要的設(shè)計(jì)文件是如何設(shè)計(jì)的,都沒(méi)有詳細(xì)介紹。至簡(jiǎn)設(shè)計(jì)法的設(shè)計(jì)流程,講的是實(shí)現(xiàn)一個(gè)功能的過(guò)程,是將功能轉(zhuǎn)化成代碼的過(guò)程。不僅簡(jiǎn)單的UART/SPI/VAG/IIC/攝像頭采集,甚至復(fù)雜的邊緣檢測(cè)/SDRAM接口/軟件無(wú)線電等,都可以采用這個(gè)設(shè)計(jì)流程將功能轉(zhuǎn)化成代碼。2.大道至簡(jiǎn),衍化至繁大道至簡(jiǎn)是一種哲學(xué),無(wú)論是做人還是做事它都會(huì)給人以指導(dǎo)。在當(dāng)今這個(gè)大千世界中,我們要學(xué)會(huì)把復(fù)雜變成簡(jiǎn)單,用智慧創(chuàng)造簡(jiǎn)單,在變遷中不斷地升華。至簡(jiǎn)設(shè)計(jì)法是先將復(fù)雜的模塊劃分成簡(jiǎn)單的模塊,再用模塊設(shè)計(jì)流程設(shè)計(jì)出來(lái)。FPGA學(xué)習(xí)的過(guò)程,就是不斷地將復(fù)雜的模塊,劃分成簡(jiǎn)單模塊,再用至簡(jiǎn)設(shè)計(jì)法設(shè)計(jì)的過(guò)程。不斷地重復(fù)這個(gè)過(guò)程,像搭積木一樣一層層地堆砌,最終就能通過(guò)簡(jiǎn)單的規(guī)則做出復(fù)雜的設(shè)計(jì)。3.大道至簡(jiǎn),凝聚智慧大道至簡(jiǎn),經(jīng)過(guò)整合創(chuàng)新,跳出原來(lái)的框框,去粗取精,抓住關(guān)鍵和根本,揮動(dòng)奧卡姆剃刀,剔除無(wú)效的、可有可無(wú)的、非本質(zhì)的東西,提煉出精華。至簡(jiǎn)設(shè)計(jì)法,看似簡(jiǎn)單的幾個(gè)規(guī)則,然而總結(jié)歸納出這些規(guī)則,卻需要相當(dāng)大的智慧:必須要有眾多領(lǐng)域的項(xiàng)目經(jīng)驗(yàn),才能獲知各領(lǐng)域的設(shè)計(jì)需求和要點(diǎn);必須要有豐富的工作經(jīng)驗(yàn),才能擁有高超的設(shè)計(jì)技巧;必須要有豐富的教學(xué)經(jīng)驗(yàn),明白學(xué)習(xí)的難點(diǎn)和重點(diǎn),明白學(xué)生思考的方式,才能將高超的設(shè)計(jì)技巧轉(zhuǎn)成可學(xué)習(xí)和操作的流程;必須要有很大的智慧,不斷地歸納和總結(jié),才能將這些流程和步驟變得簡(jiǎn)單易用。至簡(jiǎn)設(shè)計(jì)法,是結(jié)合以上要點(diǎn),經(jīng)過(guò)明德?lián)P多年探索的智慧結(jié)晶。在此,我希望與更多FPGA學(xué)習(xí)者分享,讓更多的人應(yīng)用此設(shè)計(jì)方法,在FPGA設(shè)計(jì)學(xué)習(xí)和做實(shí)際項(xiàng)目中得心應(yīng)手,為推進(jìn)國(guó)家產(chǎn)業(yè)智能化發(fā)展貢獻(xiàn)綿薄之力。
本書共8章,分為三篇,其中每篇對(duì)應(yīng)的章和具體內(nèi)容介紹如下:第一篇包括第1~4章,主要介紹FPGA設(shè)計(jì)核心模塊。本書提出把模塊分為三大類型,即計(jì)數(shù)器架構(gòu)、狀態(tài)機(jī)架構(gòu)及FIFO架構(gòu),并配有項(xiàng)目設(shè)計(jì)練習(xí)。第二篇包括第5、6章,主要介紹模塊的由來(lái)模塊劃分。本書總結(jié)了兩大類常見的模塊劃分應(yīng)用場(chǎng)合,即FPGA內(nèi)部模塊之間的交互和FPGA與外設(shè)的交互,并配有實(shí)踐練習(xí)。第三篇包括第7、8章,主要介紹基于OV7670的圖像采集,以及基于SDRAM的VGA顯示控制器。應(yīng)用前兩篇提到的三大架構(gòu)及模塊劃分來(lái)完成這個(gè)工程,進(jìn)一步深化對(duì)前面內(nèi)容的理解。本書特點(diǎn)1.注重設(shè)計(jì)思路本書重點(diǎn)講項(xiàng)目實(shí)現(xiàn)的整體思路,而并非講某一具體項(xiàng)目的實(shí)現(xiàn)。2.設(shè)計(jì)理念本書提出了至簡(jiǎn)的設(shè)計(jì)理念,一次只考慮一個(gè)問(wèn)題。3.優(yōu)秀的代碼風(fēng)格及規(guī)范本書提供的代碼風(fēng)格統(tǒng)一,代碼的規(guī)范是資深從業(yè)人員從多年工作經(jīng)驗(yàn)中總結(jié)、提練,并結(jié)合明德?lián)P就業(yè)培訓(xùn)班培訓(xùn)成果所得到的。優(yōu)秀的代碼風(fēng)格對(duì)團(tuán)隊(duì)、企業(yè)都有非常大的指導(dǎo)意義。
4.注重實(shí)踐本書選擇以案例的形式進(jìn)行編寫,所有方法均用例子闡述,并配有豐富的項(xiàng)目實(shí)踐練習(xí)。5.不羅列知識(shí)點(diǎn)堅(jiān)持項(xiàng)目中遇到什么問(wèn)題就解決(講解)什么問(wèn)題,避免羅列知識(shí)點(diǎn),讓FPGA學(xué)習(xí)者集中精力學(xué)習(xí)FPGA設(shè)計(jì)的核心。如何學(xué)習(xí)本書至簡(jiǎn)設(shè)計(jì)法的目的,是對(duì)程序編寫工作中易出現(xiàn)的混亂狀態(tài)進(jìn)行規(guī)范化,以達(dá)到簡(jiǎn)便、有序、快捷的效果。本書通過(guò)例題引出概念,并詳舉大量實(shí)際案例進(jìn)行分析、對(duì)比,幫助讀者理解至簡(jiǎn)設(shè)計(jì)法的設(shè)計(jì)思想,清晰直觀地學(xué)習(xí)和掌握該方法。此外,作者對(duì)于二八定律在FPGA設(shè)計(jì)方面的應(yīng)用有獨(dú)到見解:采取權(quán)值階梯模式,即強(qiáng)調(diào)核心功能的學(xué)習(xí)、鞏固和使用,以及一般功能在實(shí)際中邊做邊學(xué)的模式,來(lái)達(dá)到在最短的時(shí)間能獨(dú)立完成項(xiàng)目的效果。另外,希望讀者在完成項(xiàng)目時(shí),先根據(jù)功能要求自己試著構(gòu)思、編寫代碼,再與給出的思路、代碼相比較,這樣讀者才能深刻理解至簡(jiǎn)設(shè)計(jì)法,并把這套設(shè)計(jì)思想真正運(yùn)用到實(shí)踐中去。從明德?lián)P就業(yè)培訓(xùn)班的培訓(xùn)成果來(lái)看,只要耐心學(xué)完整套設(shè)計(jì)思想,就能獨(dú)立完成項(xiàng)目設(shè)計(jì)。設(shè)計(jì)者拿到一個(gè)新項(xiàng)目,知道從哪里下手,且編寫的代碼可綜合,邏輯縝密,在設(shè)計(jì)過(guò)程中對(duì)邏輯變化考慮周全,就可在短時(shí)間內(nèi)調(diào)試成功并上板實(shí)現(xiàn)。本書雖然沒(méi)有語(yǔ)法篇,但通篇用到的語(yǔ)法都是比較簡(jiǎn)單、常用的,有一定Verilog基礎(chǔ)的讀者讀起來(lái)必定毫無(wú)障礙,而初學(xué)者也不必?fù)?dān)心看不懂,明德?lián)P會(huì)推出配套視頻,介紹用到的語(yǔ)法知識(shí)點(diǎn)。另外,軟件使用篇也包括在配套視頻中,主要包括QuartusII,Modelsim,Gvim的使用。本書可作為高等院校電子工程類、自動(dòng)控制類、計(jì)算機(jī)類等專業(yè)的教材,亦可供FPGA相關(guān)行業(yè)的愛好者和從業(yè)人員自學(xué)與參考。感謝參與本書部分內(nèi)容編寫及在編寫過(guò)程中提供寶貴建議的黃君凱、崔苗、李國(guó)慶和陳澤熹。還要感謝北京航空航天大學(xué)出版社的編輯老師們,在他們的大力支持和幫助下本書才得以與廣大讀者見面。由于作者水平有限,難免存在錯(cuò)誤和遺漏之處,懇請(qǐng)各位讀者批評(píng)指正。同時(shí),也歡迎大家就FPGA開發(fā)相關(guān)技術(shù)與作者交流,聯(lián)系郵箱:book@mdyedu.com。配套視頻、開發(fā)板購(gòu)買地址以及例程源碼和相關(guān)資料下載地址:http://www.mdyedu.com/。潘文明易文兵2016年12月于深圳明德?lián)P科技教育有限公司