Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

时间:2024-03-27 08:27:20

双CPU工作

 建立工程

为双CPU分别建立Board Support Package

Standalone_bsp_cpu0

Standalone_bsp_cpu1

分别在package工程上建立应用工程

Hello_cpu0

Hello_cpu1

双处理器同时在线调试DEBUG

选择配置选项Run >debug Configuration的Device Initialization选项卡的Reset Type选项,将Reset Entire System改为Reset Processor Only。

注:SDK2013.4下,在不烧写PL配置程序下可直接下载程序,cpu0,cpu1按先后顺序在线运行后,不需任何唤醒设置,即可同时运行。

SDK2013.4同时调试。

Help中搜索Multi-Processor,查看多核处理器的调试,如图所示。

Step1:选择配置。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

Step2:配置软件。选择处理器,分别勾选各自的下载程序,点击Debug即开始调试。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

SDK2014.4同时调试,可能cpu1的运行必须由cpu0**。

在地址分配,或根据程序大小分配:

从应用工程下的lscript.ld文件,更改hello_cpu0与hello_cpu1的DDR地址,其它不变。

cpu0

ps7_ddr_0_S_AXI_BASEADDR    base address(0x00100000)   size(0x00100000)

cpu1

ps7_ddr_0_S_AXI_BASEADDR    base address(0x00200000)   size(0x00100000)

Downloading Program -- F:/zynq_work/zynq_test/AXI_project_1/project_1.sdk/hello_cpu1/Debug/hello_cpu1.elf

section, .text: 0x00200000-0x0020170b

section, .init: 0x0020170c-0x00201723

section, .fini: 0x00201724-0x0020173b

在cpu0中添加**程序。

第一步:Disable Cache on OCM

使用函数:  Xil_SetTlbAttributes(0xFFFF0000,0x14de2);   

第二步:载入CPU1程序的存储地址到CPU1处理器的入口地址:

  *(unsigned int*)(0xFFFFFFF0) = (unsigned int) 0x200000;

第三步:cpu0发出唤醒命令,唤醒cpu1

     print("CPU0: sending the SEV to wake up CPU1\n\r");

    sev();

需要定义:#define sev() __asm__("sev")

 

在SDK2014.1下在线运行cpu1,然后再在线运行cpu0,同时工作起来。注意顺序不能颠倒,否则不能唤醒cpu1.

同时在线运行:

运行cpu1时,软件run configuration中,需要设置处理器0,否则软件报错不能在线运行。不影响硬件的双CPU同时工作。

 

实际运行验证

按加密启动方式生成镜像文件。

使用RSA加密镜像。

the_ROM_image:

{

[pskfile]F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\psk.pk1

[sskfile]F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ssk.pk1

[bootloader, authentication=rsa]F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\fsbl_rsa_debug.elf

F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\hello_cpu0.elf

F:\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\hello_cpu1.elf

}

RSA镜像下载到QSPI:

XMD Console

1. cd F:/zynq_work/zynq_key_test/key_tool/rsa_zedboard/ready_for_download

2.  connect arm hw

3.  source ps7_init.tcl

4.  ps7_init

5. dow u-boot.elf

6. con

7.  stop

8.  dow -data  cpu2_rsa_boot0.bin  0x2000000;0x2000000是DDR中20M的位置,将认证文件下载到DDR的20M(0x2000000)处。

9. con

COM终端

程序已下载到DDR中,通过串口终端对ARM的u-boot进行操作,使DDR中的程序写到QSPI中。

1. sf probe 0                              ;获得QSPI的操作对象

2. sf erase 0 0x800000                      ;对QSPI从0开始擦除8M的长度。

3. sf write 0x2000000 0x8000 0x600000      ;将DDR的20M开始的,长度为6M(0x600000)的内容写入32K(0x8000)开始的QSPI中,即将认证文件写入QSPI。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

 

重启后,同时正常工作。

工程:Note/zynq_test/SDK2014_CPU2work.rar

FSBL配置

 

  1. FSBL启动文件具有通用性,与PL、PS的配置变化没直接关系。
  2. FSBL如需使启动的文件支持RSA加密,需要添加变量常数:RSA_SUPPORT

Properties>C/C++ Build>Setting>symbols>添加

     3. 测试启动时间常数:FSBL_PERF

     4. 其它参数配置:查看fsbl.h中的说明

