ZYNQ进阶之路10--AMP模式 双核同时运行

ZYNQ进阶之路10--AMP模式 双核同时运行

  • 导语
  • ZYNQ双核启动方式简介
    • 非对称多处理器启动(AMP启动)
    • 对称多处理器启动(SMP启动)
    • 两种启动方式的比较
  • AMP启动的实现

导语

之前章节中涉及到PS端的裸机程序都是在CPU0上运行的,弄的差点就忘了ZYNQ是拥有两个A9硬核的强劲芯片,所以我们必须要学会怎么让两个CPU核心同时运行,不然就和之前开发单片机有什么区别呢?本章我们就来探索如何实现双核的AMP启动(PS:博主以前是开发单片机和FPGA过来的)。

ZYNQ双核启动方式简介

非对称多处理器启动(AMP启动)

这个模式启动可以用语使用多个CPU核的系统上,比如像ZYNQ这样的多核芯片上,在这种模式下,每个CPU核可以运行自己的操作系统,比如可以CPU0跑裸机而CPU1跑FreeRTOS系统,再比如CPU0跑FreeRTOS系统而CPU1跑LINUX系统;而CPU之间的通讯是通过共享内存的方式进行的。

对称多处理器启动(SMP启动)

在该启动模式下所有的CPU必须是完全相同的构架,并且所有CPU必须运行单个操作系统一起运行,这个操作系统把进程任务分派到各个CPU上,并且加以协调。和AMP一样,CPU之间是通过共享内存来做通信,以及任务执行的协调。所以SMP的启动方式不适合在裸机以及RTOS环境下实现。

两种启动方式的比较

下图描述了AMP和SMP的不同,以及他们在ZYNQ平台上的对应关系:
ZYNQ进阶之路10--AMP模式 双核同时运行_第1张图片
其性能的不同如下所示:
ZYNQ进阶之路10--AMP模式 双核同时运行_第2张图片

AMP启动的实现

我们本节工程是基于 ZYNQ进阶之路7 章节的内容实现的,在ZYNQ进阶之路7 章节中我们输出了两路PWM波实现呼吸灯的功能,在本章节中我们分别使用CPU0和CPU1控制两个LED等实现两个呼吸灯的功能,我们再通过逻辑在PL端增加两个端口输出PWM控制LED,这两个LED实现和前面两个LED同步呼吸的功能。
首先打开 ZYNQ进阶之路7 中的工程如下所示:
ZYNQ进阶之路10--AMP模式 双核同时运行_第3张图片
新建verliog文件输入以下代码,代码中的50M时钟我们使用PL端的50M晶振提供,所以和PS端属于异步时钟,因为PS端提供给PL端的时钟也为50M,所以这里我们对其进行简单的跨时钟域处理,多周期同步,对两个PWM信号进行打两个时钟节拍的方式实现同步,这种方式能解决一些简单的异步时钟域问题:
ZYNQ进阶之路10--AMP模式 双核同时运行_第4张图片
将PWM.v文件加入Diagram窗口中:

ZYNQ进阶之路10--AMP模式 双核同时运行_第5张图片
将信号线引出到指定接线上:
ZYNQ进阶之路10--AMP模式 双核同时运行_第6张图片
对引脚进行绑定:
在这里插入图片描述
然后生成硬件bit文件,导出硬件,打开SDK进行软件编程:
ZYNQ进阶之路10--AMP模式 双核同时运行_第7张图片然后分别创建CPU0和CPU1的两个工程,在下图中选择:
ZYNQ进阶之路10--AMP模式 双核同时运行_第8张图片
创建后如下图所示,其中1为CPU0的工程,2为CPU2的工程:
ZYNQ进阶之路10--AMP模式 双核同时运行_第9张图片
在CPU0的工程中输入如下代码:
ZYNQ进阶之路10--AMP模式 双核同时运行_第10张图片
在CPU1工程中输入如下代码:
ZYNQ进阶之路10--AMP模式 双核同时运行_第11张图片
修改CPU0的DDR3基地址:
ZYNQ进阶之路10--AMP模式 双核同时运行_第12张图片
修改CPU1的DDR3基地址(注意两个CPU的地址不能发生冲突):
ZYNQ进阶之路10--AMP模式 双核同时运行_第13张图片
右键点击CPU1工程,选择BSP setting选项:
ZYNQ进阶之路10--AMP模式 双核同时运行_第14张图片
在此处添加如下附加信息:
ZYNQ进阶之路10--AMP模式 双核同时运行_第15张图片
然后就可以将两个工程编译后,在run config中设置如下选项:
ZYNQ进阶之路10--AMP模式 双核同时运行_第16张图片
然后点击run即可将程序下载到芯片中了,这是可以看到4个LED一两个一对的方式实现呼吸灯功能了。在下一章节我们将讲解如何将双核程序固化到SPI flash中。如果对博主的文章满意的话别忘了点赞评论哦!也希望有识之士能提出博主的问题共同进步,博主交流邮箱:[email protected],如果你有什么新奇的想法和技术可以和博主交流!

你可能感兴趣的:(zynq,FPGA,ZYNQ进阶之路)