DE-10 Standard HPS SOC和FPGA联合使用例程

DE-10 Standard HPS SOC和FPGA联合使用例程,第1张

在开始本教程之前,请注意演示项目准备需要以下内容:

在Intel SoC FPGA中,HPS逻辑与FPGA结构通过AXI(Advanced eXtensible Interface)桥进行连接。为了实现HPS逻辑与FPGA 结构的通信,需要通过使用Intel系统集成工具Qsys添加HPS组件来进行系统设计。从HPS组件的AXI主端口,HPS可以访问那些连接到AXI主端口的内存映射从端口。

HPS包含以下HPS-FPGA AXI桥

下图显示了FPGA结构和L3与HPS互连的AXI桥的框图。每个主(M)接口和从(S)接口显示其数据宽度。括号中标注了每个互连的时钟域。

HPS-to-FPGA桥由3级(L3)主开关控制,轻量级控制HPS-to-FPGA桥由L3从外围从开关控制。

FPGA-to-HPS桥接控制L3主开关,允许任何在FPGA结构的主实现(implemented)去访问在HPS中大多数从实现。

所有三个桥都包含全局程序员视图GPV寄存器。GPV寄存器控制网桥的行为。通过轻量级的HPS-to-FPGA桥访问可以所有三个桥的GPV寄存器。

这个例程向用户介绍了如何使用HPS/ARM与FPGA进行通信。这个与DE10-Standard板上ARM C程序配套的GHRD工程,演示了HPS/ARM程序如何控制连接到FPGA部分的红色LED。

术语GHRD是黄金硬件参考设计(Golden Hardware Reference Design)的简称。友晶科技为DE10-Standard开发板提供的GRD项目位于CD文件夹中: CD-ROM\Demonstration\SOC_FPGA\ DE10_Standard_GHRD。

本项目由以下组成部分组成:

MPU所看到的SoC FPGA部分的系统外围设备的内存映射从轻量级的HPS-to-FPGA到FPGA的基础地址0xFF20_0000开始。MPU可以通过Qsys中的地址偏移来访问这些外围设备。用户可以打开GHRD项目与Quartus II软件。然后打开soc_system。qsys文件与qsys工具。下图列出了连接到轻量级HPS-to-FPGA的外围设备的地址映射。

这些外设的所有Avalon引出信号( Avalon Conduit signals)都连接到DE10-Standard板上SoC FPGA的I/O引脚,如图所示

在实际的应用过程中,友晶科技提供的DE10_Standard_GHRD工程并不是十分契合我们的开发需要,这可能包括外围设备的冗余和不足。下面为了实现本教程开篇所定的目标,我们需要根据DE10_Standard_GHRD工程进行修改。其中友晶科技提供的DE10_Standard_GHRD工程实现的是LEDR0通过闪烁模拟板子的心跳, LEDR1-9 按照一定频率进行左移右移循环闪烁60次;我们的目标是LEDR0通过闪烁模拟板子的心跳, LEDR1-8 按照一定频率进行左移右移循环闪烁60次, LEDR9 在LEDR1-8的每一次循环后闪烁一次。可以看出,我们只需要将DE10_Standard_GHRD工程中的LEDR9的设计进行更改就可以打到我们的目的。下面正式开始更改 *** 作。

新建文件夹: E:\work\Quartus\My_GHRD ,然后将DE10_Standard_GHRD工程目中的一下文件复制到工程目录下:

因为其中的文件DE10_Standard_GHRD.v后面将会被指定为顶层文件,所以需要将其更改为与工程名My_GHRD相同的My_GHRD.v文件,同时为了与工程名保持协调,我们也将文件DE10_Standard_GHRD.sdc更改为与工程名My_GHRD相同的My_GHRD.sdc。最终工程目录文件夹如下图所示:

首先,建立一个名为:My_GHRD的工程。打开软件Quartus Prime Standard Edition,点击:File→New Project Wizard…,进入工程创建引导界面。

点击引导界面下方的:Next,进入Directory, Name, Top-Level Entity设置界面。

点击右侧按钮:…选择你的工程目录 E:/work/Quartus/My_GHRD 。之后设置工程名: My_GHRD 。此时软件将自动把顶层设计entity name设置为工程名: My_GHRD 。继续点击:Next,进入Project Type设置界面。

