在以前发布的玩转microzed系列博客中,我们建立了一个基于zynq的系统,通过使用双端口rams和bram(块ram)控制器将两个picoblaze处理器核连接到zynq的ps部分,现在我们将学习一下怎样实现更新存储在双端口ram中的picoblaze处理器的程序。
首先在执行程序的控制下,我们怎样实现自由的存储picoblaze程序包括软件应用程序然后将他们下载到cpu中执行。
当我们定义zynq系统时,一个关键点就是使用zynq soc’s ps部分的俩个emio 端口控制picoblaze内核的复位输入信号。(我们要为每个picoblaze都提供一个复位输入来实现俩个内核的独立复位),当我们更新处理器的程序存储ram的时候,两个复位管脚允许我们能够独立复位每一个picoblaze处理器模块。当处理器的程序存储空间处在一个不确定或者混合的状态时,这个处理器就不能够继续执行程序了。
在一个实例化的处理器内更新picoblaze程序代码的基本算法如下:
1.为将要更新处理器声明复位管脚
2.通过从zynq ps到bram控制器的写操作更新处理器的块ram空间
3.一旦完成bram的写操作,取消处理器的复位,允许处理器重启并执行新的程序代码
尽管上面的步骤很简单,但是首先我们必须以正确的格式生成新的picoblaze程序,并且也能够包含到zynq soc ps部分的arm cortex-a9 mpcore处理器的程序代码中。解决这个问题的最简单方式就是将新程序以数组的形式写入到arm处理器的c程序代码中。 为了实现这个功能,我们必须处理一下由picoblaze汇编器生成的hex格式的文件,我们可以手动处理但是对于大型程序就显得比较笨拙了,因此我编写了一个简单的tcl脚本,将hex格式的文件转化为c的头文件,这个头文件可以加入到你的编译环境中。(这个脚本和所有程序我已经上传到github中了,会在本篇博客的结尾备注的)
准备好了正确格式的文件,并且包含到了arm cortex-a9 mpcore的程序当中,我们就可以轻松的读取这个数组内容,将它写入到合适的bram当中。因为我们使用的是32位的地址,每四个字节都是独立可编址的,并且每四个字节都是一个独立的地址空间。例如第一个32位的地址是0,第二个地址是4,第三个地址是8,这样一直进行下去。
我们可以使用下面这个函数将内容写入到bram当中:
xbram_writereg(pico_0_base, ram_addr, test2[read_out]);
我们可以使用for循环遍历整个数组,如下图所示:
以我们以前创建的系统示例为基础,使用这些结构,我们就能够简单快速的编写一个简单的程序,允许我们更新任意一个picoblaze内核的程序存储空间,本博客的程序实现的功能是每个picoblaze处理器控制他们各自的led灯,以或快或慢的频率闪烁。
当然这并不意味着在处理器执行期间我们能够下载新的镜像文件到picoblaze处理器中, 如果要实现这样的功能,我们必须编写一个稍有不同的程序和tcl脚本,我们将在下一篇博客当中介绍。
快要有60篇博客了,我觉得如果有一个git hub存储空间将是一个非常好的想法,所以我已经创建了一个,地址是“ https://github.com/ataylorcengfiet/microzed-chronicles ”,我会将以前博客的代码上传,但是现在这个存储空间中只有本次博客的程序源代码。
Carmicro出0.4mm间距芯片级封装EMI滤波器
多重生物识别技术及未来发展前景
便于观看度数的智能水表的原理及设计
河南省首套人脸智能识别系统落户南阳理工
艾迈斯欧司朗举办2022“万物光感”光学技术研讨会, 全景式光学传感解决方案“秀肌肉”
Adam Tayloy玩转MicroZed系列59:Zynq与PicoBlaze第4章
过压或欠压动作电路
NVIDIA发布RTX 30系列游戏本
中国光伏装机量增长量与全球比较
台湾今年LED总产值仍维持全球第一
ARM推出下一代旗舰设计方案 华为麒麟是否会有影响
步进电机驱动器的三种驱动模式
艾迈斯推出具有卓越噪声性能的A30新型高性能模拟技术
基于新型量子模拟平台,首次发现三重向列序量子超流体
800mA低压降固定/可调稳压器 1117-3.3/5
组织机构如何防范社会工程攻击?
抽水蓄能静止变频器SFC国产化势在必行
选购电容器时需要注意哪些参数
差压式孔板流量计的工作原理
博特激光:紫外激光打标机在玻璃行业的应用