原创 【博客大赛】使用Qsys快速创建ALTERA PCIe设计介绍

2014-11-20 11:30 5131 4 5 分类: FPGA/CPLD 文集: PCIE

概述

         使用Qsys快速创建一个基于Avalon-MM流程的PCI-e设计,尽量通过手把手以step-by-step的方式展现使用Qsys进行关于pcie的Quartus II工程的创建过程。这里使用Qsys系统时候没有使用到任何软核或者硬核。

项目设计介绍

         这里以一个简单的pcie工程进行介绍,该pcie实例属于PCI Express endpoint,如图1所示为该端点在PCIe系统架构中的示意图。

 0.jpg

图1:PCIe系统架构举例

我们的设计就是位于图1所示的“Custom Endpoint”位置,它的框图如图2所示,我们这里以Cyclone IV GX器件为例来进行实例演示,从图中我们可以看到该实例具体包含了以下一些模块:

l  PCIE硬核,实现了协议层。提供了PCIe链路和连接到Qsys里元件之间所有互连,例化硬核的时候自动使用GXB模块。

l  DMA模块,在片内存储器和PCIe硬核之间传输数据。DMA的控制端口被映射到了PCIe的存储器空间,因为它可以被PCIe根端口控制而用于建立和配置数据传输。

l  片内RAM模块,用于存储从PCIe链路接收来的数据和需要通过该链路发送的数据。和DMA一样,片内RAM模块也被映射到了PCIe的存储空间,所以可以被PCIe系统访问。

l  Qsys互连,Qsys工具用于将FPGA内元件连接在一起的逻辑,这样有利于数据和命令它们之间传输。

0.jpg

图2:Qsys PCIe端口框图

PCIe端点可以按照以下方式来使用:

l  从高速链路接收到PCIe写请求,然后将数据写入并保存到片内RAM中。

l  从高速链路接收到PCIe读请求,然后从片内RAM读出数据,并经PCIe链向请求方返回读出的数据。

l  从PCIe接收到DMA写或者读请求,然后DMA自动传输数据,数据传输结束后,DMA会向PCIe硬核触发一个中断请求。

注意上述DMA操作,只要启动,DMA可以从片内RAM读出数据并将其写入到PCIe硬核,PCIe将此操作转化为对系统其它地址空间的写请求。或者,DMA可以从PCIe硬核读数据,这个操作会被转化为向PCIe发送一个读请求,PCIe会返回数据和对应的完成包,这些数据被自动写入到片内RAM。

一步一步地完成设计

    我们可以按照以下流程一步步地完成这个PCIe端点设计,首先第一步是创建Quartus II工程。

    步骤一:创建Quartus II工程

1.  从电脑的开始菜单里启动Quartus II软件。

2.  从Quartus II软件的File菜单里选择“New Project Wizard”。

3.  当“Introduction”页面出现时,点击下一步。

4.  在新建工程的第一页,指定新建工程的路径、名称和顶层设计入口。

5.  在“What is the name of this project”下输入“civgx_gen1x4_qsys_top”来指定设计的顶层设计入口,如图3所示。

0.jpg

图3:指定工程路径、名字以及设计顶层入口

6.  点击“Next”进入第一页。

7.  在第二页,即“Add Files”,可以点击 按钮找到存放源文件的目录,然后添加相应的源文件(由于一开始没有设计文件,也可以略过此步)。

a)   这里我们选择三个设计文件

              i.      civgx_gen1x4_qsys_top.v

             ii.      altgxb_rconfig.v

            iii.      gpll.v

b)   点击“Open”加入这些设计文件到工程

8.  同上一步,可以通过改变文件类型,我们可以给工程添加SDC文件。

9.  点击“Next”进入第三页。

10.  在第三页(Family & Device Settings),选择Cyclone IV GX

11.  指定器件具体型号,按一下方式滤出需要的器件型号

a)   选择FBGA封装

b)   选择672引脚数

c)   速度等级选择6

12.  最终选择EP4CGX50DF27C6,如图4所示。