在Project Type界面选择:Empty Project选项,继续点击:Next,进入Add Files设置界面。

在Add Files设置界面,点击右侧按钮:…,添加工程目录下的文件:My_GHRD.v和soc_system.qsys以及文件夹hps_isw_handoff和ip下的所有文件进入工程。

然后点击:Next,进入Family, Device &Board Settings设置界面。

在Family, Device &Board Settings设置界面,我们要设置我们所用的SoC FPGA型号:5CSXFC6D6F31C6N。为了能够快速锁定我们要选择的SoC FPGA型号,我们可以点击:Device下拉列表,选择:Cyclone V SX Extended Features,以缩小选型范围。

然后,选择Available devices下的5CSXFC6D6F31C6。继续点击:Next,进入EDA Tool Settings设置界面。

在EDA Tool Settings设置界面下,我们保留默认设置。之后点击:Fnish,完成工程创建,退出工程创建引导界面。

由于我们需要在DE10_Standard_GHRD工程的基础上更改Qsys的设计来实现对LEDR9的单独控制,所以我们需要在Qsys中添加一个1位的PIO端口来实现对LEDR9的控制,同时需要将原来用于同时控制LEDR0-9的10位PIO端口的改为9位的PIO端口。

依次点击:Tools→Qsys,启动Qsys,之后选中要打开的soc_system.qsys文件。

此时将d出“ PIO(Parallel I/O) ”设置界面。将PIO的数据宽度Width设置为:1,数据输入输出方向Direction设置为:Output。最后点击右下角的Finish按钮退出设置。

现在,新的Qsys设计中将会出现我们新添加的PIO端口pio_0,我们可以对其进行重命名。光标移动到在端口名pio_0处,右键选择“Rename”,重命名为:led_pio9。点击空白处保存命名。

之后我们需要对led_pio9组件的信号进行连接,将光标放置到下图中led_pio9组件中clk信号所在行的白点处,点击后可以将led_pio9组件中clk信号与clk_0组件的clk信号进行连接,可以表示为:led_pio9.clk—clk_0.clk。使用类似的 *** 作,将led_pio9组件的其它信号分别与其它组件进行如下连接,最终的连接关系如下:

如下图:

其中led_pio9有一个信号led_pio9.external_connection需要进行对外引出。光标置于信号led_pio9.external_connection处右击选择:Connections:led_pio9.external_connection→Export as: led_pio9_external_connection。

到此,添加一个1位的PIO端口led_pio9的 *** 作已经完成。

接下来需要将原来控制LEDR0-9的数据宽度为10位的PIO端口led_pio更改为只用控制LEDR0-8的数据宽度为9位的PIO端口led_pio。双击组件led_pio,将数据宽度Width(1-32 bits)设置为:9,关闭Parameters窗口将自动保存更改。

现在,我们要为我们新添加的PIO端口led_pio9分配基地址,同时更新Qsys设计中其它组件的基地址。依次点击:System→Assign Base Addresses。

可以看出,至此,我们需要在Qsys设计中做的更改已经完成了。现在,只要重新生成相应的HDL文件,更新Qsys设计就可以结束Qsys部分的设计了。但是后面对工程编译时软件将会输出错误提示:

Error (10228): Verilog HDL error at soc_system_sysid_qsys.v(34): module “soc_system_sysid_qsys” cannot be declared more than once。

更令人遗憾的是,目前本人还没有找到解决上述错误信息的办法。有一个无奈的办法就是:将Qsys设计中的soc_system_sysid_qsys组件删除。这不会影响Qsys设计的功能,关于该组件功能的详细介绍,读者可以自行查找,此处不再赘述。

删除soc_system_sysid_qsys组件的办法是:将soc_system_sysid_qsys组件sysid_qsys的Use列方框中的“√”去掉。

之后进行Qsys设计中的文件生成工作。点击右下角的Generate HDL…按钮。

在d出的“Generation”窗口中,确认Output Directory下Path所指定的生成文件的输出目录在工程目录下。然后点击Generate按钮。

接下来会d出“Save System Completed”窗口,点击右下角的Close按钮。

接下来会d出的“Generate”窗口,等待几分钟,文件生成工作完成后,右下角的“Close”按钮会高亮显示。此时,点击“Close”按钮。

最后,又会退回到Qsys设计页面,点击右下角的Finish按钮,退出Qsys设计。

