Zenq系列FPGA雙核ARM裸機非同步程式實現

2021-07-27 19:59:49 字數 1886 閱讀 3841

zenq系列的兩個arm處理器核心可以分別工作,其公用資源有cache、ddr、所有外設、ocm儲存器等。

可以將其看成是兩個執行緒,實際使用時,可以通過執行緒同步、互斥的方式來實現裸機情況下的簡單雙核排程與使用。

由於兩個核心的記憶體空間是公用的,硬體上不作區分,也就是說每個核心都可以訪問到完整的ddr空間。

因此,需要在邏輯上將兩個核心使用的記憶體空間區分開來。例如

cpu

ddrcpu0

0 ~ 200mb

cpu1

200m ~ 512mb

對於arm架構而言,不區分程式空間和資料空間,因此程式載入時也應該載入到各自對應的空間中。對於bootloader而言,需要完成4件事情。

1. 晶元自檢,載入驅動

2. 載入bit stream,並通過vcap模組寫入fpga

3. 載入cpu0的程式和cpu1的程式

4. 將cpu0 hand off 到cpu0的使用者程式上

對於cpu0和cpu1的工程而言,需要將其生成的elf可執行檔案的載入位址改為各自空間的首位址。通過修改linker script來實現。例如
cpu0 linker script

the system */

memory

cpu1 linker script

the system */

memory

上面的例子中

將cpu0的記憶體基位址改為1mb,記憶體大小改為149mb,即cpu0的邏輯記憶體空間為1mb~150mb

將cpu1的記憶體基位址改為150mb,記憶體大小改為50mb,即cpu1的邏輯記憶體空間為150mb~200mb

系統實際記憶體空間為512mb,剩餘的312mb留給fpga使用

zenq系列的雙核arm必須由cpu0先啟動,再通過cpu0來啟動cpu1。cpu0的程式需要將cpu1的程式入口位址設定好,再啟動cpu1。實現**如下

#define

sev() __asm__("sev");

#define cpu1_start_addr (0xfffffff0)

#define share_ram_base_addr (0xffff0000)

xil_settlbattributes(share_ram_base_addr, 0x14de2);

xil_out32(cpu1_start_addr, 0x09600000);

dmb();

sev();

在彙編指令sev執行以後,cpu1即開始從0xfffffff0存放的位址處開始執行。

需要注意的是,由於cache是共享資源,因此兩塊cpu不能同時使用。在**中,只能有乙個cpu**執行

xil_icacheenable();

xil_dcacheenable();

由於ocm記憶體為兩塊cpu公用,且訪問速度較快,可以將ocm記憶體區看作類似於ipc的「共享記憶體」,用於兩塊cpu程式之間的同步和互斥等。例如

struct dual_core_ctrl_stru
然後在cpu0和cpu1的程式中分別應用這塊記憶體區域

#define share_ram_base_addr             (0xffff0000)

struct dual_core_ctrl_stru *stdualctrl =

(struct dual_core_ctrl_stru*) share_ram_base_addr;

具體的訊號量處理介面不再贅述,請自己造輪子 : )

FPGA開發之IP核

從ip 核的提供方式上,通常將其分為軟核 硬核和固核這3 類。從完成ip 核所花費的成本來講,硬核代價最大 從使用靈活性來講,軟核的可復用使用性最高。軟核 soft ip core 軟核在 eda 設計領域指的是綜合之前的暫存器傳輸級 rtl 模型 具體在 fpga 設計中指的是對電路的硬體語言描述...

FPGA開發之呼叫FFT IP核

有三種fft 1 流水線,streaming i o 結構 允許連續的資料處理 2 基 4,burst i o 結構 提供資料匯入 匯出階段和處理階段。此結構擁有較小的結構,但轉換時間較長 3 基 2,burst i o 結構 使用最少的邏輯資源,同 radix 4 相同,提供兩階段的過程。第一種結...

8核 6核 4核 雙核CPU是什麼意思

對於初學者來說,cpu是什麼 什麼是雙核 4核 6核 8核等。下面,就以上的問題,我們做出一一解答。概念 cpu是什麼 做什麼用 一般cpu是接在 的,我們先來看看cpu是什麼,cpu既 處理器 電腦中乙個最重要,最核心的東西,市面上能買到的cpu只有兩種,一種是intel公司生產的,另一種是amd...