PYNQ中MicroBlaze程序文件的加載過程_第1頁
PYNQ中MicroBlaze程序文件的加載過程_第2頁
PYNQ中MicroBlaze程序文件的加載過程_第3頁
PYNQ中MicroBlaze程序文件的加載過程_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

PYNQ中MicroBlaze程序文件的加載過程

警告:這篇文章可以做為專業(yè)人士飯后甜點,但是非專業(yè)人士

請火速撤離,以免造成永久性大腦皮層損傷。

在PYNQ的baseoverlay中添加了MicroBlaze,通過

MicroBlaze來配置PMOD和ardonio接口并驅動外部設備。但是平

常我們對MicroBlaze編程都是將MicroBlaze的代碼文件被硬件的

bitstream文件融合成一個文件下載到(FPGA)里面去執(zhí)行。但

是,在PYNQ里面顯然不是這樣的。PYNQ的邏輯部分也就是Overlay

都是在系統(tǒng)起來后動態(tài)加載的,再啟動MicroBlaze里面的程序。那

么這一切都是如何實現(xiàn)的呢?

首先在PYNQ的overlay里面的MicroBlaze使用的是雙端口

Block(RAM),PS端可以對這個RAM進行讀寫,那么問題就簡單

了,等。verlay配置完成,PS端再將二進制程序文件吸入的到

MicroBlaze指令存儲器里面,再復位MicroBlaze就可以了。

這一過程設計復雜的文件調用和地址映射。首先來看一下這一

功能在(Python)里面實現(xiàn)的。

首先我們看一個使用MicroBlaze的例子,以Pmod(ADC)為

例。測試代碼如下;

f(rom)pynq.overlays.baseimportBaseOverlay

frompynq.1ibimportPmod_ADC

base=BaseOverlay("base.bit")

if_id=input("Typeinthein(te)rfacelDused

(PMODAorPMODB):”)

ifif_id.upper()=='PMODA':

adc=Pmod_ADC(base.PMODA)

else:

adc=Pmod_ADC(base.PMODB)

先調用baseoverlay,這個不用說。接下來使用的一個

Pmod_ADC函數(shù)指定Pmod接口是A還是B。這個函數(shù)在pmod_adc.py

文件里,讓我們進如pmod_adc.py看一下這個函數(shù):

PMOD_ADC_PROGRAM="pmod_adc.bin”

classPmodADC(object):

def_init_(self,mb_info):

self.microblaze=Pmod(mb_info,PMOD_ADC_PROGRAM)

self.Iog_running=0

這里面使用一個Pmod函數(shù)指定了所使用的程序文件,也就是

pmod_adc.bin。這程序是自己寫的MicroBlaze程序編譯生成的,可

以在SDK里面完成程序并編譯得到.bin文件。

在pmod.py文件里面我們可以看到Pmod函數(shù)通過super()函

數(shù)調用父PynqMicroblaze里面初始化函數(shù)。關于super()函數(shù)的

使用自行谷歌。

frompynq.libimportPynqMicroblaze

classPmod(PynqMicroblaze):

def_init_(self,mb_info,mbprogram):

ifnotos.path,isabs(mb_program):

mb_program=os.path,join(BIN_L0CA(TI)ON,mb_program)

super().—init_(mb_info,mb_program)

在PynqMicroblaze里面,使用了PL.load_ip_data函數(shù)來載入

我們的二進制程序文件。并在載入完成后使用了run()函數(shù),在

run()函數(shù)里面復位了Micro了aze。

classPynqMicroblaze:

defrun(self):

self,states'RUNNING'

self.reset_(pi)n.write(0)

defprogram(self):

self,reset()

PL.load_ip_data(self.ip_name,self,mbprogram,

zero=True)

ifself.interrupt:

self,interrupt,clear()

self,run()

讓我們再進入pl.py,會發(fā)現(xiàn)load_ip_data函數(shù)使用MMIO接

口函數(shù)寫入了程序文件。

defload_ip_data(cis,ip_name,data,zero=False):

cis.client_request()

withopen(data,‘rb')asbin_file:

size=os.fstat(bin_file.fileno()).st_size

target_size=cls._ip_dict[ip_name][<addr_range,]

ifsize》target_size:

r(ai)seRunTImeError("BinaryfiletoobigforIP”)

mmio=MMI0(cis._ip_dict[ip_name]['phys_addr'],

target_size)

buf=bin_file.read(size)

mmio.write(0,buf)

ifzeroandsize^target_size:

mmio.write(size,b'\x00'*(tar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論