在返回Quartus Prime Standard Edition主界面后,会提示我们把更新后的.qip和.sip文件重新手动添加到工程中来。点击提示窗口右下角的Close按钮。

现在,我们来手动添加更新后的.qip和.sip文件。右击Project Navigator窗口中工程名:My_GHRD。点击Settings…选项。

接下来会d出Category界面,点击右侧的…按钮。

此时会d出Select File界面,在指定的目录下找到生成的soc_system.qip文件并选中,然后点击右下角的“打开”按钮。

最后,可以在返回的Catagory界面中可以看到生成的soc_system.qip文件已经被成功添加到工程中。

在上述界面中可以看到文件:hps_reset_bb.qip和hps_reset_bb.v,这一组文件的定义了模块:hps_reset。但是,由于 文件:hps_reset.qip和hps_reset.v这一组文件同样也定义了模块:hps_reset,所以hps_reset_bb.qip和hps_reset_bb.v的加入会导致模块:hps_reset的重复定义。

现在我们需要将文件:hps_reset_bb.qip和hps_reset_bb.v进行移除。选中文件:hps_reset_bb.qip和hps_reset_bb.v,点击右侧的Remove按钮移除文件。最后,点击右下角的OK按钮退出该界面。

至此,工程My_GHRD中Qsys部分的设计已经完成。接下来我们需要对工程中的硬件描述文件.v文件进行修改。其实,我们在DE10_Standard_GHRD工程的基础上只用对My_GHRD中顶层实体文件My_GHRD.v中各个模块的引脚及其连接关系进行描述即可。

在此之前,我们先指定我们的顶层实体文件My_GHRD.v。点击Project Navigator窗口中Hierachy按钮,会d出下拉列表,我们点击File选项。

找到工程中的My_GHRD.v,右击选择Set as Top-Level Entity。

我们双击Project Navigator窗口中工程名My_GHRD,此时软件将会打开工程的顶层实体文件My_GHRD.v

对顶层实体文件My_GHRD.v的修改主要有以下各处:

第一,顶层实体模块的命名须与工程名My_GHRD保持一致。

第二,在模块soc_system u0中对新引出的PIO端口led_pio9_external_connection_export进行声明。可以发现,我们声明端口led_pio9_external_connection_export的同时需要为其指定一个wire类型的变量进行连接。对照led_pio_external_connection_export连接到wire类型的变量fpga_led_internal上,我们新定义了一个wire类型的变量fpga_led9_internal与端口led_pio9_external_connection_export进行连接。当然,wire类型的变量fpga_led9_internal可以理解为是一条导线,它的一端接到了模块soc_system u0中对新引出的PIO端口led_pio9_external_connection_export上,两外一端也是要为它连接适当的端口的。我们新增端口led_pio9_external_connection_export的目的就是能够对LED灯LEDR9进行控制,所以,不难想到,wire类型的变量fpga_led9_internal另一端一定是要连接到端口LEDR[9]上面的。这样,总体的更改就是下面这样的:

现在,我们可以对工程My_GHRD进行编译 *** 作。首先是进行工程的分析与综合,依次点击:Processing→Start→Start Analysis &Synthesis。

工程的分析综合通过后,主界面中左侧的Tasks窗口下的Analysis &Synthesis栏前面会展示一个绿色的“√”,后面会显示分析综合所用的时间。

上面分析综合成功后,下一步需要进行Fitter(Place &Route),这里进行的是关于FPGA内部的布局布线 *** 作。在此之前我们需要对我们模块中设计的输入输出引脚进行引脚分配。引脚分配的方法有很多种,读者可以自行学习。这里由于我们定义了大量的引脚,而且我们有现成的DE10_Standard_GHRD工程可以利用,我们只需将该工程里面的引脚分配信息转移进入我们的My_GHRD工程就可以了。

我们现在打开DE10_Standard_GHRD工程。进入工程后,我们点击:Assignments→Pin Planner,进入引脚分配界面。

在该界面下,点击:File→Export…。

之后会d出Export窗口。我们需要选择我们要导出的文件格式为:.tcl。

然后,点击右下角的Export按钮。

最后,依次点击引脚分配界面和DE10_Standard_GHRD工程界面右上角的关闭按钮,退出DE10_Standard_GHRD工程。

