请选择 进入手机版 | 继续访问电脑版
[X]关闭
0

S02-CH01 HelloWold/DDR/网口测试及固化

摘要: 软件版本:VIVADO2017.4操作系统:WIN10 64bit硬件平台:适用米联客 ZYNQ系列开发板米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!1.1 概述 ZYNQ系列FPGA与其他系列FPGA最大的区别在于内部 ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

1.1 概述

      ZYNQ系列FPGA与其他系列FPGA最大的区别在于内部具有双核Cortex-A9硬核。本课详细讲解如何搭建一个最小的SOC系统,并且使用软件自带的工程HelloWorld工程、MemTest内存测试工程、DRAMTest内存测试工程、LWIP网络协议工程对SOC的基本外设进行测试。对工程搭建及ZYNQ IP参数配置细节进行了详细的说明,是SOC开发必看的课程,通过本课,你将掌握如何创建一个SOC最小系统工程与SDK软件的基本使用。

      从本课开始,是裸机部分,如果你拿到的开发板,TF卡还插在开发板上,请拿掉后调试,否则程序依然会从TF卡启动,影响裸机调试。

1.2 最小系统分析

      这张图展示了我们需要构建的最小系统。并且下面的嵌入式实验会基于这个最小系统进行添加外设。

       本实验中将会只使用到PS部分资源包括了ARM Cortex-A9、DDR3内存、一个UART串口。这就是我们的最小系统。首先我们程序会加载到DDR内存中,然后CPU一条一条执行,那么执行的情况我们可以通过串口打印观察。

1.3 硬件电路分析

1、开发板使用资源

PS端DDR:例程使用PS端DDR。开发板PS端DDR容量为1GB(MZ7XA-7010mini内存为512MB)。

PS端网口:例程使用PS端一路网口。

PS端串口:例程使用PS端一路串口。

 

2、硬件连接

串口线:一端连接电脑串口,另一端连接开发板串口(USB-232)。

网口线:一端连接电脑网口,另一端连接开发板PS端网口。

1.4 创建VIVADO工程

Step1:在打开的VIVADO软件界面,单击Create Project。

Step2:单击NEXT,在弹出的窗口中输入工程名和选择保存路径,然后单击Next。

Step3:

Step4:选择芯片类型,然后单击OK。

MZ7XA-7010mini、MZ7XA-7010采用的FPGA芯片为XC7Z010-CLG400-1如下图所示设置

MZ7XA-7020、MZ7XB-7020采用的FPGA芯片为XC7Z020-CLG400-2如下图所示设置

Step5:单击Finish完成工程的创建

Step6:单击IP INTEGRATOR àCreate Block Design,输入System。   

Step7: 单击下图中添加IP按钮

Step8:搜索单词ZYNQ选择ZYNQ7 Processing System,然后双击

Step9:添加进来了ZYNQ CPU IP,然后单击Run Block Automation ,直接单击OK。

Step10:在Block文件中,我们进行连线,将鼠标放在引脚处,鼠标变成铅笔后进行拖拽,连线如下图所示。连线的作用就是把PS的时钟可以接入PL部分,当然这里我们暂时用不到PL部分的资源。

Step11:双击ZYNQ CPU IP,对其进行设置,使其对应我们的硬件设置。我们需要做的就是修改时钟频率,内存类型和接口输出。需要注意的是,如果时钟频率与内存类型与我们的硬件不一致时,SDK中的程序会崩溃,运行不过来。在后续的调试中,如果遇到程序奔溃的情况需要检查下你的DDR型号,以及时钟频率。

正确的配置是成功的必要条件。

PS时钟配置:

PS 输入频率:33.333333MHZ

CPU PLL时钟:666.666666MHZ(这个时钟对于MZ7XA-7020和MZ7XB-7020最大可以设置776MHZ)

PL Fabric Clocks-FCLK_CLK0:100MHZ 这个时钟可以用于提供给PLL使用

PS内存配置:

开发板内存型号配置:

MZ7XA-7010mini的内存为512MB,选取内存型号(兼容型号):MT41K128M16 JT-125,如下图:

MZ7XA-7020、MZ7XB-7020、MZ702N、MZ702P、MZ7015、MZ7035、MZ7100的内存型号为1024GB,选取内存型号(兼容型号):MT41K256M16RE-125如下图:

Step12:设置外设接口,之后点击OK。

电压配置:首先注意,这里的Bank0对应原理图闪的Bank500,BANK1对应原理图上的Bank501

如果读者对于PS(ARM)的IO分配有不清楚的,请查看硬件硬件设计原理图,会阅读原理图也是开发必备技能之一。

