Adam Tayloy玩转MicroZed系列59:Zynq与PicoBlaze第4章
在以前发布的玩转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 ",我会将以前博客的代码上传,但是现在这个存储空间中只有本次博客的程序源代码。
- Xilinx多协议机器视觉摄像机参考设计(12-01)
- 人工智能实现的流派 FPGA vs. ASIC看好谁?(08-27)
- 采用Xilinx Zynq SoC实现眼动追踪技术 让眼睛也可以控制计算机(06-28)
- EyeTech视线跟踪技术如何成为主流?(06-28)
- 基于赛灵思FPGA的端到端广播平台解决方案的实现(10-27)
- 玩转赛灵思Zedboard开发板(3):基于Zynq PL的流水灯(11-05)