我们现在已经得到了我们需要的引脚分配文件DE10_Standard_GHRD.tcl,现在我们需要把它从DE10_Standard_GHRD工程目录下复制到My_GHRD工程目录下。为了与My_GHRD工程名保持一致,将其改名为:My_GHRD.tcl。

接下来,我们需要利用得到的引脚分配文件My_GHRD.tcl对工程My_GHRD中的引脚进行分配。点击:Tools→Tcl Scripts…。

在d出的Tcl Scripts窗口下,点击右侧的Add to Project…按钮。

在d出的Add to Project窗口下,选中我们的引脚分配文件My_GHRD.tcl,并点击右下角的打开按钮。

此时,软件又自动退回到Tcl Scripts窗口下。在Libraries栏中找到我们的引脚分配文件My_GHRD.tcl,点击下方的Run按钮来加载我们的引脚分配文件。

在后面d出的界面中点击OK按钮,退回到Tcl Scripts窗口。

最后点击到Tcl Scripts窗口下方的Close按钮退出到Tcl Scripts窗口,回到工程主界面。

此时,点击主界面的:Assignments→Pin Planner进入引脚分配界面。

在引脚分配界面中,可以看到,引脚大部分已经被分配完成,未分配的引脚暂时不用担心它们,我们还没有用到。

现在,我们开始对工程进行布局布线。点击:Processing→Start→Start Fitter。

工程的布局布线通过后,主界面中左侧的Tasks窗口下的Fitter(Place &Route)栏前面会展示一个绿色的“√”,后面会显示布局布线所用的时间。

到此,基本上我们可以判断在逻辑上我们的设计已经没有问题了,接下来我们是可以进行工程的全编译了。但是,在实际的应用设计中我们还要考虑对信号的时序进行约束,尤其是具有 SDRAM DDR3这种高速存取器件的设计中。对于时序约束,我们可以利用DE10_Standard_GHRD工程中的时序约束文件:DE10_Standard_GHRD.sdc。同样的,将其复制到My_GHRD工程目录下,改名为:My_GHRD.sdc。

将时序约束文件添加进入工程,右击Project Navigator窗口下的工程名:My_GHRD,点击:Setting…按钮。

接下来会d出Category界面,点击右侧的…按钮。

此时会d出Select File界面,进入工程主目录下,点击右下角的文件类型选择按钮,选中:Script Files( * .tcl .sdc .pdc*.qip)一项。

下找到时序约束文件My_GHRD.sdc并选中,然后点击右下角的“打开”按钮。

最后,可以在返回的Catagory界面中可以看到时序约束文件:My_GHRD.sdc文件已经被成功添加到工程中。依次点击右下角的Apply按钮和OK按钮退出该界面。

此时已经回到工程主界面,我们可以进行工程的全编译了。点击Processing→Start Compilation。

本节将介绍如何设计一个ARM C程序来控制PIO控制器led_pio。SoC EDS用于编译C项目。为了让ARM程序控制PIO组件led_pio,我们需要led_pio地址。使用Linux内置驱动程序’ /dev/mem '和mmap system-call可以将led_pio组件的物理基址映射到Linux应用软件可以直接访问的虚拟地址。

ARM C程序需要led_pio的组件信息,因为程序会尝试控制组件。这部分将会描述如何使用一个给定的Linux shell批处理文件将Qsys HPS信息提取到一个头文件中,这个头文件稍后将包含在C程序中。

上面提到的批处理文件名为:generate_hps_qsys_header.sh。它与DE10_Standard_GHRD工程位于同一个文件夹中。现在,我们要为工程My_GHRD生成头文件。首先,从DE10_Standard_GHRD工程目录下复制文件:generate_hps_qsys_header.sh到My_GHRD工程目录下。

接下来,使用记事本打开批处理文件:generate_hps_qsys_header.sh,确认文件中红线标注的路径下有应用程序:sopc-create-header-files.exe。其中,路径:/cygdrive/d/…表示D盘…。如果该路径下没有上述应用程序,读者需自行更改其中的路径。

