學(xué)習(xí)筆記20170601">【PMP】學(xué)習(xí)筆記20170601
1269
2025-04-02
在眾多的嵌入式系統(tǒng)應(yīng)用中, 有一類(lèi)應(yīng)用可能需要根據(jù)不同的應(yīng)用場(chǎng)景,動(dòng)態(tài)的更改 FPGA 內(nèi)部的邏輯設(shè)計(jì), 以適配不同的工作環(huán)境。 例如在一個(gè)數(shù)據(jù)采集系統(tǒng)中,連接不同型號(hào)的模擬數(shù)據(jù)采集卡, 其所需要的 FPGA 接口邏輯以及內(nèi)部的數(shù)據(jù)變換處理邏輯都有可能不同。不同性能的 ADC 芯片其所能工作的采樣率不一樣, 即所需的接口時(shí)鐘頻率不一樣,而在 FPGA 中針對(duì)高速時(shí)鐘信號(hào)希望動(dòng)態(tài)修改頻率,傳統(tǒng)的方案只能使用多路時(shí)鐘切換電路, 或者使用PLL 動(dòng)態(tài)重配置方案。 而基于 SoC FPGA 的在系統(tǒng)重配置 FPGA 解決方案,可以通過(guò)識(shí)別不同的 ADC 型號(hào), 選擇對(duì)應(yīng)的 FPGA 驅(qū)動(dòng)和應(yīng)用邏輯的配置數(shù)據(jù)配置到 FPGA 中, 從而實(shí)現(xiàn)對(duì)不同硬件的匹配。
而另外一個(gè)更加能夠體現(xiàn)出這種在系統(tǒng)重配置方案的優(yōu)勢(shì)情景是,如果不同的硬件,其與 FPGA 連接時(shí)同一功能屬性的引腳可能分布在不同的位置,例如對(duì)于 AC501-SoC 開(kāi)發(fā)板上的通用顯示擴(kuò)展接口,其能夠連接 8080 接口的 LCD 液晶屏,也能連接 RGB 接口的TFT 顯示屏, 還能夠連接 VGA 輸出模塊,實(shí)現(xiàn) VGA 視頻的輸出, 而這三種外設(shè)的功能引腳定義都有差異, 直接連接到開(kāi)發(fā)板上很難通過(guò)同一個(gè)邏輯驅(qū)動(dòng)電路實(shí)現(xiàn)自動(dòng)兼容,此時(shí), 如果希望系統(tǒng)能夠根據(jù)連接的是 LCD、 RGB-TFT 或者 VGA 來(lái)適配相應(yīng)的邏輯驅(qū)動(dòng)和 IO 映射,就可以使用基于 Linux 應(yīng)用程序的HPS 在系統(tǒng)重配置 FPGA 方案。首先 FPGA 中可能會(huì)配置進(jìn)一個(gè)基本的邏輯系統(tǒng),以支持 Linux 系統(tǒng)通過(guò)讀取某些特定 IO 的高低電平來(lái)識(shí)別連接的是 LCD液晶屏, 或是 RGB-TFT 顯示屏,或是 VGA 輸出電路。 然后 Linux 系統(tǒng)再根據(jù)識(shí)別結(jié)果將支持對(duì)應(yīng)硬件外設(shè)的 FPGA 配置數(shù)據(jù)流配置到 FPGA 中, 這樣FPGA 中就擁有了正確兼容所連接硬件外設(shè)的驅(qū)動(dòng)邏輯, Linux 也能夠正常的對(duì)其實(shí)現(xiàn)操作了。
一、制作 Quartus 工程
為了通過(guò)明顯的實(shí)驗(yàn)現(xiàn)象展示通過(guò) Linux 系統(tǒng)在線配置 FPGA 的效果,這里使用 AC501_SoC_GHRD 工程進(jìn)行簡(jiǎn)單的修改,得到另一個(gè)工程。 為了避免大家在剛開(kāi)始接觸 SoC FPGA 的時(shí)候因?yàn)椴僮鞑皇炀毝霈F(xiàn)低級(jí)的錯(cuò)誤耽誤時(shí)間, 這里提供一種最簡(jiǎn)單的修改方式, 就是交換兩個(gè) FPGA 側(cè) LED 燈的引腳分配, 例如工程中默認(rèn) fpga_led[1]分配在 PIN_V9, fpga_led[0]分配在 PIN_V10上,就可以將 AC501_SoC_GHRD 工程拷貝并打開(kāi),將 fpga_led[1]分配在PIN_V10 上,而將 fpga_led[0]分配在 PIN_V9 上, 然后重新編譯得到 sof 文件即可。由于沒(méi)有修改任何的邏輯設(shè)計(jì)和 Qsys 系統(tǒng)內(nèi)容,因此無(wú)需重新生成設(shè)備樹(shù),也無(wú)需重新更新 uboot。 例如,在本書(shū)配套的工程源碼中,修改后的工程文件夾名為 AC501_SoC_GHRD_ExPin。
filter location和location區(qū)別:仔細(xì)觀察上面的Filter Location一欄,沒(méi)有跟隨Location變化。據(jù)群里網(wǎng)友說(shuō)是:沒(méi)給location分配引腳的時(shí)候,這列的分配置位就生效。
二、生成rbf格式配置數(shù)據(jù)
rbf 文件是 Quartus 編譯生成的 fpga 配置文件的二進(jìn)制數(shù)據(jù)量格式的文件,主要用于使用外部主機(jī)通過(guò) PS 方式配置 FPGA。
在含 ARM 硬核的 SoC FPGA 中,可以使用 HPS 在線配置 FPGA,配置時(shí)分為兩種情況,一種是在 HPS 處于 uboot 啟動(dòng)階段時(shí)通過(guò) u-boot 配置(見(jiàn)《【SoC FPGA學(xué)習(xí)】八、從零開(kāi)始體驗(yàn)一把為 HPS 添加外設(shè),以 UART 外設(shè)為例》的1.9小節(jié)),一種是Linux 啟動(dòng)之后通過(guò)應(yīng)用程序配置。這兩種配置方式都需要用到 rbf 格式的配置文件,但是兩種方式所需的 rbf 格式的配置文件卻又存在著差異,其中 uboot 階段配置 fpga 需要使用未經(jīng)壓縮的 rbf 格式文件,而在 Linux 應(yīng)用程序中配置fpga 時(shí),需要使用經(jīng)過(guò)壓縮了的 rbf 文件。默認(rèn)情況下, Quartus 軟件不能自動(dòng)生成 rbf 文件,需要在設(shè)置種開(kāi)啟生成 rbf 文件選項(xiàng)。開(kāi)啟方法如下:
雙擊工程,如下圖所示
點(diǎn)擊其中的Device and Pin Options…
勾選在Programming Files下面的Raw Binary File(.rbf)文件
需要注意的是,這種方式生成的 rbf 文件是經(jīng)過(guò)壓縮了(應(yīng)用程序階段)的,可以支持 Linux中使用應(yīng)用程序直接配置 FPGA,不支持 uboot 階段配置 fpga。除了使能 Quartus 軟件在編譯時(shí)自動(dòng)生成 rbf 文件,用戶(hù)也可以在編譯結(jié)束后通過(guò)腳本命令手動(dòng)實(shí)現(xiàn) sof 文件到 rbf 文件的轉(zhuǎn)換。
使用 sof 文件直接轉(zhuǎn)換得到**未經(jīng)壓縮(uboot階段)**的 rbf 文件的命令格式為:
quartus_cpf -c my_input_file.sof my_output_file.rbf
1
使用 sof 文件直接轉(zhuǎn)換得到**經(jīng)過(guò)壓縮(應(yīng)用程序階段)**的 rbf 文件的命令格式為:
quartus_cpf -c -o bitstream_compression=on my_input_file.sof my_output_file.rbf
1
其中, my_input_file.sof 是工程編譯得到的 sof 文件, 作為轉(zhuǎn)換輸入文件,my_output_file.rbf 為轉(zhuǎn)換得到的 rbf 文件,可以用來(lái)使用 HPS 配置 FPGA。
使用時(shí),可以直接在 SoC EDS 軟件中輸入上述命令生成 rbf 文件,也可以將上述命令做成腳本, 然后一鍵運(yùn)行(見(jiàn)《【SoC FPGA學(xué)習(xí)】八、從零開(kāi)始體驗(yàn)一把為 HPS 添加外設(shè),以 UART 外設(shè)為例》的1.9小節(jié))。
制作 sof 文件直接轉(zhuǎn)換得到**未經(jīng)壓縮(uboot階段)**的 rbf 文件的腳本:
%QUARTUS_ROOTDIR%\\bin64\\quartus_cpf -c AC501_SoC_GHRD.sof soc_system.rbf pause
1
2
將 sof2rbf.bat 文件拷貝到工程中 sof 所在目錄下(GHRD工程的output_files目錄),直接雙擊運(yùn)行該 bat 文件,就能生成名為 soc_system.rbf 的文件了,該文件是未經(jīng)壓縮的rbf 文件。
制作 sof 文件直接轉(zhuǎn)換得到**經(jīng)過(guò)壓縮(應(yīng)用程序階段)**的 rbf 文件的腳本呢:
%QUARTUS_ROOTDIR%\\bin64\\quartus_cpf -c -o bitstream_compression=on AC501_SoC_GHRD.sof soc_system_dc.rbf pause
1
2
將 sof2rbf_dc.bat 文件拷貝到工程中 sof 所在目錄下(GHRD工程的output_files目錄),直接雙擊運(yùn)行該 bat 文件,就能生成名為 soc_system_dc.rbf 的文件了,該文件是經(jīng)過(guò)壓縮的rbf 文件。
注意,上述命令內(nèi)容中, AC501_SoC_GHRD.sof 名字需要換成工程中實(shí)際的 sof 文件的名字。
下圖為分別使用 sof2rbf.bat 和 sof2rbf_dc.bat 腳本生成的 rbf 文件,可以看到,兩者尺寸差距較大, soc_system.rbf 為 4146KB,而 soc_system_dc.rbf 僅為 1269KB。
三、編譯 Linux 配置 FPGA 應(yīng)用程序
當(dāng)需要在 Linux 運(yùn)行時(shí)配置 FPGA, 需要有一個(gè) Linux 應(yīng)用程序來(lái)完成此操作。該應(yīng)用程序會(huì)讀取指定的 rbf 文件并通過(guò) HPS 的 FPGA 管理器外設(shè)將數(shù)據(jù)流配置到 FPGA 中。在 AC501-SoC 開(kāi)發(fā)板的配套光盤(pán)資料中\(zhòng)AC501-SoC開(kāi)發(fā)板資料文件夾版\Demos\SOC_FPGA\c_project,提供了一個(gè)名為hps_config_fpga 的 Linux 應(yīng)用工程源碼, 使用時(shí)僅需導(dǎo)入到 DS-5 中,然后就可以進(jìn)行編譯調(diào)試了,如下圖所示。
該程序?qū)嶋H上和之前介紹的基于虛擬地址映射的外設(shè)編程方式一致, 其將HPS 中的 FPGA 管理器外設(shè)也通過(guò)虛擬地址映射的方式得到了每個(gè)寄存器的虛擬地址,然后通過(guò)直接讀寫(xiě)寄存器的方式完成 FPGA 的配置。
四、在系統(tǒng)重配置 FPGA 實(shí)驗(yàn)
要進(jìn)行在系統(tǒng)重新配置 FPGA 的實(shí)驗(yàn), 首先要獲得希望配置進(jìn)入 FPGA 的rbf 格式的配置數(shù)據(jù)流文件, 在上述介紹中,已經(jīng)介紹了制作一鍵生成 rbf 文件的腳本,因此,這里僅需將帶壓縮屬性的生成腳本分別拷貝入AC501_SoC_GHRD 和 AC501_SoC_GHRD_ExPin 工程的 output_files 目錄下并運(yùn)行,即可得到對(duì)應(yīng)的 rbf 文件,為了以示區(qū)分,將 AC501_SoC_GHRD_ExPin工程生成的 rbf 文件手動(dòng)重命名為 soc_system_expin_dc.rbf, 然后將這兩個(gè) rbf文件均拷貝入 soc 開(kāi)發(fā)板的 SD 卡中。
從 D:\intelFPGA\17.1\embedded\embeddedsw\socfpga\prebuilt_images 路徑中拷貝“socfpga_cyclone5.dtb”到 SD 卡中并改名為 socfpga.dtb(原有的socfpga.dtb文件改為socfpga.dtb.bak)
socfpga_cyclone5.dtb 文件是所有 Cyclone V SoC FPGA 通用的 DTB 文件,它們不依賴(lài)于 FPGA 中的軟 IP。 Linux 在使用這種 DTB 文件加載設(shè)備時(shí)不需要FPGA 配置和橋接的復(fù)位釋放。這種 DTB 文件主要用于一塊新設(shè)計(jì)的 SoC 板卡啟動(dòng)或是僅僅用于簡(jiǎn)化 SoC 的引導(dǎo)來(lái)啟動(dòng) Linux。 如果當(dāng)前的開(kāi)發(fā)和調(diào)試與FPGA 部分無(wú)關(guān),就可以使用該 DTB 加載 Linux 設(shè)備驅(qū)動(dòng)以去掉 FPGA 設(shè)計(jì)帶來(lái)的復(fù)雜部分。
在 Linux 下使用 HPS 在系統(tǒng)配置 FPGA 時(shí), 使用此種方式,可以避開(kāi)Linux 加載 FPGA 部分而帶來(lái)各種可能的影響, 首先保證 Linux 系統(tǒng)順利啟動(dòng),然后再由 HPS 配置 FPGA。將 DS-5 中 hps_config_fpga 工程編譯得到的可執(zhí)行文件“hps_config_fpga”拷貝到SD卡中
將《LED和按鍵聯(lián)動(dòng)》的實(shí)驗(yàn)代碼,編譯得到的可執(zhí)行文件,拷貝到SD卡中, 該程序用于完成 FPGA 配置后測(cè)試 FPGA 部分邏輯外設(shè)功能。
soc_system_dc.rbf - 沒(méi)有進(jìn)行引腳交換的GHRD工程,編譯后得到的經(jīng)過(guò)壓縮rbf文件。
soc_system_dc_ExPin.rbf - 進(jìn)行引腳交換的GHRD工程,編譯后得到的經(jīng)過(guò)壓縮rbf文件。
拷貝完所有文件的 SD 卡根目錄中的文件列表如下圖所示。
設(shè)置 AC501-SoC 開(kāi)發(fā)板的 MSEL 撥碼開(kāi)關(guān)值為 4’b01110 或 4’b01010, 如下圖
然后使用拷貝好文件的 SD 卡啟動(dòng) AC501-SoC 開(kāi)發(fā)板,啟動(dòng)完成后,由于上述執(zhí)行重配置相關(guān)的文件都是存放在 SD 卡的 FAT 分區(qū)中的,需要先掛載到 Linux 系統(tǒng)下。使用下述命令完成 FAT 分區(qū)在 Linux 系統(tǒng)中的掛載。
mount –t vfat /dev/mmcblk0p1 /mnt
1
然后使用 cd 命令切換到 mnt 路徑下
cd /mnt
1
輸入 ls 命令就能看到該目錄下存在的所有文件了。 新拷貝進(jìn)來(lái)的文件可能沒(méi)有可執(zhí)行權(quán)限,使用chmod 777 *命令可以一次性為所有文件增加可執(zhí)行權(quán)限。添加好可執(zhí)行權(quán)限后, 首先使用未做修改的 AC501_SoC_GHRD 工程的配置數(shù)據(jù) soc_system_dc.rbf 配置 FPGA,輸入以下命令即可。
./hps_config_fpga soc_system_dc.rbf
1
程序完成 FPGA 配置之后,可以看到 AC501-SoC 開(kāi)發(fā)板上的兩個(gè) LED 燈被點(diǎn)亮了, 同時(shí)串口終端上打印以下內(nèi)容:
可以看到,串口終端提示 FPGA 已經(jīng)被成功配置。 此時(shí)輸入./led執(zhí)行編譯好的按鍵控制 LED 程序,然后按下開(kāi)發(fā)板上的 S7 鍵, 可以看到 LED 燈D8 隨著 S7 的每次按下發(fā)生亮滅狀態(tài)的切換,按下開(kāi)發(fā)板上的 S8 鍵, 可以看到LED 燈 D9 隨著 S8 的每次按下發(fā)生亮滅狀態(tài)的切換。
按下 ctrl+c 組合鍵結(jié)束 pio 程序的運(yùn)行。然后使用交換了 LED0 和LED1管腳的AC501_SoC_GHRD_ExPin工程的配置數(shù)據(jù)soc_system_expin_dc.rbf配置 FPGA,輸入以下命令即可。
./hps_config_fpga soc_system_dc_Expin.rbf
1
程序完成 FPGA 配置之后,可以看到串口終端上再次提示 FPGA 配置成功的信息。 此時(shí), 再次執(zhí)行編譯好的按鍵控制 LED 程序“pio”,然后按下開(kāi)發(fā)板上的 S7 鍵, 可以看到 LED 燈 D9 隨著 S7 的每次按下發(fā)生亮滅狀態(tài)的切換,按下開(kāi)發(fā)板上的 S8 鍵, 可以看到 LED 燈 D9 隨著 S8 的每次按下發(fā)生亮滅狀態(tài)的切換。即驗(yàn)證了 FPGA 中確實(shí)被配置進(jìn)入了另一個(gè) FPGA 配置數(shù)據(jù)。
FPGA Linux
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。