本書使用Altera公司的Cyclone Ⅳ FPGA器件,由淺入深地引領(lǐng)讀者從板級設(shè)計(jì)、基礎(chǔ)入門實(shí)例、FPG內(nèi)資源應(yīng)用實(shí)例和綜合進(jìn)階實(shí)例等方面,玩轉(zhuǎn)FPGA邏輯設(shè)計(jì)。本書基于特定的FPGA實(shí)驗(yàn)平臺,既有足夠的理論知識深度作支撐,也有豐富的例程供實(shí)踐學(xué)習(xí),并且穿插了筆者在多年FPGA學(xué)習(xí)和開發(fā)過程中所積累的經(jīng)驗(yàn)和技巧。 無論對于希望快速掌握Verilog語言進(jìn)行FPGA開發(fā)的初學(xué)者,還是希望快速掌握基于Altera Cyclone Ⅳ FPGA進(jìn)行開發(fā)的設(shè)計(jì)者,本書都是很好的選擇。
(1)本書由《深入淺出玩轉(zhuǎn)FPGA》一書的作者吳厚航(網(wǎng)名:特權(quán)同學(xué))傾心打造。(2)供FPGA板級設(shè)計(jì)說明、工具安裝說明、入門實(shí)例、片內(nèi)資源應(yīng)用實(shí)例和綜合實(shí)例,由淺入深地掌握FPGA的開發(fā)設(shè)計(jì)。(3)使用Altera公司的Cyclone Ⅳ FPGA器件既有足夠的理論知識深度作支撐,也有豐富的例程進(jìn)行實(shí)踐學(xué)習(xí),并且穿插著筆者多年FPGA學(xué)習(xí)和開發(fā)過程中的各種經(jīng)驗(yàn)和技巧。
作者簡介吳厚航[網(wǎng)名:特權(quán)同學(xué)] 有近10年的FPGA工程實(shí)踐經(jīng)歷,擅長記錄、分析并總結(jié)FPGA開發(fā)中的經(jīng)驗(yàn)與技巧,也非常樂于分享。活躍于各大電子技術(shù)網(wǎng)站的FPGA社區(qū)或版塊,多年來筆耕不輟、風(fēng)雨無阻,不斷地發(fā)表FPGA相關(guān)文章,其總點(diǎn)擊量超過300萬。著有多本FPGA技術(shù)相關(guān)圖書,其詼諧的文字、貼近讀者實(shí)際需求的知識點(diǎn)與經(jīng)驗(yàn)技巧分享,贏得了廣大讀者的一致認(rèn)可。
目錄
Contents
第1章FPGA開發(fā)入門
1.1FPGA基礎(chǔ)入門
1.2FPGA的優(yōu)勢在哪里
1.3FPGA應(yīng)用領(lǐng)域
1.4FPGA開發(fā)流程
第2章實(shí)驗(yàn)平臺“勇敢的芯”板級電路詳解
2.1板級電路整體架構(gòu)
2.2電源電路
2.3復(fù)位與時(shí)鐘電路
2.3.1關(guān)于FPGA器件的時(shí)鐘
2.3.2關(guān)于FPGA器件的復(fù)位
2.3.3實(shí)驗(yàn)平臺電路解析
2.4FPGA下載配置電路
2.5SRAM接口電路
2.6ADC/DAC芯片電路
2.7UART接口電路
2.8RTC接口電路
2.94×4矩陣按鍵電路
2.10VGA顯示接口電路
2.11蜂鳴器、流水燈、數(shù)碼管、撥碼開關(guān)電路
2.12超聲波接口、外擴(kuò)LCD接口電路
第3章邏輯設(shè)計(jì)基
3.10和1——精彩世界由此開始
3.2表面現(xiàn)象揭秘——邏輯關(guān)系
3.3內(nèi)里本質(zhì)探索——器件結(jié)構(gòu)
第4章軟件安裝與配置
4.1軟件下載和license申請
4.2Quartus Ⅱ與ModelSimAltera的安裝
4.3文本編輯器Notepad 安裝
4.4QuartusⅡ中使用Notepad 的關(guān)聯(lián)設(shè)置
4.5USBBlaster的驅(qū)動安裝
4.5.1Windows XP系統(tǒng)USBBlaster安裝
4.5.2在Windows 7系統(tǒng)安裝USBBlaster
4.5.3在Windows 8系統(tǒng)安裝USBBlaster
4.6串口芯片驅(qū)動安裝
4.6.1驅(qū)動安裝
4.6.2設(shè)備識別
第5章Verilog語法概述
5.1語法學(xué)習(xí)的經(jīng)驗(yàn)之談
5.2可綜合的語法子集
5.3代碼風(fēng)格與書寫規(guī)范
勇敢的芯伴你玩轉(zhuǎn)Altera FPGA
第6章基于仿真的及時(shí)個(gè)工程實(shí)例
6.1新建工程
6.2Verilog源碼文件創(chuàng)建與編輯
6.2.1Verilog源碼文件創(chuàng)建
6.2.2Verilog源碼文件編輯
6.3Verilog語法檢查
6.4ModelSim仿真驗(yàn)證
6.4.1Quartus Ⅱ基本設(shè)置
6.4.2測試腳本創(chuàng)建與編輯
6.4.3測試腳本關(guān)聯(lián)設(shè)置
6.4.4調(diào)用ModelSim仿真
第7章基于板級調(diào)試的第二個(gè)工程實(shí)例
7.1PWM蜂鳴器驅(qū)動——功能概述
7.2PWM蜂鳴器驅(qū)動——引腳分配
7.3PWM蜂鳴器驅(qū)動——綜合、映射與配置文件產(chǎn)生
7.4Altera FPGA配置方式
7.4.1概述
7.4.2配置方式
7.5PWM蜂鳴器驅(qū)動——FPGA在線下載配置
7.6PWM蜂鳴器驅(qū)動——FPGA配置芯片固化
7.7PWM蜂鳴器驅(qū)動——復(fù)位與FPGA重配置功能
第8章基礎(chǔ)入門實(shí)例
8.1蜂鳴器開關(guān)實(shí)例
8.1.1功能簡介
8.1.2代碼解析
8.1.3打開工程
8.1.4下載配置操作
8.2流水燈實(shí)例
8.2.1功能簡介
8.2.2代碼解析
8.2.3下載配置
8.338譯碼器實(shí)例
8.3.1功能簡介
8.3.2代碼解析
8.3.3板級調(diào)試
8.4按鍵消抖與LED開關(guān)實(shí)例
8.4.1按鍵消抖原理
8.4.2功能簡介
8.4.3代碼解析
8.4.5板級調(diào)試
8.5經(jīng)典模式流水燈實(shí)例
8.5.1功能簡介
8.5.2代碼解析
8.5.3板級調(diào)試
8.6基于PLL分頻計(jì)數(shù)的LED閃爍實(shí)例
8.6.1PLL概述
8.6.2功能簡介
8.6.3新建IP核文件
8.6.4PLL配置
8.6.5模塊化設(shè)計(jì)概述
8.6.6模塊化設(shè)計(jì)實(shí)踐
8.6.7代碼解析
8.6.8板級調(diào)試
8.7數(shù)碼管驅(qū)動實(shí)例
8.7.1數(shù)碼管驅(qū)動原理
8.7.2功能概述
8.7.3代碼解析
8.7.4板級調(diào)試
8.8SRAM讀寫測試實(shí)例
8.8.1SRAM讀寫時(shí)序解讀
8.8.2功能簡介
8.8.3代碼解析
8.8.4仿真設(shè)置
8.8.5功能仿真
8.8.6FPGA在線配置
8.8.7觸發(fā)采樣波形
8.9UART loopback測試
8.9.1功能概述
8.9.2代碼解析
8.9.3板級調(diào)試
8.10VGA驅(qū)動ColorBar顯示實(shí)例
8.10.1VGA概述
8.10.2功能簡介
8.10.3代碼解析
8.10.4板級調(diào)試
8.11LCD基本驅(qū)動實(shí)例
8.11.1LCD驅(qū)動時(shí)序
8.11.2功能簡介
8.11.3代碼解析
8.11.4裝配
8.11.5板級調(diào)試
8.12LCD字符顯示驅(qū)動實(shí)例
8.12.1字符取模
8.12.2ROM初始化文檔創(chuàng)建
8.12.3新建源文件
8.12.4ROM配置
8.12.5功能簡介
8.12.6代碼解析
8.12.7板級調(diào)試
8.13矩陣按鍵掃描檢測實(shí)例
8.13.1鍵盤概述
8.13.2矩陣按鍵工作原理
8.13.3功能概述
8.13.4代碼解析
8.13.5RTL Viewer
8.13.6State Machine Viewer
8.13.7Technology Map Viewer
8.13.8板級調(diào)試
第9章FPG內(nèi)資源應(yīng)用實(shí)例
9.1基于SignalTap Ⅱ的超聲波測距調(diào)試實(shí)例
9.1.1超聲波測距原理
9.1.2功能簡介
9.1.3代碼解析
9.1.4硬件裝配
9.1.5SignalTap Ⅱ源文件創(chuàng)建
9.1.6SignalTap Ⅱ配置
9.1.7SignalTap Ⅱ調(diào)試
9.2FPG內(nèi)ROM實(shí)例
9.2.1功能概述
9.2.2代碼解析
9.2.3ROM初始化文檔創(chuàng)建
9.2.4新建IP核源文件
9.2.5ROM配置
9.2.6功能仿真
9.2.7FPGA在線調(diào)試
9.3FPG內(nèi)RAM實(shí)例
9.3.1功能概述
9.3.2代碼解析
9.3.3新建IP核源文件
9.3.4RAM配置
9.3.5功能仿真
9.3.6FPGA在線調(diào)試
9.4FPG內(nèi)FIFO實(shí)例
9.4.1功能概述
9.4.2代碼解析
9.4.3新建IP核源文件
9.4.4FIFO配置
9.4.5功能仿真
9.4.6FPGA在線調(diào)試
9.5FPG內(nèi)異步FIFO實(shí)例
9.5.1功能概述
9.5.2代碼解析
9.5.3新建IP核源文件
9.5.4FIFO配置
9.5.5功能仿真
9.5.6FPGA在線調(diào)試
9.6FPG內(nèi)ROM、FIFO、RAM聯(lián)合實(shí)例
9.6.1功能概述
9.6.2代碼解析
9.6.3功能仿真
9.6.4FPGA在線調(diào)試
第10章綜合進(jìn)階實(shí)例
10.1基于數(shù)碼管顯示的超聲波測距回響脈寬計(jì)數(shù)實(shí)例
10.1.1功能簡介
10.1.2代碼解析
10.1.3板級調(diào)試
10.2基于均值濾波處理的超聲波測距回響脈寬計(jì)數(shù)實(shí)例
10.2.1功能簡介
10.2.2濾波算法與實(shí)現(xiàn)
10.2.3代碼解析
10.2.4板級調(diào)試
10.3基于進(jìn)制換算的超聲波測距結(jié)果顯示實(shí)例
10.3.1功能簡介
10.3.2距離計(jì)算公式實(shí)現(xiàn)
10.3.3進(jìn)制換算實(shí)現(xiàn)
10.3.4代碼解析
10.3.5乘法器IP核創(chuàng)建、配置與例化
10.3.6除法器IP核創(chuàng)建、配置與例化
10.3.7板級調(diào)試
10.4倒車?yán)走_(dá)實(shí)例
10.4.1應(yīng)用背景
10.4.2功能簡介
10.4.3代碼解析
10.4.4板級調(diào)試
10.5基于SRAM批量讀寫的UART bulk測試實(shí)例
10.5.1功能概述
10.5.2代碼解析
10.5.3板級調(diào)試
10.6基于數(shù)碼管顯示的RTC讀取實(shí)例
10.6.1RTC芯片解析
10.6.2功能簡介
10.6.3代碼解析
10.6.4板級調(diào)試
10.7基于UART發(fā)送的RTC讀取實(shí)例
10.7.1功能簡介
10.7.2代碼解析
10.7.3板級調(diào)試
10.8基于UART收發(fā)的RTC讀寫實(shí)例
10.8.1功能簡介
10.8.2代碼解析
10.8.3板級調(diào)試
10.9基于UART控制的VGA多模式顯示實(shí)例
10.9.1功能簡介
10.9.2代碼解析
10.9.3板級調(diào)試
10.10基于LED顯示的D/A輸出驅(qū)動實(shí)例
10.10.1D/A芯片概述
10.10.2功能簡介
10.10.3代碼解析
10.10.4板級調(diào)試
10.11基于按鍵調(diào)整和數(shù)碼管顯示的D/A輸出實(shí)例
10.11.1功能簡介
10.11.2代碼解析
10.11.3板級調(diào)試
10.12波形發(fā)生器實(shí)例
10.12.1功能簡介
10.12.2代碼解析
10.12.3IP核CORDIC配置與例化
10.12.4板級調(diào)試
10.13基于數(shù)碼管顯示的A/D采集實(shí)例
10.13.1A/D芯片接口概述
10.13.2功能簡介
10.13.3代碼解析
10.13.4板級調(diào)試
10.14A/D和D/A聯(lián)合測試實(shí)例
10.14.1功能簡介
10.14.2代碼解析
10.14.3板級調(diào)試
10.15RTC時(shí)間的LCD顯示和UART設(shè)置實(shí)例
10.15.1功能簡介
10.15.2代碼解析
10.15.3板級調(diào)試
參考文獻(xiàn)
第5章Verilog語法概述
本章導(dǎo)讀本章介紹學(xué)習(xí)Verilog語言的一些經(jīng)驗(yàn)和Verilog語言可綜合的基本語法,以及常見邏輯功能的代碼風(fēng)格與書寫規(guī)范。5.1語法學(xué)習(xí)的經(jīng)驗(yàn)之談FPGA器件的設(shè)計(jì)輸入有多種方式,如繪制原理圖、編寫代碼或是調(diào)用IP核。早期的工程師對原理圖的設(shè)計(jì)方式情有獨(dú)鐘,這種輸入方式應(yīng)付簡單的邏輯電路還湊合,應(yīng)該算得上簡單實(shí)用,但隨著邏輯規(guī)模的不斷攀升,這種落后的設(shè)計(jì)方式已顯得力不從心。取而代之的是代碼輸入的方式,今天的絕大多數(shù)設(shè)計(jì)都是采用代碼來完成的。FPGA開發(fā)所使用的代碼,通常稱為硬件描述語言(Hardware Description Language),目前最主流的是VHDL和Verilog。VHDL發(fā)展較早,語法嚴(yán)謹(jǐn); Verilog類似C語言,語法風(fēng)格比較自由。IP核調(diào)用通常也是基于代碼設(shè)計(jì)輸入的基礎(chǔ)之上,現(xiàn)在很多EDA工具的供應(yīng)商都在打FPGA的如意算盤,F(xiàn)PGA的設(shè)計(jì)也在朝著軟件化、平臺化的方向發(fā)展。也許在不久的將來,越來越多的工程只需要設(shè)計(jì)者從一個(gè)類似蘋果商店的IP核庫中索取組件進(jìn)行配置,像搭積木一樣完成一個(gè)項(xiàng)目,或者整個(gè)設(shè)計(jì)都不需要見到一句代碼。當(dāng)然,未來什么情況都有可能發(fā)生,但是底層的代碼邏輯編寫方式無論如何還是有其生存空間的,畢竟一個(gè)個(gè)IP核組件都是從代碼開始的,所以對于初入這個(gè)行業(yè)的新手而言,掌握基本代碼設(shè)計(jì)的技能是必需的。
這里不過多談?wù)揤HDL和Verilog語言孰優(yōu)孰劣,總之這兩種語言是當(dāng)前業(yè)內(nèi)絕大多數(shù)開發(fā)設(shè)計(jì)者所使用的語言,從二者對電路的描述和實(shí)現(xiàn)上看,有許多相通之處。無論是VHDL還是Verilog,建議初學(xué)者先掌握其中一門,至于到底先下手哪一門,則需要讀者根據(jù)自身的情況做考量。對于沒有什么外部情況限制的朋友,若之前有一定的C語言基礎(chǔ),不妨先學(xué)Verilog,這有助于加快對語法本身的理解。在將其中一門語言學(xué)精、用熟之后,好也能夠著手掌握另一門語言。雖然在單個(gè)項(xiàng)目中,很少需要“雙語齊下”,但在實(shí)際工作中,還是很有可能需要去接觸另一門語法所寫的工程。網(wǎng)絡(luò)上有很多很好的開源實(shí)例,若只會Verilog,而參考實(shí)例卻是VHDL的,那么就很尷尬了; 忽然有24小時(shí)A同事離職,老板把他寫了一半的Verilog工程扔給只會VHDL的你來維護(hù),那可就被動難堪了……所以,對于VHDL和Verilog的取舍問題,建議先學(xué)精一門,也別忘了兼顧另一門,無論哪一種語言,至少需要具備看懂別人設(shè)計(jì)的基本能力。
HDL雖然和軟件語言有許多相似之處,但由于其實(shí)現(xiàn)對象是硬件電路,所以它們之間的設(shè)計(jì)思維存在較大差異。尤其是那些做過軟件編程的朋友,很喜歡用軟件的順序思維來駕驅(qū)HDL,豈不知HDL實(shí)現(xiàn)的硬件電路大都是并行處理的。也許就是這個(gè)大彎轉(zhuǎn)不過來,所以很多朋友在研究HDL所實(shí)現(xiàn)的功能時(shí)常常百思不得其解。對于初學(xué)者,尤其是軟件轉(zhuǎn)行過來的初學(xué)者,筆者的建議是不要拋開實(shí)際電路而研究語法,在一段代碼過后,多花些精力對比實(shí)際邏輯電路,必要時(shí)做一下仿真,好能再找一些直觀的外設(shè)在實(shí)驗(yàn)板上看看結(jié)果。長此以往,若能達(dá)到代碼和電路都心中有數(shù),那才證明是真真正正掌握HDL的精髓了。HDL的語法條目雖多,但并非所有的HDL語法都能夠?qū)崿F(xiàn)最終的硬件電路。由此進(jìn)行劃分,可實(shí)現(xiàn)為硬件電路的語法常稱為可綜合的語法; 而不能夠?qū)崿F(xiàn)到硬件電路中,卻常常可作為仿真驗(yàn)證的高層次語法則稱為行為級語法。很多朋友在初學(xué)語法時(shí),抱著一本語法書暈頭轉(zhuǎn)向地看,實(shí)戰(zhàn)的時(shí)候卻常常碰到這種語法不能用、那種語法不支持的報(bào)錯(cuò)信息,從而更加抱怨HDL不是好東西,學(xué)起來真困難。其實(shí)不然,可綜合的語法是一個(gè)很小的子集,對于初學(xué)者,建議先重點(diǎn)掌握好這個(gè)子集,實(shí)際設(shè)計(jì)中或許靠著十來?xiàng)l基本語法就可以打天下了。怎么樣?HDL一下變簡單了吧。這么說一點(diǎn)也不夸張,本書的重點(diǎn)就是要通過各種可實(shí)現(xiàn)到板級的例程讓讀者快速地掌握如何使用可綜合的語法子集完成一個(gè)設(shè)計(jì)。5.2節(jié)中會將常用的可綜合語法子集逐一羅列并簡單介紹。對于已入門的讀者,也不是說掌握了可綜合的語法子集就“萬事大吉”了。
行為級語法也非一無是處,都說“存在即是合理”,行為級語法也大有用處。一個(gè)稍微復(fù)雜的設(shè)計(jì),若是在板級調(diào)試前不經(jīng)過幾次三番的仿真測試,一次性成功的概率幾乎為零。而仿真驗(yàn)證也有自己的一套高效便捷的語法,如果再像底層硬件電路一樣搭仿真平臺,恐怕就太浪費(fèi)時(shí)間了。行為級語法最終的實(shí)現(xiàn)對象不是FPGA器件,而是手中的計(jì)算機(jī),動輒上G甚至雙核、四核的CPU可不愿做“老牛拉破車”的活,所以行為級語法幫助設(shè)計(jì)者在仿真過程中利用好手中的資源,能夠快速、高效地完成設(shè)計(jì)的初期驗(yàn)證平臺搭建。因此,掌握行為級語法,可以服務(wù)于設(shè)計(jì)的仿真驗(yàn)證階段的工作。
對于HDL的學(xué)習(xí),筆者根據(jù)自身的經(jīng)驗(yàn),提幾點(diǎn)建議。首先,手中需要準(zhǔn)備一本比較完整的語法書籍。這類書市場上已經(jīng)是滿天飛了,內(nèi)容相差無幾,初學(xué)者好能在開始FPGA的學(xué)習(xí)前花一些時(shí)間認(rèn)真地看過一遍語法,盡可能地理解每條語法的基本功能和用法。當(dāng)然,只需要認(rèn)真看過、理解過,做到相關(guān)語法心中有數(shù)就行,這也不是為了應(yīng)付考試,也沒必要去“死記硬背”任何東西。語法的理論學(xué)習(xí)是必需的,能夠?yàn)楹竺娴膶?shí)踐打下堅(jiān)實(shí)的基礎(chǔ)。有些實(shí)在不好理解的語法,也不要強(qiáng)求,今后在實(shí)例中遇到類似語法的參考用法時(shí)再掌握也不遲。其次,參考一些簡單的例程,并且自己動手寫代碼實(shí)現(xiàn)相同或相近的電路功能。這個(gè)過程中,可能需要結(jié)合實(shí)際的FPGA開發(fā)工具和入門級學(xué)習(xí)套件。FPGA的開發(fā)工具前面章節(jié)已經(jīng)有所介紹,主要是掌握Quartus Ⅱ(Altera公司的器件使用)或ISE(Xilinx公司的器件使用)的使用,學(xué)會使用這些工具新建一個(gè)工程、編寫代碼、分配引腳、進(jìn)行編譯、下載配置文件到目標(biāo)電路板中。入門級的學(xué)習(xí)套件,簡單地說,就是一塊板載FPGA器件的電路板。這塊電路板不需要有很多高級的外設(shè),一些簡單的常見外設(shè)即可(如蜂鳴器、流水燈、數(shù)碼管、UART、IIC等)。通過開發(fā)工具可以進(jìn)行工程的建立和管理; 而通過學(xué)習(xí)套件,就可以直觀地驗(yàn)證工程是否實(shí)現(xiàn)了既定的功能。在實(shí)踐的過程中,一定要注意自己的代碼風(fēng)格,當(dāng)然,這在很大程度上取決于參考例程的代碼風(fēng)格。至于什么樣的學(xué)習(xí)套件配套的參考例程是規(guī)范的,倒也沒有定論,建議在選擇口碑較好的學(xué)習(xí)套件的同時(shí),推薦讀者多去讀讀FPGA原廠Altera(qts_qii5v1.pdf)或Xilinx(xst.pdf)公司的官方文檔,在它們的一些文檔手冊中有各種常見電路的實(shí)現(xiàn)代碼風(fēng)格和參考實(shí)例。在練習(xí)的過程中,也要學(xué)會使用開發(fā)工具生成的各種視圖,尤其是RTL視圖。RTL視圖是用戶輸入代碼進(jìn)行綜合后的邏輯功能視圖。這個(gè)視圖很好地將用戶的代碼用邏輯門的方式詮釋出來,初學(xué)者可以通過查看RTL視圖的方式來看看自己編寫的代碼所能實(shí)現(xiàn)的邏輯電路,以加深對語法的理解; 反之,也可以通過RTL視圖來檢驗(yàn)當(dāng)前所寫的代碼是否實(shí)現(xiàn)了期望的功能。