注意,如果后面在SoC EDS命令shell中运行generate_hps_qsys_header.sh时,提示出现错误。(其实这个错误当时解决后忘记进行记录,好像是提示执行文件sopc-create-header-files的过程中sopcinfo2swinfo还是swinfo2

第一步:使用Quartus和Qsys工具完成硬件系统的配置。

该步骤实现SOC最小系统的硬件配置,包括硬核处理器配置、HPS和FPGA之间通信接口总线的选择、HPS外设裁剪、HPS时钟配置和SDRAM配置。该实验中主要用到HPS硬核,以及PIO外设IP核。Qsys工具为用户提供硬件系统的可视化设计,能够自动生成handoff文件,该文件配合bsp-editor工具可以生成preloader。Preloader是HPS的第二阶段引导源,主要作用为:初始化SDRAM接口,配置HPS IO口,加载下一引导源并跳转到它。

实验步骤

1 新建Quartus工程。

1.1 设置工程存放路径,工程名以及顶层文件名,如图1所示。

图 1

1.2 选择FPGA器件型号,如图2所示,DE10-Standard板载FPGA型号为5CSXFC6D6F31C6。

图 2

1.3 点击next直到finish,未提及的页面均按默认设置即可。

2 在Qsys中配置SOC。

2.1 运行Qsys工具。

在Quartus软件中,通过菜单栏Tools->Qsys打开Qsys工具。刚打开的Qsys工具页面如图3所示。

图 3

2.2 添加HPS并完成配置。

在左侧的IP目录中输入hps,选中Arria V/Cyclone V Hard Processor System,双击添加HPS,在d出的HPS配置页面中进行HPS配置。HPS配置页面如图4所示。

图 4

1) 在FPGA Interfaces页面中,General一栏均不勾选,AXI Bridges一栏设为64-bit、64-bit、32-bit,FPGA-to-HPS SDRAM Interface一栏中移除原有接口,Resets一栏中均不勾选。

2)在Peripheral Pins页面中,设置HPS外设引脚复用及模式选择。设置如表1所示。设置完成后页面如图5所示。(本实验其实未用到这些外设)

表1 外设引脚复用及模式选择

外设名称

引脚复用选择

模式选择

EMAC1

HPS I/O Set 0

RGMII

QSPI

HPS I/0 Set 0

1SS

SDIO

HPS I/0 Set 0

4-bit Data

USB1

HPS I/0 Set 0

SDR

UART0

HPS I/0 Set 0

No Flow Control

(注:表中未提及的外设即Unused,无需设置)

图 5 Peripheral Pins 页面设置

在HPS Clocks页面中,确认下Input Clocks->External Clock Sources 中的时钟频率为25MHz,其它无需设置,默认即可。

在SDRAM页面中,参考图6-11更改该页面下所有子页面中的参数。(本实验未用到SDRAM,所以不设置也可)

图 6

图 7

图 8

图 9

图 10

图 11

5) 至此,HPS设置完毕,点击finish离开HPS设置页面。

2.3 添加并设置其它Qsys元件

本实验通过HPS控制FPGA部分的IO口,以此来控制连接在FPGA IO引脚LED灯的亮灭。所以整个SOC只需包含HPS和PIO,即Qsys中还需要添加PIO外设。

添加PIO外设。在IP目录中输入PIO,选中PIO双击添加外设,设置页面如图12所示,本实验通过PIO控制4个LED,故宽度为4。

图 12

2.4 配置Qsys系统元件

修改元件名称。本实验把pio_0重命名为led_pio。

导出外设的顶层I/O接口。在Export一栏下相应位置双击,导出led_pio的顶层I/O接口,命名为fpga_led_pio,导出hps_0的h2f_reset接口,命名为hps_0_h2f_reset,如图13所示。

图 13

连接Qsys外设接口。外设的接口信号之间没有连接,需要根据系统要求手动进行连接。各个外设之间的信号连接c如表2所示。连接好后如图14所示。

表2 元件信号连接关系

需要连接的

   

被连接的

   

元件

   

信号名

   

元件

   

信号名

   

led_pio

   

clk

   

clk_0

   

clk

   

reset

   

clk_0

   

clk_reset

   

s1

   

hps_0

   

h2f_lw_axi_master

   

hps_0

   

h2f_lw_axi_clock

   

clk_0

   

clk

   

h2f_lw_axi_master

   

led_pio

   

s1

   

图 14

4)配置Qsys的地址映射。Qsys中添加的元件及外设都需要分配对应的基地址。这里我们采用自动分配的方式,在Qsys菜单中选择System->Assign Base Address,完成基地址自动分配。

