c语言sscanf函数的用法是什么
268
2022-11-24
PYNQ中MicroBlaze程序文件的加载过程
警告:这篇文章可以做为专业人士饭后甜点,但是非专业人士请火速撤离,以免造成永久性大脑皮层损伤。
from pynq.overlays.base import BaseOverlay
base = BaseOverlay(“base.bit”)
if if_id.upper()==‘PMODA’:
adc = Pmod_ADC(base.PMODA)
else:
adc = Pmod_ADC(base.PMODB)
先调用base overlay,这个不用说。接下来使用的一个Pmod_ADC函数指定Pmod接口是A还是B。这个函数在pmod_adc.py文件里,让我们进如pmod_adc.py看一下这个函数:
PMOD_ADC_PROGRAM = “pmod_adc.bin”
class Pmod_ADC(object):
def __init__(self, mb_info):
self.microblaze = Pmod(mb_info, PMOD_ADC_PROGRAM)
self.log_running = 0
这里面使用一个Pmod函数指定了所使用的程序文件,也就是pmod_adc.bin。这程序是自己写的MicroBlaze程序编译生成的,可以在SDK里面完成程序并编译得到.bin文件。
在pmod.py文件里面我们可以看到Pmod函数通过super()函数调用父PynqMicroblaze里面初始化函数。关于super()函数的使用自行谷歌。
from pynq.lib import PynqMicroblaze
class Pmod(PynqMicroblaze):
def __init__(self, mb_info, mb_program):
if not os.path.isabs(mb_program):
super().__init__(mb_info, mb_program)
在 PynqMicroblaze里面,使用了PL.load_ip_data函数来载入我们的二进制程序文件。并在载入完成后使用了run()函数,在run()函数里面复位了MicroBlaze。
class PynqMicroblaze:
def run(self):
self.state = ‘RUNNING’
def program(self):
self.reset()
PL.load_ip_data(self.ip_name, self.mb_program, zero=True)
if self.interrupt:
self.interrupt.clear()
self.run()
让我们再进入pl.py,会发现 load_ip_data函数使用MMIO接口函数写入了程序文件。
def load_ip_data(cls, ip_name, data, zero=False):
cls.client_request()
with open(data, ‘rb’) as bin_file:
size = os.fstat(bin_file.fileno()).st_size
target_size = cls._ip_dict[ip_name][‘addr_range’]
if size 》 target_size:
mmio = MMIO(cls._ip_dict[ip_name][‘phys_addr’], target_size)
buf = bin_file.read(size)
mmio.write(0, buf)
if zero and size 《 target_size:
mmio.write(size, b‘\x00’ * (target_size - size))
cls._ip_dict[ip_name][‘state’] = data
cls.server_update()
到此整个MicroBlaze程序文件的加载过程就已经讲完了。
还有些细节问题在后面的文章里面再写吧。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~