AG32芯片內的兩個核和兩個bin
一、概述:
與傳統(tǒng)單核芯片(如:ST系列)不同,AG32整顆芯片包含兩個核:mcu和cpld。
這里的mcu核已經(jīng)相當于ST的整顆芯片。而CPLD核是比普通芯片多出來的那個核。
這兩個核是相互獨立的(各自編譯、各自下載),又可以相互連通起來(信號連通)共同工作。
所以,AG32工程會編譯出來2個bin。一個是代碼的bin,一個是邏輯的bin,稱之為code.bin和logic.bin。最終使用時,需要把這兩部分的bin都燒錄進去,芯片才能工作起來。
mcu編譯出來bin容易理解,在VScode下點編譯就可以了。
cpld的bin,則根據(jù)使用方式的不同,生成方式也會不同。參照以下介紹。
.
二、兩個bin怎么生成
根據(jù)使用預期的不同,分成三種情況:
1.只使用mcu部分,不使用cpld部分;
2.同時使用mcu和cpld來聯(lián)合編程;
3.只使用cpld部分,不使用mcu部分;
首先說明的是,以上3種方式都是會生成2個bin的。只不過情況1和情況3生成出來的第二個bin,是系統(tǒng)自動做的,用戶無感而已。
分別說明:
情況1:如果芯片中只使用mcu不使用cpld:
此時,VE文件里只配置mcu用到的PIN腳即可。
這種情況下,vscode工程中點“upload LOGIC”時,會自動生成默認logic(該logic中“用戶邏輯”為空而已),并編譯出bin,再燒錄,一鍵完成全過程。(這里的logic可以認為是cpld.bin)
整個過程中,logic部分對開發(fā)者來說是無感的。
情況2:如果芯片中同時使用mcu和cpld:
這種開發(fā)過程參照?mcu+cpld聯(lián)合開發(fā)?,這里只簡要描述cpld.bin的生成。
這種模式下,VE文件里需要配置 mcu和pin之間、mcu和cpld之間、cpld和pin之間 的信號關聯(lián)。
然后在VScode下點“prepare LOGIC”按鈕,會為開發(fā)者生成CPLD的空的框架工程。開發(fā)者需要在這個框架下完成cpld邏輯的編寫。這個編寫調試中,開發(fā)者持有主動權。等cpld邏輯全部開發(fā)完成,自己編譯出bin。這個bin就是“情況1”中自動生成出來的那個bin。
生成cpld.bin以后,燒錄就又回到VScode下,仍然是點“upload LOGIC”去燒錄。
情況3:如果芯片中只使用cpld不使用mcu:
這種開發(fā)過程參照 純CPLD開發(fā) ,這里也只是簡要描述bin的生成。
這種模式下,開發(fā)過程是在quartus環(huán)境下完成的,首先是生成cpld.bin運行調試。而mcu的bin則是自動生成的。
跟“情況1”剛好相反:cpld.bin是自己調試生成,mcu.bin是系統(tǒng)自動生成。
.
三、兩個bin怎么調試和燒錄
mcu的調試,在VScode下進行。
cpld的編寫,需要使用quartus和supra兩個工具。目前cpld的調試,不支持在線工具,可以使用modelsim進行模塊級測試。
VScode下的燒錄,燒錄兩個bin,分別使用“Upload”和“Upload LOGIC”兩個按鈕。

而Supra下燒錄cpld,則使用Supra的upload功能。
最后,用于生產(chǎn)時,都是要生成二合一的batch.bin的。用downloader.exe工具來燒錄這個bin。
.
四、flash大小與兩個bin的燒錄位置
關于芯片flash大小:
在AG32系列中,flash大小有兩個型號:256K和1M.
flash起始地址從0x80000000開始。flash的可擦寫塊大小為4K(每次擦寫的最小單位為4K,每塊的擦寫起始是4K對齊)。具體讀、寫、擦的函數(shù),請參考example工程下的example_flash.c。
整片flash上需要存儲基礎的兩個bin:code.bin和logic.bin(logic.bin就是cpld部分編譯后的bin)。其他區(qū)域可供用戶使用(存儲用戶信息)。
默認情況下,code.bin存儲到0x80000000,logic.bin存儲到最后100K。
也就是說,不管所選型號的flash是256K還是1M,最后100K都是留給fpga/cpld使用的。
如果使用的芯片是256K的flash,那么就是156K程序+100K的cpld.bin,即:用戶程序不能超過156K。如果超過156K編譯是可以通過的,但燒錄后會沖掉logic部分。
logic被沖掉后,程序運行會表現(xiàn)出各種異常(通常是系統(tǒng)時鐘初始化失敗)。
如果程序code.bin的size比較大,cpld.bin又剛好比較小,可以調整這個界限的值。調整方法如下:
board_logic.compress = true?//(可選)對cpld.bin部分進行壓縮,更省空間。壓縮后小于48K。通常程序可能小于30K。
board_upload.logic_address = 0x80034000?//存放cpld.bin的起始點。根據(jù)實際情況調整該邊界值。
//flash的大小是在agrv2k_103.json 中定義的。
//flash起始地址是0x80000000,ram是0x20000000。
bin的存儲與運行:
code.bin和cpld.bin都是存儲在flash上的。
運行時,cpld.bin被加載到cpld內核區(qū)域運行(注意,這個區(qū)域不是芯片的128K的ram區(qū))。code.bin則仍然在flash區(qū)域運行。
.
五、其他說明
在使用MCU時,如果不用CPLD部分,是不是CPLD就是多余的?
不是的。
整個芯片的開發(fā),依賴于配置文件.ve。在這個配置文件里,需要用戶配置需要使用到的時鐘和全部引腳。這里邊配置的引腳,就是生成到cpld.bin去的。
這里又引入另一個概念:mcu信號和引腳。這部分內容比較多,詳情請參考 引腳配置 。這里只要知道,需要該cpld的參與,mcu的信號才能最終使能到引腳。