0.jpg

图4:为工程指定具体FPGA型号

13.  剩下使用默认设置,所以直接点击“Finish”完成工程创建

步骤二:启动Qsys工具

1.  从Quartus II工具菜单下选择“Qsys”打开Qsys工具,或者直接在Quartus II工具栏里点击0.jpg 按钮打开。

这是Qsys工具开始打开并启动其初始化流程。

2.  移除系统默认添加的clk_0元件,在System Contents下高亮选中“clk_0”然后点击0.jpg 按钮。

此时,我们有了一个空的Qsys系统,本例,时钟将由PCIe硬核产生,所以时钟源元件在这里是不需要的。

3.  从Qsys工具的File菜单下选择save as,在保存文件名设置为civgx_gen1x4_qsys,然后选择save。

步骤三:使用PCI Express IP Compiler加入PCIe硬核到系统

1.  在Qsys工具里找到Component Library,展开里面的Interface Protocol,然后找到PCI并展开,最后高亮选择“IP Compiler for PCI Express”,如图5所示。

0.jpg

图5:添加PCIe硬核到系统

2.  如图5所示,点击Add开始添加PCIe硬核到系统,并启动PCIe参数编辑界面。

此时我们会看到一个名为“pcie_hard_ip_0”的模块被添加到了系统,同时IP_Compiler for PCI Express的参数编辑也被立即打开。PCIe硬核的所有参数设置都在这页界面可以找到,如果就算你对于PCIe协议不是很熟悉也没有关系,以下我们会详细介绍如何配置PCIe硬核。这时候忽略系统给出的任何错误,因为当我们连接PCIe硬核IP到系统时,这些错误都将会解决。

3.  PCIe硬核通用配置,在PCIe参数编辑器里选择“System Settings”来进行与系统相关的设置,如图6所示。

a)   为“Lane”选择x4。

b)   为“Reference clock frequency”选择100MHz。

c)   为“Testout width”选择64bits。

d)   不勾选“Gen2 Lane Rate Mode”和“Enable 62.5MHz application clock”。

0.jpg

图6:PCIe相关系统设置

4.  到“PCI Base Address Register(Type 0 Configuration Space)”区域安照图7所示,设置PCIe的基地址寄存器(BARs)。

a)   确认BAR0(第一行)设置为64 bit Prefetchable。

这时候BAR1显示为“1-Occupied”

b)   点击BAR2(第三行)的BAR Type区域,从下拉菜单里选择“32-bit Non-Prefechable”。

c)   保持BAR Size和Avalon Base Address区域为其默认值不变。

0.jpg

图7:设置PCIe端点的BAR

如图7所示,这些设置用于控制链路如何产生针对内部Avalon-MM地址空间的PCIe事务,当使用Qsys工具时,图中这些BARSize和Avalon基地址列在设备连接的时候添加。

5.  为PCIe端点配置只读寄存器,在“Device Identification Register”框下按照图8所示,进行设置。

a)   为Vendor ID设置0x1172。

b)   为Device ID设置0xE001.

c)   为Revision ID设置0x01.

d)   为Class code设置0xFF0000.

e)   为Subsystem vendor ID设置0x1172.

f)   为Subsystem ID设置0x0004.

0.jpg

图8:设置设备ID寄存器

6.  “Link Capabilities”和“Error Reporting”保持默认设置。

7.  “Buffer Configuration”按照图9所示进行设置。

a)   最大载荷尺寸(Maximum Payload Size),从下拉框里选择256字节。

b)   “Desired performance for received requests”选择设置为“High”。

0.jpg

图9:缓冲器配置

8.  到Avalon-MM Settings框下配置Avalon-MM接口,按照以下要求设置,设置的界面如图10所示。

a)   在“Peripheral Mode”下拉框下选择“Requester/Completer”。

b)   使能“Control Register Access(CRA) Avalon slave”端口选项。

c)   其它勾选项保持不使能状态。

0.jpg

图10:设置Avalon-MM接口