5)生成Qsys系统。Save保存Qsys文件,命名为soc_led.qsys。然后点击菜单Generate->Generate HDL,d出如图15设置框,按图设置好后点击Generate,Qsys将生成与硬件系统相关的一系列文件。

图 15

3 完成Quartus工程编译

3.1 在Quartus工程中添加Qsys产生的系统模块。

1)Quartus中点击菜单Assignments->Settings,d出设置框,选中左侧Files一栏,添加Qsys文件soc_led.v和soc_led.qip,添加完成后如图16所示。

图 16

2)新建顶层文件。本实验采用的顶层文件类型为bdf(Block Diagram/Schematic File)。点击菜单File->New,选择Design Files中的Block Diagram/Schematic File后点击OK,点击菜单File->Save As将该文件保存到工程目录下,命名为top.bdf。在该原理图空白处右键Insert->Symbol,选择Qsys生成的soc_led.bsf,将该模块插入到顶层原理图文件中。选中插入的元件,右键点击Generate Pins for Symbol Ports,为元件添加输入输出端口,如图17所示。

图 17

3.2 工程分析综合后分配引脚

完成以上步骤后,需要分配引脚,包括HPS外设默认引脚分配以及FPGA部分引脚分配,在分配引脚之前,工程必须通过分析综合,否则引脚分配会出错。

图 18

然后按2)所示Tcl Scripts工具执行上面编写的脚本,完成FPGA部分LED引脚的分配。

3.3 工程编译。

完成以上所有 *** 作后,可以点击菜单Processing->Start Compilation对工程进行完全编译。编译成功后会生成FPGA编程所需的.sof文件。

4 完成FPGA编程。

这里只介绍采用JTAG方式完成FPGA编程方式,注意这种方式下,FPGA编程电路断电后就丢失。

点击菜单Tools->programmer,打开编程工具,选择连接至计算机的DE10开发板,如图19所示。Close硬件设置框。编程页面中Mode选择JTAG,点击Auto Detect按钮,在d出的器件选择框中选择相应的器件型号,DE10-Standard板载FPGA型号应选择5CSXFC6D6。选中FPGA设备,点击Change FIle,选中编译生成的top.sof文件,如图20所示。然后勾选Program/Configure,如图21所示。最后点击Start按钮开始编程。

图 19

图 20

图 21

实验细节注意:

在分配引脚之前必须先对工程进行分析综合(Analysis and Synthesis)

第二步:使用SOCEDS完成HPS软件开发

说明:

该步骤完成HPS软件部分的开发,SOC EDS提供了全套的软件开发工具。本实验只是通过HPS控制FPGA部分的IO口,系统架构简单,采用裸机开发方法。DS-5为SoC FPGA裸机开发提供了两套编译工具:ARM Compiler 和 Altera Baremetal GCC。本实验采用ARM Compiler。

实验步骤

1 运行软件开发工具DS-5。

打开Embedded_Command_Shell.bat,输入eclipse &命令回车,打开DS-5开发软件。如图1所示。 DS-5界面如图2所示。

图1

图2

2 新建C Project

点击菜单File->New->C Project,d出工程配置框如图3所示,按图完成设置,注意编译工具链选择ARM Compiler 5

图3

3 工程编译选项设置

3.1 添加HWLIB路径

因为本实验用到了SOC EDS提供的HWLIB中的API访问硬件,所以要在项目编译选项中添加HWLIB路径。HWLIB所在路径为:<SOC EDS安装路径>\ip\altera\hps\altera_hps\hwlib\include 和 <SOC EDS安装路径>\ip\altera\hps\altera_hps\hwlib\include\soc_cv_av

*** 作:在DS-5左侧的Project Explorer中选中LedWater工程,右键点击Properties。d出的对话框按图4设置,完成HWLIB路径的添加。

图4

3.2为工程编写分散文件scatter。

scatter文件为连接器指定映像的内存映射。本实验中,映像文件的加载区和执行区都在HPS的片内RAM上,而HPS片内RAM的地址映射为0xFFFF0000-0xFFFFFFFF,所以编写分散文件内容如下,分散文件编写完成后添加到编译选项中。

OCRAM 0xFFFF0000 0x1000