FSBL_DEBUG_GENERAL       /* general debug  messages */

FSBL_DEBUG_INFO /* More debug information */

DEBUG

RSA_SUPPORT

SDK技巧

SDK软件工程的直接运行:

SDK软件工程可在未下载bit文件的情况下,直接运行软件工程,或仅下载SDK软件程序,也能直接正常运行。

原因: Ps7处理器初始化,从vivado导出hw_platform后,该文件夹生成的ps7_init.tcl文件可以对处理器进行初始化。如果未下载FPGA的bit文件时,在该硬件平台生成的软件可直接运行在处理器上,此时处理器的MIO口的配置,全依赖于ps7_init.tcl文件。此时zynq7在没有bit文件下,完全用作ARM处理器。

ARM处理器的配置情况:查看hw_platform_0/ps7_init.html文件

驱动情况:查看文件bsp/system.mss

SDK_ps7全局计时器的使用

程序:全局时钟头文件xtime_l.c/h

定义:计数器计数频率为内核主频/2

#define COUNTS_PER_SECOND          (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2)

参考1:FSBL的 FSBL_PERF时间常数设置。

参考2:sleep()函数

    函数:

   XTime_SetTime(XTime Xtime) 一般不设置。

复位、写时间值到全局时钟计数器寄存器。

多处理器下,任意一处理器使用该函数,将复位所有处理器。

   XTime_GetTime(XTime *Xtime) 获取当前时钟计数器值

实例1:秒延时文件sleep.c

#include "sleep.h"

#include "xtime_l.h"

#include "xparameters.h"

int sleep(unsigned int seconds)

{  XTime tEnd, tCur;

  XTime_GetTime(&tCur);

  tEnd  = tCur + ((XTime) seconds) * COUNTS_PER_SECOND;

  do  {    XTime_GetTime(&tCur);

  } while (tCur < tEnd);

  return 0;

}

实例2:时间测量函数fsbl/main.c

#include "xtime_l.h"

XTime tCur = 0;

XTime_GetTime(&tCur);

XTime tEnd = 0;

FsblMeasurePerfTime(tCur,tEnd);

 

void FsblMeasurePerfTime (XTime tCur, XTime tEnd)

{ double tDiff = 0.0;

double tPerfSeconds;

XTime_GetTime(&tEnd);

tDiff  = (double)tEnd - (double)tCur;

/*  * Convert tPerf into Seconds  */

tPerfSeconds = tDiff/COUNTS_PER_SECOND;

/*  * Convert tPerf into Seconds  */

tPerfSeconds = tDiff/COUNTS_PER_SECOND;

printf("%f seconds \r\n",tPerfSeconds);

      }

数学库的使用

添加数学库函数:

C/C++ Build>setting>ARM gcc linker>libraries>添加库“m”

头文件中加入<math.h>

 

封装IP

1. 在工程中添加源程序(add sources),可添加外部IP

(Configurable IP,DSP composite,embedded sub-design)

格式: .xco  .xci  .mdl  .slx  .bd

2. 创建IP 轮廓(IP Definition)

选择Tools-->Create And Package New IP。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

如需将当前工程封装为IP,选择封装当前工程,点击finish将把整个工程生成对应IP Definition。

如需将其他文件封装为IP,选择程序文件目录,点击finish将在指定的目录建立IP Definition,并自动为IP新建一个工程。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

封装IP

在Flow Navigator的Project Manager中选择Package IP。然后可在Package IP中设置IP名,查看使用的文件等,最后点击最后一项的Package IP按钮,将产生封装好的IP。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

查看生成的IP

在IP Integrator中创建IP模块文件,bd文件

添加生成的IP文件

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

双击IP后产生配置说明,该模块中可以定义位宽。

可以定义位宽是因为在verilog程序中定义了常量parameter。

Vivado 提高笔记2—SOC—快速入门(Zynq 7000系列)

生成IP文件

在.runs\synth_1目录生成黑箱文件(checkpoint file):axi4lite_reg_if_v1_0.dcp

该文件可以作源文件如HDL文件一样添加和使用。

在.srcs\sources_1\bd\z_system\ip\z_system_axi4lite_reg_if_v1_0_0_0目录查找到

IP文件:z_system_axi4lite_reg_if_v1_0_0_0.xci

该目录是新建bd文件后,在z_system.bd中添加生成的IP而产生。