Bank0 IO Voltage为LVCMOS3.3V

Bank1 IO Voltage为LVCMOS1.8V

QSPI FLASH配置:

以太网配置:

SD(TF)卡配置:

串口配置:

以上配置完成后单击OK

Step13:右击 system.bd, 单击Generate Output Products。

Step14:选择Global。等待生成成功,点确认。

Step15:右击system.bd 选择 Create HDL Wrapper 这步的作用是产生顶层的HDL文件

Step16:选择Leave Let Vivado manager wrapper and auto-update 然后单击OK

Step17:我们查看源码的层次结构,可以看到system_wrapper.v就是顶层文件,调用了CPU.

Step18:查看system_wrapper.v源码

//Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.

//--------------------------------------------------------------------------------

//Tool Version: Vivado v.2017.4 (win64) Build 2086221 Fri Dec 15 20:55:39 MST 2017

//Date        : Mon May  7 13:24:38 2018

//Host        : LB-201801171546 running 64-bit major release  (build 9200)

//Command     : generate_target system_wrapper.bd

//Design      : system_wrapper

//Purpose     : IP block netlist

//--------------------------------------------------------------------------------

`timescale 1 ps / 1 ps


module system_wrapper

   (DDR_addr,

    DDR_ba,

    DDR_cas_n,

    DDR_ck_n,

    DDR_ck_p,

    DDR_cke,

    DDR_cs_n,

    DDR_dm,

    DDR_dq,

    DDR_dqs_n,

    DDR_dqs_p,

    DDR_odt,

    DDR_ras_n,

    DDR_reset_n,

    DDR_we_n,

    FIXED_IO_ddr_vrn,

    FIXED_IO_ddr_vrp,

    FIXED_IO_mio,

    FIXED_IO_ps_clk,

    FIXED_IO_ps_porb,

    FIXED_IO_ps_srstb);

  inout [14:0]DDR_addr;

  inout [2:0]DDR_ba;

  inout DDR_cas_n;

  inout DDR_ck_n;

  inout DDR_ck_p;

  inout DDR_cke;

  inout DDR_cs_n;

  inout [3:0]DDR_dm;

  inout [31:0]DDR_dq;

  inout [3:0]DDR_dqs_n;

  inout [3:0]DDR_dqs_p;

  inout DDR_odt;

  inout DDR_ras_n;

  inout DDR_reset_n;

  inout DDR_we_n;

  inout FIXED_IO_ddr_vrn;

  inout FIXED_IO_ddr_vrp;

  inout [53:0]FIXED_IO_mio;

  inout FIXED_IO_ps_clk;

  inout FIXED_IO_ps_porb;

  inout FIXED_IO_ps_srstb;


  wire [14:0]DDR_addr;

  wire [2:0]DDR_ba;

  wire DDR_cas_n;

  wire DDR_ck_n;

  wire DDR_ck_p;

  wire DDR_cke;

  wire DDR_cs_n;

  wire [3:0]DDR_dm;

  wire [31:0]DDR_dq;

  wire [3:0]DDR_dqs_n;

  wire [3:0]DDR_dqs_p;

  wire DDR_odt;

  wire DDR_ras_n;

  wire DDR_reset_n;

  wire DDR_we_n;

  wire FIXED_IO_ddr_vrn;

  wire FIXED_IO_ddr_vrp;

  wire [53:0]FIXED_IO_mio;

  wire FIXED_IO_ps_clk;

  wire FIXED_IO_ps_porb;

  wire FIXED_IO_ps_srstb;


  system system_i

       (.DDR_addr(DDR_addr),

        .DDR_ba(DDR_ba),

        .DDR_cas_n(DDR_cas_n),

        .DDR_ck_n(DDR_ck_n),

        .DDR_ck_p(DDR_ck_p),

        .DDR_cke(DDR_cke),

        .DDR_cs_n(DDR_cs_n),

        .DDR_dm(DDR_dm),

        .DDR_dq(DDR_dq),

        .DDR_dqs_n(DDR_dqs_n),

        .DDR_dqs_p(DDR_dqs_p),

        .DDR_odt(DDR_odt),

        .DDR_ras_n(DDR_ras_n),

        .DDR_reset_n(DDR_reset_n),

        .DDR_we_n(DDR_we_n),

        .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),

        .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),

        .FIXED_IO_mio(FIXED_IO_mio),

        .FIXED_IO_ps_clk(FIXED_IO_ps_clk),

        .FIXED_IO_ps_porb(FIXED_IO_ps_porb),

        .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb));

endmodule

可以看到顶层文件的源码调用了CPU接口,所有外设的接口也都是通过顶层文件引出来的。

Step19:Run Implementation(执行)->Generate Bitstream(生成bit流)。生成bit流文件成功。

1.5 新建SDK工程

Step1: File->Export->Export Hardware,导出硬件。

Step2:勾选Include bitstream 直接单击OK

Step3:File->Launch SDK加载到SDK

Step4:单击OK

1.6 Hello World实验

Step1:导出完成后如下图

图中标“1”区域:硬件部分,这部分就是从VIVADO定制好的SOC硬件

图中标“2”区域:这部分是硬件的地址空间分配

Step2:选择File->New->Application Project

Step3:工程命名为HelloWorld,然后单击NEXT

Step4:系统里面有很多自带的测试程序,本次就用自带的Helloworld程序做测试,单击Finish。

选项“Empty Application” 创建一个空的SDK工程。

选项“Hello World” “lwIP Echo Server”等是系统自带的测试工程,可以用来测试串口、网口、内存等。

选项“Zynq FSBL”在固化文件时使用。

Step5:完成后

Step6:右击HelloWorld->Generate linker Script


Step7:可以看到所有可用内存的情况,代码、数据、堆栈运行所在内存的情况。不做人为改动,关闭。

Step8:进入调试前,需要给开发板通电;连接好开发板上的串口(USB-232),查看串口号(设备管理器中查看);连接PS端的网口。

Step10:双击Xilinx C/C++  application(System Debugger) 这个位置新建,生成HelloWorld的调试文件

Step11:然后进行如下设置

Step12:进入SDK调试界面

1、启动2、暂停3、停止4、代码5、信息控制台6、调试变量

Step13:启用系统自带的串口调试助手,进行相关的设置。

图中标“1”:系统自带的串口调试助手窗口。

图中标“2”:创建一个串口连接。

图中标“3”:串口参数设置(查看设备管理器中串口号)。

Step13:单击运行,查看输出结果

1.7 MemTest内存测试程序

MemTest内存测试程序工程建立方法与HelloWorld工程建立方法相同。

Step1:新建一个名为Mem_Test的工程

Step2:仍然采用自带的测试函数测试

Step3:Debug Configurations中,双击Xilinx C/C++  application(System Debugger) 这个位置新建,生成Mem_Test的调试文件

Step4:测试结果

1.8 DRAMTest内存测试程序

DRAM_Test内存测试程序工程建立方法与HelloWorld工程建立方法相同。

Step1:新建一个名为DRAM_Test的工程

Step2:仍然采用自带的测试函数测试

Step3:Debug Configurations中,双击Xilinx C/C++  application(System Debugger) 这个位置新建,生成DRAM_Test的调试文件

Step4:测试结果

根据提示可以在控制台中输入相关序号按回车进行(r,i测试会有一部分错误,和程序空间有关系)

1.9 LWIP协议对千兆网口测试

LWIP千兆网口测试工程建立方法与HelloWorld工程建立方法相同。

Step1:新建一个名为LWIP_Test的工程

Step2:选择LWIP Echo Server 之后单击Finish

注意!

       MZ7X系列工业级开发板板载网口芯片是RTL8211FDI,由于默认的驱动不支持 RTL8211 FDI的寄存器配置,所以无法支持自动适应速度 (通过自己修改库可以实现自动适应但是工作量大,考虑到投入时间和产出比,这里就不修改了)。所以需要手动修改 LWIP 库让网口芯片工作于1000Mbps。

修改如下所示:

出现如下界面。

单击lwip,将temac_adapter_options->phy_link_speed 设置为 1000Mbps(定速模式)。点击OK,设置完成。

选中bspà右键à Re-generate BSP Sources。重新生成一下BSP包(一般情况下,修改完会自动更新,如果没有更新,手动更新一下)。

Step3:Debug Configurations中,双击Xilinx C/C++  application(System Debugger) 这个位置新建,生成DRAM_Test的调试文件

Step4:运行之后的串口打印信息。从打印信息可以看出,开发板的IP地址是192.168.1.10。

Step5:用网络助手实现回传测试。

设置电脑的IP地址192.168.1.100

网络调试助手:

本地主机地址à电脑的IP地址

远程主机地址à开发板IP地址

1.10 使用快捷按钮调试

瓢虫图标是debug,三角形图标是运行模式,可以方便调试。

1.11 固化程序

ZYNQ程序固化的详细步骤在“01_example_FPGA_BASE” 之 “CH05 FPGA程序的固化和下载”中有详细介绍,这里不再累述。


路过

雷人

握手

鲜花

鸡蛋

最新评论

本文作者
2019-9-6 19:13
  • 7
    粉丝
  • 6410
    阅读
  • 0
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