Power PC 與 zynq數據交互(基於LocalBus)

Power PC 與 zynq數據交互(基於LocalBus)

1、 Power PC 地址空間映射:

實現 Power PC LocalBus控制外部設備,首先要把Power PC的effective address 映射到 device address,這裏需要搞清楚兩個重要的概念:第一個是LAW,第二個是Power PC的內存管理單元MMU。Power PC爲了實現靈活性,實現了地址空間的可配置性,當然這增加了開發的門檻。學校很少見PPC估計第一是價格高,第二是民用領域幾乎沒有,第三是其複雜的配置。

1.1LAW配置:

搞清楚LAW之前,還要明白Power PC 的內存佈局,這裏使用P2020說明(e500v2內核)。

There are several address domains within the chip, including the following:
• Logical, virtual, and physical (real) address spaces within the e500 core
• Internal local address space
• Internal configuration, control, and status register (CCSR) address space
• External memory, I/O, and configuration address spaces of the PCI Express link
• External memory address space of serial RapidIO

這是器件手冊給出的一些片內地址的說明。邏輯地址、物理地址、虛擬地址是針對MMU來講的。內部地址和外部地址是ATMU用到的。關於LAW我們需要關心的是我們應用程序寫入到CPU的地址,以及外部總線的響應,這是最終的目的。
LAW 全稱Local access windows,該器件的作用是定義了一套本地地址訪問設備地址的映射表。
在這裏插入圖片描述這是手冊上面給出的一個地址表實例,軟件開發人員可以通過設置LAW_LAWBARn和LAW_LAWARn來對LAW進行配置。第一個LAW_LAWBARn用來設置對應窗口的高24位基地址。這個比較好理解,需要注意的是P2020的設備地址空間是36位,而且P2020寄存器的賦值是反着來的,不知道是爲什麼。下面是在vxWorks中的一個串口設置實例:
在這裏插入圖片描述第3行和第5行分別設置了兩個目標地址。0xF0000000和0xe80000000.
LAW_LAWARn寄存器是用來設置目標器件類型、映射地址空間大小的。
在這裏插入圖片描述由於我們需要的是LocalBus,因此設爲00100.
在這裏插入圖片描述映射地址大小按照該表來設置即可。

1.2MMU配置:

這樣就完成了用戶空間地址到物理地址的映射。不過不要高興的太早,中間還有一層MMU,如果不對MMU進行配置,地址是effecitve address是不能直接訪問外面的設備的。並且P2020的MMU不能被關閉。
至於P2020 MMU的工作原理,現在還沒有很好的認知,只能從之前別人寫好的代碼去理解怎麼使用。


    {
        0xe8000000, 0x0, 0xe8000000,
        _MMU_TLB_TS_0   | _MMU_TLB_SZ_64M  | _MMU_TLB_IPROT   |
        _MMU_TLB_PERM_W | _MMU_TLB_PERM_X   | _MMU_TLB_ATTR_I  |
        _MMU_TLB_ATTR_G
    },
    {
        0xec000000, 0x0, 0xec000000,
        _MMU_TLB_TS_0   | _MMU_TLB_SZ_64M  | _MMU_TLB_IPROT   |
        _MMU_TLB_PERM_W | _MMU_TLB_PERM_X   | _MMU_TLB_ATTR_I  |
        _MMU_TLB_ATTR_G
    },

以上是在VxWorks中的代碼級的映射實例。按照vxWorks給出的說明
/* effAddr, Unused, realAddr, ts | size | attributes | permissions /
/
TLB #0. Flash /
/
needed be first entry here */
主要關注第一行。第一個成員是effective address 第二個成員是 爲使用,第三個是real address。這三個最關鍵。還有一個size,其他的先抄下來吧☺我也不懂。

2 LocalBus配置:

2.1硬件配置:

說了這麼多,纔到了最關鍵的部分,前面的內容都是在鋪墊。如果是ARM處理器,前面幾步早就被忽略了。剛開始拿到P2020總想罵NXP搞得這是什麼東西,等正正看了一段時間才發現它的靈活性非常高。高配的處理器和低配的處理器很大的差別是寄存器的數量,寄存器就是一系列的功能開關。高配的汽車開關也會多點吧。
看了下手冊,P2020的LocalBus控制器有三個功能配置:
在這裏插入圖片描述
這裏我們需要實現的類似於80總線的一種訪問形式,80總線是現對於inter CPU來講的,在Power PC中叫做60x總線,其實都出不多了。
根據手冊的描述,GPCM最合適了,FMC是用來控制FLASH的,UPMS沒仔細看,類似於內存陣列好像。
接下來重點看下GPCM模式:
在這裏插入圖片描述這個圖很關鍵,指明瞭要使用GPMC模式,就必須按照這種方式來接線。注意有一個很明顯的地方就是P2020的低位數據接到了外設的高位數據 這點不僅是在寄存器設置的時候要注意,硬件連接也要注意。我們這裏使用的是zynq,因此不用關係這個問題會帶來災難性的錯誤,重新配置下管腳約束不就好了。
低位地址線需要鎖存器來進行解複用。我們用的是FPGA,可以很靈活的解決這個問題。
在這裏插入圖片描述在這裏插入圖片描述
這裏我們的硬件連接直接把P2020的LocalBus接到了xcz7045上面。
再來看一下讀寫時序:
在這裏插入圖片描述在這裏插入圖片描述看起來很簡單,不分析時序了,直接在zynq上面編碼就好了。
這裏還有很重要的一步,配置LocalBus的功能寄存器。
LocalBus只需要配置兩個寄存器eLBC_BR0和eLBC_ORg0,注意後面的數字代表的是對應的硬件管腳上面的片選信號。
在這裏插入圖片描述
看到了吧,這裏主要用了LCS2。
eLBC_BR0寄存器設置了基地址、總行功能模式、ECC校驗、寫保護、Machine select以及Valid bit。
eLBC_ORg0寄存器配置了AM(地址掩碼)以及訪問時序。
根據器件手冊以及我們要實現的功能,在vxWorks中對這兩個寄存器做如下配置:
在這裏插入圖片描述
這裏重0xe9000000映射了1M字節的空間到外設。

2.2信號的抓取驗證:

首先把示波器調成下降沿觸發,接到CS2管腳上。激活觸發,等待下降沿的到來。然後在shell中輸入d 0xe9000000,這時候,vxWorks會讀取0xe9000000上面的數據,如果LAW、MMU、LBS都配置正確,CS引腳會被拉低。

3 FPGA部分程序設計:

3.1設計思路:

1、先把信號全部設置成input,通過ILA來抓取信號,觀察信號的規律;
2、根據抓取到的信號進行解複用,解析出地址和數據;
3、寫接口只要在寫使能信號有效的時刻,準備好相應的數據即可;

下圖是在0xe9000000上面寫了0x1234
在這裏插入圖片描述可以看到信號與時序圖相符合。
再來看一下讀信號:
在這裏插入圖片描述下面是解複用的邏輯

always @(negedge ps_clk)
begin
 if(LALE)
    address_high<={LA[0],LA[1],LA[2],LA[3],LA[4],LA[5],LA[6],LA[7],LA[8],LA[9],LA[10],LA[11],LA[12],LA[13],LA[14],LA[15]};
 else ;
 if(LWE0_N==1'b0)
    data<={LA[0],LA[1],LA[2],LA[3],LA[4],LA[5],LA[6],LA[7],LA[8],LA[9],LA[10],LA[11],LA[12],LA[13],LA[14],LA[15]};
 else ;
end 

4總結一下:

第一步,搞清Power PC的地址空間映射;
第二步,看懂LocalBus協議;
第三步,使用合適的器件對協議進行解析;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章