9.  到“Address Translation”框下按照以下要求设置Avalon地址转换,设置好的界面如图11所示。

a)   为地址转换表配置选择动态转换表。

b)   地址页选择2.

c)   每页地址范围选择1MByte-20 bits。

0.jpg

图11:Avalon地址转换配置

这些设置控制Avalon-MM到PCI Express的地址转换,意味着Qsys系统内部的数据传输是如何转换为PCI Express的请求的。由于地址转换设置为动态转换,所以IP_Compiler for PCI Express编辑器的最后一项设置,即“Address Translation Table Contents”不需要编辑设置。

10.  点击“Finish”关闭PCIe参数设置页面,返回到Qsys系统。

这样一个名为“pcie_hard_ip_0”的PCIe硬核已经加入到了Qsys系统,它共有20种不同的接口(其中许多为管道接口,conduits),我们需要根据如何使用该硬核来连接这些接口,后面我们会对这些接口进行连接,图12显示了这时候Qsys系统界面,我们看到在消息窗口显示了以下错误,这时候我们不用理会这些错误,后面我们会处理这些错误的。

0.jpg

图12:只加入PCIe硬核后Qsys系统界面

    步骤4:添加剩下的设备到Qsys系统

    接着我们把剩下的DMA和片内RAM添加到Qsys系统,来完成这个PCI Express端点设计。

    1. 在Qsys工具的设备库下找到Bridges,展开在其下面找到DMA并展开找到DMA控制器,如图13所示。
0.jpg

图13:在Qsys工具元件库里找到DMA控制器

2.  点击Add按钮开始添加DMA控制器,并打开DMA控制器的参数设置界面。

和之前添加PCIe硬核类似,这时候我们可以看到一个名字叫“dma_0”的设备已经被自动添加到了Qsys系统,同时一个参数编辑界面展现在我们面前,并允许我们对此DMA控制进行参数配置。

3.  按照如下要求对DMA控制进行配置,配置好的界面如图14所示(Advanced保持默认设置即可)。

a)   为DMA的长度寄存器选择位宽为13 bits,该参数定义了我们启动DMA传输的最大数据尺寸,也即8191 (213 – 1)。

b)   在突发事务下选择使能突发传输,该参数允许DMA使用Avalon-MM的突发处理机制来提供系统性能。

c)   设置突发尺寸为128个字。

0.jpg

图14:配置DMA控制

4.  点击完成按钮关闭DMA控制器参数设置编辑界面。

这样添加到Qsys的名为dma_0的DMA控制器已经配置完成,它有两个Avalon master接口来分别启动系统内的读和写传输,还有一个名为control_port_slave的Avalon salve接口,该接口用户对DMA的编程配置,一个名为clk的时钟输入接口和一个名为reset的复位输入接口。

5.  在Qsys工具的设备库下找到存储器和存储控制器,展开其下面的On-Chip,然后找到并高亮选择On-Chip Memory(RAM or ROM),如图15所示。

0.jpg

图15:添加On-Chip Memory到Qsys系统

6.  点击Add按钮,开始添加On-Chip Memory到Qsys并打开其参数编辑界面。

7.  按照如下要求配置片内存储器:(配置好的界面如图16所示)

a)   在存储器类型选项下选择RAM(Writable)。

b)   在Block类型下选择Auto。这样设置让编译器自己为这个片内存储器自动选择片内RAM类型,因为大部分器件内部都有多种片内RAM块类型。

c)   数据宽度选择64,这是因为PCIe硬核使用了64-bit数据总线。

d)   为其配置总的存储尺寸为4096字节,这样就在系统内部创建一个512x64的RAM来用于存储传输的数据。

e)   去使能掉初始化存储器内容选项。存储器的内容在系统操作期间将总是处于可写状态。

0.jpg

图16:配置On-Chip 存储器

8.  点击完成按钮关闭并完成片内RAM配置界面。

9.  按照以上规律,为该片内RAM重命名为onchip_memory_0。

