隨著集成電路生產(chǎn)工藝的不斷進(jìn)步,芯片中晶體管的數(shù)量也在不斷增加。GAL、PLD、CPLD、FPGA 等一系列的可編程邏輯數(shù)字集成電路相繼誕生。新型架構(gòu)芯片的出現(xiàn),不僅得益于集成電路設(shè)計(jì)和制造工藝的進(jìn)步,而且更離不開實(shí)際的應(yīng)用需求,F(xiàn)代數(shù)字系統(tǒng)大多都朝小型化、集成化方向發(fā)展,而作為一種通用的可編程邏輯器件,FPGA 以其靈活的現(xiàn)場可編程特性、強(qiáng)大的并行處理能力,在眾多高性能數(shù)字系統(tǒng)中都有應(yīng)用。
鑒于很多高性能的數(shù)字系統(tǒng)都離不開FPGA 器件,為了進(jìn)一步降低硬件系統(tǒng)的復(fù)雜度,各大FPGA 廠家都推出了基于各自FPGA 的軟核CPU 方案。通過該方案,設(shè)計(jì)者能夠?qū)⒃拘枰ㄟ^外置CPU 實(shí)現(xiàn)的功能,轉(zhuǎn)移到FPGA 芯片中使用通用邏輯搭建的軟核CPU 來實(shí)現(xiàn),在保證系統(tǒng)功能和性能的前提下,簡化硬件系統(tǒng)設(shè)計(jì),提高系統(tǒng)集成度,降低維護(hù)難度。但是受限于FPGA 中通用邏輯的可運(yùn)行最大頻率,各種軟核CPU 的運(yùn)行頻率都較低,一般不超過200
MHz,再加上架構(gòu)的原因,各種軟核CPU 的軟件生態(tài)都遠(yuǎn)趕不上各種常用的單片機(jī)。因此,基于軟核處理器的應(yīng)用開發(fā)受到了較大的限制。
在此情形下,眾多的FPGA 廠商又相繼推出了集成高性能ARM 硬核處理器和通用可編程邏輯的新型架構(gòu)芯片。這其中就包括以Xilinx的Zynq系列為代表的全可編程芯片以及Intel 的可編程片上系統(tǒng)芯片(SoC FPGA)。
無論是Xilinx的Zynq系列芯片,還是Intel的SoC FPGA 芯片,兩者的架構(gòu)都是相似的,都是在同一個(gè)晶片上將高性能的ARM Cortex A 系列處理器和FPGA有機(jī)結(jié)合,并輔以各種常見的外設(shè),實(shí)現(xiàn)完整的系統(tǒng)。依賴于ARM 處理器強(qiáng)大的開發(fā)工具鏈和軟件生態(tài)環(huán)境,使用這一類器件進(jìn)行系統(tǒng)設(shè)計(jì),開發(fā)和調(diào)試的時(shí)間將被大大縮短。
得益于Intel大學(xué)計(jì)劃提供的眾多學(xué)習(xí)機(jī)會(huì)和學(xué)習(xí)資料,筆者從2014年底開始接觸Intel的SoC FPGA,并開始了斷斷續(xù)續(xù)的學(xué)習(xí)。但是由于在這之前,作者并沒有任何基于Linux系統(tǒng)開發(fā)的基礎(chǔ),因此學(xué)習(xí)的過程非常的艱辛,學(xué)習(xí)的資料主要來SoC FPGA 嵌入式設(shè)計(jì)和開發(fā)教程自網(wǎng)絡(luò)博文和一些講解Linux開發(fā)的書籍。幸好在這個(gè)學(xué)習(xí)的過程中得到了很多朋友的無私幫助,尤其是駿龍科技的工程師,也是本書的第二作者宋士權(quán),多次為我提供最新的一手學(xué)習(xí)資料,讓我最終堅(jiān)持了下來。
在決定編寫本書之前,市面上還很難找到系統(tǒng)講解Intel SoC FPGA 開發(fā)的書籍,作者作為一個(gè)草根創(chuàng)業(yè)者,既對(duì)該器件的開發(fā)抱有極大的興趣,同時(shí)又受限于個(gè)人的知識(shí)積累,因此學(xué)習(xí)過程本身就是一個(gè)不斷試錯(cuò)的過程。本書從某種意義上來說,可以算做作者學(xué)習(xí)SoC FPGA 開發(fā)的學(xué)習(xí)筆記。由于作者能力有限,雖然在寫作過程中投入了大量的精力和時(shí)間,但錯(cuò)誤與不妥之處還是在所難免,讀者在閱讀本書時(shí)如果發(fā)現(xiàn)任何疏漏,可及時(shí)反饋給我們,以便我們及時(shí)更正。讀者可以通過本書配套的網(wǎng)站www.corecourse.cn留言反饋在閱讀本書的過程中所發(fā)現(xiàn)的問題,或者在學(xué)習(xí)過程中遇到的疑惑;同時(shí),也可以在該網(wǎng)站上以本書名作為關(guān)鍵詞,搜索與本書相關(guān)的軟硬件配套資源。
梅雪松,網(wǎng)名小梅哥,擁有多年電子設(shè)計(jì)經(jīng)驗(yàn),擅長知識(shí)的總結(jié)和傳播,有《小梅哥和你一起深入學(xué)習(xí)FPGA》、《小梅哥FPGA學(xué)習(xí)筆記》兩個(gè)系列網(wǎng)絡(luò)博文;并推出了手把手式視頻教程《FPGA設(shè)計(jì)思想與驗(yàn)證方法視頻教程》,該教程在各大視頻點(diǎn)擊平臺(tái)備受好評(píng),網(wǎng)友稱其為學(xué)習(xí)FPGA基礎(chǔ)與提高教學(xué)視頻的不二之選。同時(shí),開設(shè)FPGA實(shí)地培訓(xùn)班,進(jìn)行網(wǎng)絡(luò)和實(shí)地FPGA培訓(xùn),并多次進(jìn)入高校進(jìn)行SoC FPGA開發(fā)技術(shù)的培訓(xùn)。培訓(xùn)課程以其系統(tǒng)的知識(shí)講解和生動(dòng)的實(shí)例分析,得到了學(xué)員的一致肯定。
第1章 SoC FPGA軟硬件系統(tǒng)開發(fā)概述 … 1
1.1
Intel SoC FPGA系列 1
1.1.1
Cyclone Ⅴ SoC FPGA … 2
1.1.2
Arria Ⅴ SoC FPGA 2
1.1.3
Arria 10 SoC FPGA 2
1.1.4
Stratix 10 SoC FPGA 3
1.1.5
SoC FPGA應(yīng)用領(lǐng)域與前景 3
1.2
Intel Cyclone Ⅴ SoC FPGA介紹 … 4
1.2.1
什么是SoC FPGA … 4
1.2.2
SOPC … 4
1.2.3
SoC FPGA與SOPC之間的差異 5
1.2.4
SoC FPGA架構(gòu)的優(yōu)勢(shì) … 6
1.3
Cyclone Ⅴ SoC FPGA器件硬件設(shè)計(jì)概述 9
1.3.1
FPGA I/O和時(shí)鐘 … 10
1.3.2
SoC FPGA JTAG電路設(shè)計(jì) … 12
1.4
AC501-SoC開發(fā)板介紹
13
1.4.1
布局及組件
… 13
1.4.2
輕觸按鍵 14
1.4.3
用戶LED 15
1.4.4
時(shí)鐘輸入 16
1.4.5
GPIO接口
… 17
1.4.6
DDR3SDRAM 18
1.4.7
通用顯示擴(kuò)展接口… 19
1.4.8
USB轉(zhuǎn) UART 21
1.4.9
以太網(wǎng)收發(fā)器 21
1.5
本章小結(jié) 23
第2章 SoC FPGA開發(fā)板的使用 … 24
2.1
安裝SoC FPGA開發(fā)工具 24
2.2
SoC FPGA的配置數(shù)據(jù)燒寫與固化
24
2.2.1
SoC FPGA啟動(dòng)配置方式介紹
24
2.2.2
sof文件的燒寫方式 26
2.2.3
Jic文件的生成和燒寫
… 28
2.3
在SoC FPGA上運(yùn)行Linux操作系統(tǒng) … 32
2.3.1
SoC FPGA中的 HPS啟動(dòng)流程介紹 32
2.3.2
HPS啟動(dòng)方式介紹 33
2.3.3
制作啟動(dòng)鏡像SD卡
34
2.3.4
準(zhǔn)備硬件板卡 35
2.3.5
開機(jī)測試 39
2.4
開發(fā)板Linux系統(tǒng)常用操作 … 40
2.4.1
查看目錄 40
2.4.2
設(shè)置和修改用戶密碼 40
2.4.3
查看和編輯文件
… 41
2.4.4
設(shè)置IP地址 … 43
2.4.5
掛載SD卡的FAT32分區(qū) 45
2.4.6
掛載 U盤
46
2.4.7
文件操作 47
2.4.8
目錄操作 48
2.4.9
停止某個(gè)進(jìn)程 49
2.4.10
重啟和關(guān)機(jī)
… 50
2.5
本章小結(jié) 50
第3章 SoC FPGA開發(fā)概述 … 51
3.1
SoC FPGA開發(fā)流程 … 51
3.1.1
硬件開發(fā) 51
3.1.2
軟件開發(fā) 53
3.2
AC501-SoC FPGA開發(fā)板的黃金參考設(shè)計(jì)說明
53
3.2.1
GHRD … 53
3.2.2
打開和查看GHRD 54
3.2.3
組件參數(shù)配置詳解… 57
3.3
本章小結(jié) 62
第4章
手把手修改GHRD系統(tǒng) 63
4.1
修改GHRD工程 … 63
4.1.1
打開GHRD工程 … 63
4.1.2
添加UART IP 64
4.1.3
關(guān)于 HPS與FPGA數(shù)據(jù)交互… 64
4.1.4
連接UART IP信號(hào)端口
65
4.1.5
分配組件基地址
… 67
4.1.6
生成 Qsys系統(tǒng)的 HDL文件 … 68
4.1.7
添加uart_1的端口到 Quartus工程中 69
4.1.8
分配FPGA引腳 … 71
4.1.9
生成配置數(shù)據(jù)二進(jìn)制文件 72
4.2
制作Preloader Image … 72
4.2.1
打開SoC EDS工具
73
4.2.2
生成bsp文件
74
4.2.3
編譯Preloader和 U-Boot 77
4.2.4
更新Preloader和 U-Boot 79
4.2.5
Win 10下更新失敗問題… 80
4.2.6
使用新的 U-Boot啟動(dòng)SoC … 81
4.3
制作設(shè)備樹
… 82
4.3.1
設(shè)備樹制作流程
… 82
4.3.2
準(zhǔn)備所需文件 82
4.3.3
生成.dts文件
83
4.3.4
生成.dtb文件
84
4.4
運(yùn)行修改后的工程 85
4.5
本章小結(jié) 87
第5章
使用DS-5編寫和調(diào)試SoC的Linux應(yīng)用程序
88
5.1
啟動(dòng)DS-5 …88
5.2
創(chuàng)建C工程 … 91
5.3
編譯工程 94
5.4
建立SSH遠(yuǎn)程連接
95
5.4.1
創(chuàng)建遠(yuǎn)程連接 95
5.4.2
復(fù)制文件到目標(biāo)板 101
5.4.3
運(yùn)行應(yīng)用程序 102
5.5
遠(yuǎn)程調(diào)試
… 103
5.5.1
GDB設(shè)置
… 103
5.5.2
GDB連接和調(diào)試
… 106
5.6
使用 WinSCP實(shí)現(xiàn)多系統(tǒng)傳輸文件 108
5.6.1
為什么要使用 WinSCP 108
5.6.2
安裝 WinSCP 109
5.6.3
建立遠(yuǎn)程主機(jī)連接 109
5.6.4
新建遠(yuǎn)程連接 112
5.6.5
調(diào)用PuTTY終端
112
5.7
本章小結(jié)
… 113
第6章
基于虛擬地址映射的Linux硬件編程 114
6.1
什么是虛擬地址映射
… 114
6.2
虛擬地址映射的實(shí)現(xiàn)
… 115
6.3
基于虛擬地址映射的PIO編程應(yīng)用 117
6.3.1
PIO外設(shè)的虛擬地址映射 117
6.3.2
在DS-5中建立PIO應(yīng)用工程 118
6.3.3
添加和包含 HPS庫文件
119
6.3.4
添加FPGA側(cè)外設(shè)硬件信息… 121
6.3.5
PIO IP核介紹 124
6.3.6
PIO核寄存器映射 125
6.3.7
PIO IP核應(yīng)用實(shí)例 128
6.3.8
合理的程序退出機(jī)制
… 131
6.3.9
關(guān)于按鍵消抖 133
6.4
基于虛擬地址映射的 UART編程應(yīng)用… 134
6.4.1
UART核介紹 134
6.4.2
UART寄存器映射 134
6.4.3
UART IP核應(yīng)用實(shí)例
… 136
6.4.4
UART IP核板級(jí)調(diào)試
… 144
6.4.5
小
結(jié) 145
6.5
基于虛擬地址映射的I2C編程應(yīng)用
145
6.5.1
OpenCores I2C IP簡介… 146
6.5.2
OpenCores I2C IP寄存器映射
146
6.5.3
I2C IP核應(yīng)用實(shí)例 149
6.5.4
小
結(jié) 161
6.6
本章小結(jié)
… 161
第7章
基于Linux應(yīng)用程序的HPS配置
FPGA
… 162
7.1
制作 Quartus工程
163
7.2
生成rbf格式配置數(shù)據(jù)
163
7.3
編譯Linux配置FPGA應(yīng)用程序… 165
7.4
在系統(tǒng)重配置FPGA實(shí)驗(yàn) … 166
7.5
本章小結(jié)
… 168
第8章
編譯嵌入式Linux系統(tǒng)內(nèi)核 169
8.1
安裝 VMware … 170
8.2
安裝 Ubuntu系統(tǒng)
171
8.2.1
使用現(xiàn)成的 Ubuntu系統(tǒng)鏡像
171
8.2.2
安裝全新的 Ubuntu系統(tǒng)
175
8.3
下載Linux系統(tǒng)源碼 … 182
8.4
設(shè)置交叉編譯環(huán)境 185
8.5
配置和編譯內(nèi)核
… 189
8.5.1
快速配置內(nèi)核 189
8.5.2
保存內(nèi)核配置文件 195
8.5.3
編譯內(nèi)核 195
8.5.4
使用內(nèi)核啟動(dòng)開發(fā)板
… 197
8.6
本章小結(jié)
… 199
第9章 Linux設(shè)備樹的原理與應(yīng)用實(shí)例 200
9.1
什么是設(shè)備樹 200
9.2
設(shè)備樹基本格式
… 201
9.3
設(shè)備樹加載設(shè)備驅(qū)動(dòng)原理
… 206
9.4
編寫I2C控制器設(shè)備節(jié)點(diǎn) … 208
9.5
加載 OC_I2C驅(qū)動(dòng)
211
9.6
使用RTC … 212
9.7
使用EEPROM … 216
9.8
編寫SPI控制器設(shè)備節(jié)點(diǎn) … 217
9.9
本章小結(jié)
… 219
第10章
基于Linux標(biāo)準(zhǔn)文件I/O 的設(shè)備讀/寫 … 220
10.1
什么是文件I/O 220
10.2
基于文件I/O操作的一般方法 … 220
10.2.1
文件描述符 220
10.2.2
打開設(shè)備(open)… 221
10.2.3
向設(shè)備寫入數(shù)據(jù)(write) 221
10.2.4
讀取設(shè)備數(shù)據(jù)(read)… 222
10.2.5
雜項(xiàng)操作(ioctl)… 222
10.2.6
關(guān)閉設(shè)備(close)… 223
10.2.7
其他操作
… 223
10.3
使用文件I/O實(shí)現(xiàn)I2C編程 223
10.4
本章小結(jié)
… 226
第11章 FPGA與HPS高速數(shù)據(jù)交互應(yīng)用 …
227
11.1
FPGA與 HPS通信介紹 … 227
11.1.1
H2F_LW_AXI_Master橋 … 229
11.1.2
H2F_AXI_Master橋 … 229
11.1.3
F2H_AXI_Slave橋 230
11.2
AXI與 Avalon-MM 總線的互聯(lián)… 230
11.3
Avalon-MM 總線
230
11.4
Avalon-MM Slave接口
232
11.5
基本Avalon-MM Slave IP設(shè)計(jì)框架 … 234
11.5.1
端口定義
… 234
11.5.2
寄存器和線網(wǎng)定義 235
11.5.3
Avalon總線對(duì)寄存器的讀/寫 235
11.5.4
用戶邏輯使用寄存器
… 236
11.6
PWM 控制器設(shè)計(jì) 237
11.6.1
PWM IP核端口設(shè)計(jì)
… 238
11.6.2
PWM IP核寄存器定義 239
11.6.3
讀/寫PWM 寄存器 … 239
11.6.4
Platform Designer中封裝PWM IP 241
11.7
Avalon-MM Master接口 … 255
11.7.1
常見的通用Avalon-MM Master主機(jī) … 256
11.7.2
DMA Controller 256
11.7.3
Scatter-Gather DMA Controller … 256
11.7.4
Modular Scatter-Gather DMA 258
11.7.5
Avalon-MM Master模板 … 260
11.8
高速數(shù)據(jù)采集系統(tǒng)
… 263
11.8.1
安裝Avalon-MM Master模板 263
11.8.2
完善 Qsys系統(tǒng) … 265
11.8.3
修改 Quartus中的 Qsys例化 269
11.8.4
測試邏輯設(shè)計(jì)
… 271
11.9
本章小結(jié)
… 275
第12章 Linux驅(qū)動(dòng)編寫與編譯 … 276
12.1
基本字符型設(shè)備驅(qū)動(dòng)… 276
12.1.1
字符型設(shè)備驅(qū)動(dòng)框架
… 277
12.1.2
PWM 控制器驅(qū)動(dòng)的完整源碼 286
12.1.3
驅(qū)動(dòng)編譯 Makefile 291
12.1.4
Ubuntu下編譯設(shè)備驅(qū)動(dòng) 292
12.1.5
字符型設(shè)備驅(qū)動(dòng)驗(yàn)證
… 293
12.2
基于DMA的字符型設(shè)備驅(qū)動(dòng) … 297
12.2.1
Avalon-MM Master Write驅(qū)動(dòng) … 298
12.2.2
Avalon-MM Master Write測試 … 304
12.3
本章小結(jié)
… 311
附錄A
外設(shè)地址映射 312
附錄B
HPS GPIO映射 … 314