本書由至芯科技在各大高校的授課內(nèi)容整理而來,是為初學者量身定制的FPGA入門教材,從基礎(chǔ)的軟件安裝、工具使用、語法解釋、設(shè)計方法、常用IP,到最后的設(shè)計技巧及大量的進階實驗,內(nèi)容環(huán)環(huán)相扣,為讀者建立了一個比較清晰的學習脈絡(luò)。設(shè)計思路及方法為本書重點強調(diào)的內(nèi)容,它作為一條主線貫穿始終,希望讀者學習時注意體會。只有掌握了正確的學習和設(shè)計方法,讀者才可能在數(shù)字邏輯設(shè)計的領(lǐng)域越走越遠。本書沒有收錄過多煩瑣的理論,一切從實戰(zhàn)出發(fā),按照一套相對高效的設(shè)計方法直接切入一個個小的項目,深入淺出。希望以此可以培養(yǎng)廣大讀者的設(shè)計能力,我們不但要知道某個邏輯可以這樣寫,更重要的還必須清楚為什么這樣寫,這樣寫有什么優(yōu)勢或劣勢,還有沒有優(yōu)化空間等。與本書配套的視頻已保存在網(wǎng)絡(luò)云中,讀者可在下載后參考學習。本書內(nèi)容由淺入深,適合廣大可編程邏輯器件的初學者作為入門和進階的教材,也適合作為電子信息、計算機等專業(yè)本科生、研究生,以及具有一定電子專業(yè)知識背景的電子工程師的參考用書。
本書是由至芯科技推出的FPGA基礎(chǔ)入門實驗教程。授課內(nèi)容深入淺出,從最基礎(chǔ)的語法到進階的端口驅(qū)動開發(fā),所有的設(shè)計都緊緊地圍繞著“設(shè)計方法”這樣的一條主線進行。
本書主要由至芯科技工程師王建飛(筆名為夢翼師兄)和雷斌執(zhí)筆完成,內(nèi)容全部取材于至芯科技在各大高校的具體授課內(nèi)容,設(shè)計流程規(guī)范、精練。每個項目都給出了具體的設(shè)計目的、設(shè)計原理、設(shè)計思路、系統(tǒng)架構(gòu)圖、各模塊端口意義注解及具體模塊的代碼等。內(nèi)容詳細,可以有效地幫助初學者快速入門FPGA硬件邏輯設(shè)計。
本書具有以下特點。
(1)教學題材和教學方法全部來自至芯科技在各大高校的實訓內(nèi)容,設(shè)計方法規(guī)范,授課題材實戰(zhàn)價值高。
(2)教學內(nèi)容全部以實戰(zhàn)形式進行,在動手實現(xiàn)實際項目的過程中掌握常用的語法、設(shè)計方法、通用接口及FPGA設(shè)計過程中常用到的設(shè)計技巧。
(3)本書由至芯科技工程師夢翼師兄編寫,在內(nèi)容編寫過程中融入了大量工程實戰(zhàn)經(jīng)驗,各代碼模塊實戰(zhàn)價值高,可移植性強,大部分功能模塊可以直接應(yīng)用于其他設(shè)計,從而有效縮短二次開發(fā)周期。
(4)本書配有夢翼師兄錄制的配套高清教學視頻,手把手教學,幫助讀者提高學習效率。
夢翼師兄根據(jù)多年的項目研發(fā)和教學經(jīng)驗,將項目設(shè)計研發(fā)中需要用到的一些開發(fā)技巧和學習方法通過項目實戰(zhàn)的方式盡可能地體現(xiàn)到每一個實例中。通過本書的學習,讀者不但可以掌握常用的FPGA接口和外設(shè)驅(qū)動方式。更重要的是,通過理解和練習,讀者可以建立起一套完整、規(guī)范的開發(fā)設(shè)計流程和方法,助力之后的公司項目開發(fā)。
另外,讀者可以跟著夢翼師兄錄制的配套教學視頻進行學習,通過視頻,可以看到夢翼師兄如何對一個項目進行構(gòu)思,以及如何進行基礎(chǔ)模塊代碼的編寫。
在此特別感謝黑龍江信息技術(shù)職業(yè)學院劉春玲老師為本書的編寫提出的大量建設(shè)性建議以及對內(nèi)容的編排所做的大量工作。同時,參與編寫本書的還有黑龍江信息技術(shù)職業(yè)學院的李茁老師、安康學院的崔智軍老師以及至芯科技的寇飛強、郝旭帥、陳飛龍三位工程師。非常感謝安康學院崔智軍老師對本書前4章內(nèi)容的編寫。由于編者水平有限和時間限制,書中難免存在不妥之處,敬請廣大讀者予以指正和幫助。
第1章 沒有金剛鉆,不攬瓷器活 1
1.1 Quartus II 15.0――溫婉簡約編譯器 1
1.1.1 寫在前面的話 1
1.1.2 Altera Quartus II 15.0安裝 1
1.2 ModelSim 10.3d――獨具慧眼仿真工 7
1.3 級聯(lián)調(diào)試――標準設(shè)計勢必行 7
第2章 工欲善其事,必先利其器 31
2.1 工程規(guī)范――我的地盤,你說了算 31
2.2 初識流水燈――很傻很天真 31
2.2.1 項目需求 31
2.2.2 相關(guān)技術(shù)介紹 31
2.2.3 硬件設(shè)計 32
2.2.4 頂層架構(gòu)設(shè)計 32
2.2.5 端口描述 33
2.2.6 代碼解釋 33
2.3 測試文件――一切都似曾相識 39
第3章 諄諄教誨莫相忘,字字珠璣記心頭 41
3.1 賦值語句――你是我的最愛 41
3.1.1 寫在前面的話 41
3.1.2 非阻塞賦值語句 41
3.1.3 阻塞賦值語句 43
3.2 關(guān)系運算符――心中永遠的痛 45
3.2.1 寫在前面的話 45
3.2.2 關(guān)系運算符的種類 45
3.2.3 關(guān)系運算符的使用意義 45
3.2.4 關(guān)系運算符與算數(shù)運算符優(yōu)先級 45
3.3 if-else 與 case――永遠的歡喜冤家 45
3.3.1 寫在前面的話 45
3.3.2 if-else 條件分支語句 46
3.3.3 case分支控制語句 50
3.3.4 case語句和if-else語句的區(qū)別 52
3.4 縮減運算符――就這樣變沒了 52
3.4.1 寫在前面的話 52
3.4.2 工程實例 52
3.5 移位運算符――性子總是這么直 54
3.5.1 寫在前面的話 54
3.5.2 移位運算符實例 55
3.6 位拼運算符――聰慧靈秀惹人妒 57
3.6.1 寫在前面的話 57
3.6.2 代碼實例 57
第4章 會當凌絕頂,設(shè)計Top-Down 59
4.1 層次化設(shè)計方法――心中永遠的女神 59
4.1.1 寫在前面的話 59
4.1.2 層次化設(shè)計框圖示例 59
4.1.3 層次化設(shè)計實例 60
4.2 層次化設(shè)計技巧――巧奪天工磚瓦匠 65
4.2.1 寫在前面的話 65
4.2.2 電平觸發(fā) 65
4.2.3 尖峰脈沖 66
第5章 內(nèi)涵豐富本領(lǐng)多,誰與爭鋒IP核 68
5.1 鎖相環(huán)――速度,你說了算 68
5.1.1 寫在前面的話 68
5.1.2 項目需求 68
5.1.3 操作步驟 68
5.1.4 頂層架構(gòu)設(shè)計 73
5.1.5 端口功能 73
5.1.6 代碼解釋 73
5.1.7 仿真結(jié)果分析 75
5.2 ROM――只有你最慷慨 75
5.2.1 寫在前面的話 75
5.2.2 項目需求 75
5.2.3 操作步驟 75
5.2.4 頂層架構(gòu)設(shè)計 80
5.2.5 模塊功能介紹 80
5.2.6 模塊端口和內(nèi)部連線描述 80
5.2.7 代碼解釋 80
5.2.8 仿真分析 83
5.3 RAM――有入有出,公平合理 84
5.3.1 寫在前面的話 84
5.3.2 項目需求 84
5.3.3 操作步驟 84
5.3.4 頂層架構(gòu)設(shè)計 86
5.3.5 模塊功能介紹 86
5.3.6 模塊端口和內(nèi)部連線描述 87
5.3.7 代碼解釋 87
5.2.8 仿真分析 90
5.4 FIFO――重中之重緩存器 91
5.4.1 寫在前面的話 91
5.4.2 項目需求 91
5.4.3 操作步驟 91
5.4.4 頂層架構(gòu)設(shè)計 94
5.4.5 模塊功能介紹 95
5.4.6 模塊端口和內(nèi)部連線描述 95
5.4.7 代碼解釋 95
5.4.8 仿真分析 100
5.5 移位寄存器――你是我的驕傲 101
5.5.1 寫在前面的話 101
5.5.2 功能要求 102
5.5.3 操作步驟 103
5.5.4 頂層架構(gòu)設(shè)計 105
5.5.5 模塊功能介紹 105
5.5.6 模塊端口和內(nèi)部連線描述 105
5.5.7 代碼解釋 106
5.5.8 仿真分析 110
第6章 基礎(chǔ)項目我在行,信手拈來顯聰慧 111
6.1 二選一之戰(zhàn)――我只是個新兵 111
6.1.1 寫在前面的話 111
6.1.2 項目需求 111
6.1.3 系統(tǒng)架構(gòu) 111
6.1.4 模塊功能介紹 111
6.1.5 頂層模塊端口描述 111
6.1.6 代碼解釋 112
6.1.7 仿真分析 113
6.1.8 二選一數(shù)據(jù)寄存 114
6.2 三態(tài)門之戰(zhàn)――機關(guān)算盡太聰明 116
6.2.1 寫在前面的話 116
6.2.2 項目需求 116
6.2.3 系統(tǒng)架構(gòu) 117
6.2.4 模塊功能介紹 117
6.2.5 頂層模塊端口描述 117
6.2.6 代碼解釋 117
6.2.7 仿真分析 119
6.3 串并轉(zhuǎn)換――你無處不在 120
6.3.1 寫在前面的話 120
6.3.2 需求分析 120
6.3.3 頂層框架設(shè)計 120
6.3.4 頂層模塊端口介紹 121
6.3.5 代碼實現(xiàn) 121
6.4 generate語句――呵呵,你就會偷懶 125
6.4.1 寫在前面的話 125
6.4.2 基本概念 126
6.4.3 generate_for語句 126
6.2.4 generate_if語句 132
6.4.5 generate_case語句 133
6.5 邊沿檢測――如此高大上 135
6.5.1 寫在前面的話 135
6.5.2 電路原理分析 135
6.5.3 頂層框架結(jié)構(gòu) 136
6.5.4 頂層模塊端口介紹 136
6.5.5 代碼實現(xiàn) 136
6.5.6 仿真波形分析 138
6.6 按鍵消抖―且看老夫手段 139
6.6.1 寫在前面的話 139
6.6.2 基于尖峰脈沖的按鍵消抖 139
6.6.3 項目需求 139
6.6.4 誤區(qū)排除 139
6.6.5 設(shè)計思路 140
6.6.6 系統(tǒng)框架 140
6.6.7 頂層端口描述 141
6.6.8 代碼解釋 141
6.6.9 仿真分析 144
第7章 沒有標準的方法,但見可行的技巧 146
7.1 異步復(fù)位同步釋放――高端神秘你最帥 146
7.1.1 寫在前面的話 146
7.1.2 基本概念 146
7.1.3 代碼舉例 146
7.1.4 異步復(fù)位同步釋放電路 148
7.2 任意分頻之戰(zhàn)――一切都如此簡單 155
7.2.1 寫在前面的話 155
7.2.2 實現(xiàn)原理 156
7.2.3 系統(tǒng)框架 156
7.2.4 頂層模塊端口描述 156
7.2.5 代碼分析 156
7.2.6 仿真分析 159
7.3 二進制數(shù)轉(zhuǎn)BCD――終極進化 160
7.3.1 寫在前面的話 160
7.3.2 基本概念 160
7.3.3 逐步移位法原理 160
7.3.4 設(shè)計任務(wù) 161
7.3.5 頂層框圖設(shè)計 161
7.3.6 代碼實現(xiàn) 163
7.3.7 仿真分析 165
7.4 BCD轉(zhuǎn)二進制――返璞歸真 166
7.4.1 寫在前面的話 166
7.4.2 基本概念 166
7.4.3 移位算法原理 166
7.4.4 頂層框架圖 166
7.4.5 頂層模塊端口介紹 167
7.4.6 代碼實現(xiàn) 167
7.4.7 仿真分析 169
7.5 流水線設(shè)計之戰(zhàn)――效率決定成敗 170
7.5.1 寫在前面的話 170
7.5.2 流水線的基本概念 170
7.5.3 流水線改造實例 171
7.6 Signaltap 之戰(zhàn)――奸細,哪里逃 177
7.6.1 寫在前面的話 177
7.6.2 背景知識 178
7.6.3 典型的SignalTap II調(diào)試流程 180
7.6.4 SignalTap II調(diào)試具體操作步驟 180
7.6.5 具體步驟 181
第8章 進階首選我當前,乘勝追擊勢必行 204
8.1 字符狀態(tài)機之戰(zhàn)――進來的,都要審查 204
8.1.1 寫在前面的話 204
8.1.2 項目需求 204
8.1.3 解決方案 204
8.1.4 系統(tǒng)架構(gòu) 204
8.1.5 模塊功能介紹 204
8.1.6 頂層模塊端口描述 205
8.1.7 代碼解釋 205
8.1.8 仿真分析 210
8.2 數(shù)碼管之戰(zhàn)――好像勝利的曙光 210
8.2.1 寫在前面的話 210
8.2.2 項目需求 210
8.2.3 原理分析 210
8.2.4 單個數(shù)碼管顯示 212
8.2.5 6個數(shù)碼管顯示 215
8.3 PS2之戰(zhàn)――鍵盤原來是這樣 221
8.3.1 寫在前面的話 221
8.3.2 項目需求 221
8.3.3 原理分析 222
8.3.4 系統(tǒng)架構(gòu) 223
8.3.5 模塊功能介紹 223
8.3.6 頂層模塊端口描述 223
8.3.7 用Signaltap II分析波形 223
8.3.8 代碼解釋 225
8.3.9 仿真分析 232
8.4 矩陣鍵盤之戰(zhàn)――嚴密的資源整合 233
8.4.1 寫在前面的話 233
8.4.2 項目需求 233
8.4.3 矩陣鍵盤的原理 233
8.4.4 架構(gòu)設(shè)計 235
8.4.5 模塊功能介紹 235
8.4.6 頂層模塊端口描述 235
8.4.7 代碼解釋 235
8.4.8 仿真分析 241
8.5 IIC之戰(zhàn)――配置離不開你 241
8.5.1 寫在前面的話 241
8.5.2 項目需求 242
8.5.3 IIC的原理分析 242
8.5.4 架構(gòu)設(shè)計 246
8.5.5 模塊功能介紹 246
8.5.6 頂層模塊端口描述 246
8.5.7 代碼解釋 246
8.5.8 仿真分析 263
8.6 串口通信之戰(zhàn)――通信終于暢通了 264
8.6.1 寫在前面的話 264
8.6.2 項目需求 265
8.6.3 UART的原理分析 265
8.6.4 系統(tǒng)架構(gòu) 266
8.6.5 模塊功能介紹 268
8.6.6 模塊端口和內(nèi)部連線描述 268
8.6.7 代碼解釋 268
8.5.8 仿真分析 276
8.7 VGA之戰(zhàn)――我型我酷炫 276
8.7.1 寫在前面的話 276
8.7.2 什么是VGA 277
8.7.3 VGA接口 277
8.7.4 VGA顯示原理 278
8.7.5 頂層框架 280
8.7.6 頂層模塊端口描述 280
8.7.7 代碼實現(xiàn) 280
8.7.8 仿真分析 285
8.8 12864液晶之戰(zhàn)――心靈的窗口 285
8.8.1 寫在前面的話 285
8.8.2 基本概念 285
8.8.3 硬件電路結(jié)構(gòu) 286
8.8.4 官方代碼解析 287
8.8.5 項目需求 293
8.8.6 系統(tǒng)架構(gòu) 293
8.8.7 代碼解釋 294
8.8.8 仿真分析 305
8.9 DDS――形隨心動 305
8.9.1 寫在前面的話 305
8.9.2 項目需求 305
8.9.3 項目分析 305
8.9.4 系統(tǒng)架構(gòu) 306
8.9.5 模塊功能介紹 306
8.9.6 頂層端口和內(nèi)部連線描述 306
8.9.7 波形數(shù)據(jù)的由來 307
8.9.8 波形發(fā)生器(不可調(diào)頻和調(diào)相) 308
8.9.9 波形發(fā)生器(不可調(diào)頻,但可以調(diào)相) 312
8.9.10 波形發(fā)生器(可以調(diào)頻,可以調(diào)相) 315
8.9.11 最終設(shè)計 318
8.10 蜂鳴器之戰(zhàn)――奏響凱旋的樂章 322
8.10.1 寫在前面的話 322
8.10.2 什么是蜂鳴器 322
8.10.3 設(shè)計任務(wù) 323
8.10.4 頂層端口介紹 325
8.10.5 代碼解釋 325
8.10.6 仿真分析 331