RAM块只有一个Avalon salve接口用于访问其内部地址空间,同时只有一个时钟和复位输入接口。这时候我们可以看到Qsys系统如图17所示。

0.jpg

图17:所有设备添加完毕后的Qsys

步骤5:将设备连接起来

    下面我们开始在图17所示System Contents下的“connections”列内完成各个设备之间的连接。

    1.将PCIe的输出时钟pcie_core_clk连接到片内RAM的clk1端口,如图18所示。
0.jpg

图18:连接PCIe的输出时钟到RAM时钟输入端口

2.  按照下表所示完成剩下的设备连接。

表1:

元件(设备)

接口名称

元件(设备)

接口名称

pcie_hard_ip_0

pcie_core_clk

dma_0

clk

pcie_hard_ip_0

pcie_core_reset

on-chip_memory_0

reset1

pcie_hard_ip_0

pcie_core_reset

dma_0

reset

pcie_hard_ip_0

bar1_0

on-chip_memory_0

s1

pcie_hard_ip_0

bar2

dma_0

control_port_slave

pcie_hard_ip_0

bar2

pcie_hard_ip_0

cra

dma_0

read_master

on-chip_memory_0

s1

dma_0

read_master

pcie_hard_ip_0

txs

dma_0

write_master

on-chip_memory_0

s1

dma_0

write_master

pcie_hard_ip_0

txs

 

       当按照表1所示完成连接后,Qsys系统如图19所示。这将显示系统的时钟和复位信号都是来源于PCIe硬核模块。针对BAR1:0的PCIe事务将直接转换为对片内RAM元件的操作,而针对BAR2的PCIe事务将直接转换为针对DMA控制器或者片内RAM的操作,这取决于该事务的地址偏移。DMA控制的两个master接口能在片内RAM和PCIe链路之间传输数据,可以通过PCIe硬核的发送(TXs)接口访问PCIe链路。

 
 

文章评论1条评论)

登录后参与讨论

billzhu_345737527 2015-10-29 15:21

未完请继续

cocappjj_256384531 2006-9-14 10:23

好文,不光是intel啦,很多其他行业的人也可以借此规划一下自己的职业

debbie 2006-9-13 17:24

祝你好运!
相关推荐阅读
coyoo 2020-04-13 15:19
用SI9000控制阻抗,并得出各种叠层走线参数
1、差分表层(1B)2、差分内层(1B2A)3、差分内层(2B1A)4、单端表层(1B)5、单端内层(1B2A)6、单端内层(2B1A)7、未命名...
coyoo 2020-04-01 15:29
中国进出口商品运输路线图-2011年
试试翻转下:...
coyoo 2020-03-31 11:38
LTspice导入其它厂家器件现有的spice模型
最近在使用LTspice仿真由三极管搭建的放大电路,在选用罗姆的三极管2SC4083的时候,从罗姆的官网下载了其spice模型文件,这个文件后缀是lib。这里介绍一种方法导入我下载到的lib文件,该l...
coyoo 2020-03-20 14:54
共基极放大器,共基极放大器放大电路 (转)
共基极放大器,共基极放大器放大电路 交流信号电压叠加在直流电压上,使晶体管基极、发射极之间的正向电压发生变化,通过晶体管的控制作用,使集电极电流有更大的变化,它的变量在集电极电阻上产生大的电压变量,...
coyoo 2019-10-31 17:09
FPGA Based TDC的编码器
编码方法: 顺序查找:利用for循环,从tc的第0位依次遍历到第一个0-1(或1-0)跳变的位置,输出跳变处的位置序号,完成编码。顺序查找法比较直观,无需任何外加电路就可以抑制bubble现...
coyoo 2019-10-31 09:56
码密度测试
FPGA芯片中,受到布局布线以及PVT的影响,无法使得每个延迟单元的延迟时间完全一致,更重要的问题在于我们需要获取每个延迟单元的bin-width,此时可以采用码密度测试来获取每个延迟单元的bin w...
广告
EE直播间
更多
我要评论
1
4
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /6 下一条