{

APP_CODE +0

{

*(+RO, +RW, +ZI)

}

ARM_LIB_STACKHEAP 0xFFFF8000 EMPTY 0x8000

{}

}

*** 作:点击菜单File->New->Other,d出对话框,按图5 *** 作。打开新建的scat文件,输入上面的分散文件内容。在DS-5左侧的Project Explorer中选中LedWater工程,右键点击Properties。d出的对话框按图6设置,完成scat文件路径的添加。

图5

图6

4 生成硬件设备描述头文件。

利用SOC EDS提供的swinfo2header工具,将Qsys硬件系统信息转换为软件开发所需的设备描述头文件。

*** 作:在嵌入式命令行shell中cd到soc_led.sopcinfo所在目录,然后输入如下命令:sopc-create-header-files soc_led.sopcinfo --single hps_0.h --module hps_0    如图7所示,同目录下将会生成名为hps_0.h的头文件,将其拷贝至软件工程目录下。

图7

5 编写main.c

为工程新建main.c文件,输入main.c代码,代码如下:

#include "hwlib.h"

#include "socal\socal.h"

#include "socal\hps.h"

#include "hps_0.h"

void delay(int delay_time)

{

int k

for(k=0k<delay_timek++)

}

int main()

{

int i = 0x1

while(1)

{

alt_write_word( ALT_LWFPGASLVS_OFST+LED_PIO_BASE, i )

if( (i&0xf) == 0x8 ) i=0x1

else

i = i<<1

delay(100000000)

}

return 1

}

6 工程编译连接

在DS-5左侧的Project Explorer中选中LedWater工程,右键点击Build Project,生成可执行文件ledWater.axf。

7 生成preloader

裸机工程中,preloader即u-boot-spl。在shell中输入bsp-editor启动工具,如图8所示。在打开的bsp-editor工具中,点击菜单File->New HPS BSP,选择handoff文件目录,如图9所示。设置中取消勾选WATCHDOG_ENABLE选项,如图10所示,因为我们没有在裸机应用程序中用到看门狗。设置完成后点击generate,产生我们设置的preloader源代码,生成的源代码路径显示在Information栏中。Shell中cd到preloadre源代码目录下,输入make -j8 (多线程编译提高编译效率),如图11所示,回车生成preloader二进制文件,需要等待几分钟。在<Quartuas工程目录>\software\spl_bsp\uboot-socfpga\spl目录下,可以看到已经生成了u-boot-spl二进制文件。将其拷贝至LedWater工程目录下。

图8

图9

图10

图11

8 编写调试脚本

为LedWater工程新建调试脚本,步骤如图12所示。打开新建的文件输入以下内容。

reset system

stop

wait 30s

set semihosting enabled false

loadfile "$sdir/u-boot-spl" 0x0

set semihosting enabled true

delete

tbreak spl_boot_device

run

wait

loadfile "$sdir/Debug/ledWater.axf"

Start

图12

完成以上所有 *** 作后,工程目录应该如图13所示。

图13

9 工程调试。

1) 在进行工程调试前,首先要确保板卡连接至计算机,并先下载硬件sof文件至fpga。然后新建调试配置项,选中LedWater工程,右键选择Debug As->Debug Configurationz,d出会话框,按图14和图15设置。设置完成后点击Debug开始调试。

图14

图15

2)进入调试页面后,如图16所示,点击红圈中Continue图标,开始运行main程序,DE10开发板上的4个LED灯依次循环点亮。

编写fpga部分的外设引脚分配脚本。根据硬件板卡的实际连接关系,编写引脚分配脚本,本实验用到DE10-Standard板卡上的4个LED,参考原理图,编写脚本如下:

set_location_assignment PIN_AA24 -to fpga_led_pio_export[0]

set_location_assignment PIN_AB23 -to fpga_led_pio_export[1]

set_location_assignment PIN_AC23 -to fpga_led_pio_export[2]

set_location_assignment PIN_AD24 -to fpga_led_pio_export[3]

set_location_assignment PIN_AF14 -to clk_clk

菜单点击Processing->Start->Start Analysis &Synthesis开始分析综合。

分析综合完成后,点击菜单Tools->Tcl Scripts,d出脚本运行框,如图18所示。分别运行hps_sdram_p0_parameters.tcl和hps_sdram_p0_pin_assignments.tcl。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11230106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存