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

首先纠正下千年同志的回答:

你的第一点,请看清楚楼主两个always块第一个是grade,第二个是grade1,grade2分别表示个位十位;

第二点:脉冲信号不能做判断条件这句,我拍这胸脯告诉你,绝对可以。。只有你用时序逻辑,在时钟沿检测脉冲信号就可以,只有保证脉冲宽度大于一个时钟周期就绝对能检测到。

第三点:楼主确实有这么点不完善,不过有些时候可以预先确知某些信号同时发生也可以不考虑的。

最后的你建议,先学C再改verilog,个人意见非常不赞同。。很多软件工程师特别喜欢把写软件哦思维带到硬件描述语言中来。。调用个函数啦。。写个for,写个while什么,最后还问为啥综合报错。。。除非你是专门做测试的用systemC或者systemverilog。that's all。

有点偏题了,说楼主的问题:

你的错误:第一点,最明显的地方是 第二个always块里面,你同时用了阻塞赋值和非阻塞赋值语句,这是典型错误。时序逻辑的always块里面都用<=,组合逻辑的always块都用=。

第二,第二个语句中X,Y两个变量的赋值的表达式根本没办法正确综合,一般%这个运算符号只能出现在仿真里(也很少用)除法/只能对2的整数幂进行相除,根本不能除以10,因为这里除法的本质就是除以2^n就等同于讲寄存器的值左移n位;请问这里10等于2的几次幂啊?!

第三个错误,第一个always块,作为组合逻辑,要把所有的敏感变量加进敏感变量列表里,而且组合逻辑你就不用边缘检测posedge 了,直接always@(add or sub or grade)就可以了。

第四个错误。。你的这个组合逻辑的always块,else 语句写在else if 语句前面,这是一种很诡异的写法,能综合个什么东西出来完全想不出来。

所有,我给你的建议是,你这段程序直接推翻重新来写,全部使用标准的时序逻辑的写法,

就是你第二段“always@(posedge clk or negedge RSTn)beign……end”这种写法,它可以保证你的所有电路行为都是发生在时钟上升沿或异步复位下降沿。

其次,每个信号第一if的分支语句一定是要if (!RSTn),即RSTn为低电平时整个加法器复位。这样做的好处在于:由于所有FPGA器件自动上电的瞬间,内部各个信号的初始态都是低电平,可以保证系统有一个自动复位的过程,所有按照这样写的寄存器都会有一个初始态。而避免了不定态X。

最后,建议你四个bit位宽的个位寄存器做成一个模为10的计数器(可以加可以减,具体靠判断sub,add哪一个信号为高)。。每次计数器满时就将十位的那个寄存器加一,而当个位寄存器为零且又检测到sub减信号时,则把个位寄存器置为4‘b1001(9);将十位寄存器也减一;这样就可以实现总累加值从0~99的加减法器了 。


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

原文地址: http://outofmemory.cn/yw/7899018.html

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

发表评论

登录后才能评论

评论列表(0条)

保存