PCIE调试心得.docx
- 文档编号:25453914
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:10
- 大小:106.52KB
PCIE调试心得.docx
《PCIE调试心得.docx》由会员分享,可在线阅读,更多相关《PCIE调试心得.docx(10页珍藏版)》请在冰豆网上搜索。
PCIE调试心得
PCIE 调试总结
(2)
配置空间和设备寄放器
PCI总线支持三个独立的物理地址空间:
存储器空间、IO空间和配置空间。
在每一个PCI设备中的每一个功能都有一个PCI配置空间,最大为256B。
各PCI功能的配置空间不是统一编址的,而是采纳一种ID的寻址方式,用总线号、设备号、功能号和寄放器号来唯一标识一个功能中的配置空间。
配置空间只能由处置器通过HOST桥来访问。
X86CPU能访问存储器或IO地址空间,但不支持直接访问配置地址空间。
PCI标准规定了X86CPU间接访问PCI配置空间的方式,通过HOST桥中映射为I/O的一个地址端口和一个数据端口来索引和访问。
在运算机上电的时候PCI设备列举[29],配置空间被PCIBIOS访问。
从中读取PCI设备的配置信息。
然后在系统的存储器和I/O地址空间内为其分派一片独立的存储器或I/O地址空间,并将所分派空间的起始地址写入每一个BAR,此地址确信了该设备作为完成者(目标)能够响应的地址范围。
在运算机上电以后运算机(或驱动程序)能够采纳两种方式访问设备寄放器:
通过CPU专用的I/O指令或通过标准内存引用指令。
图4描述了这两种方式,下面对这些方式进行简单说明。
图3 CPU访问I/O与内存寄放器
1)、I/O空间寄放器:
一些CPU体系结构(尤其是IntelX86)在引用设备驱动程序时利用I/O机械指令。
这些特殊指令引用CPU上一个特定的引脚集合,因此为I/O设备概念了一个单独的总线和地址空间。
在此总线上的地址也被称作端口,而且与任何内存地址完全隔离。
在IntelX86体系结构中,I/O地址空间是64KB大小(16位),汇编语言概念两个指令用于此地址空间读取和写入端口:
IN和OUT。
2)、内存映射寄放器:
并非所有的CPU结构都需要一个独立的I/O地址空间,在这种情形下,设备寄放器的地址直接映射到CPU的内存空间。
暴露大量数据缓冲区的设备往往映射到内存空间(如视频卡和数据搜集卡),如此就使得高级语言能够更快更直接对他们进行访问。
3)、配置地址空间:
PCI结构许诺32个物理单元(称为设备)插在同一根总线上。
每一个如此的物理单元最多能够包括8个不同的功能单元(Function)。
PCI标准规定,总线上每一个单独的PCI功能单元必需有256字节的存储区域用于保留配置数据,那个区域称为PCI功能单元的配置空间。
每一个PCI功能单元都有256字节的配置寄放器,每4个字节组成一个32位的寄放器,因此配置空间能够看成是由64个32位的寄放器组成。
配置空间的前64个字节为预定义信息区〔又称题目区〕,其中的信息由PCISIG组织进行预概念;后192字节为特殊配置数据区,其中的内容依照接口的特性由生产厂家概念。
主机系统能够通过配置寄放器给出的信息来配置操作系统,以实现PCI接口的即插即用特性。
图5给出了类型0配置寄放器前64字节的内容。
图4 配置空间题目区
所有符合PCI要求的设备都必需支持厂商识别码、设备识别码、命令和状态字段。
其他寄放器的实现是可选的,具体视设备的功能而定。
此刻讲解咱们的PEX8112的具体运作方式:
5、 FPGA作为从模式的配置读进程:
1). 在一个PCI的数据传输进程,都是以拉低FRAME信号开始的。
在frame='0'andirdy='1'andtrdy='1'anddevsel='1'andstop='1'的时候,咱们把cbe锁存给cmd,把ad锁存给add.
其中,锁存住的add的add(31downto8),表示地址,add(7downto0),代表指令。
Cmd代表指令,指令列表如下:
表2总线命令一览表
C/BE#[3:
0]
命令类型说明
0000
中断应答(中断识别)
0001
特殊周期
0010
读I/O端口
0011
写I/O端口
0100
保留
0101
保留
0110
存储器读(从内存空间映像中读数据)
0111
存储器写(从内存空间映像中写数据)
1000
保留
1001
保留
1010
读配置寄存器
1011
写配置寄存器
1100
存储器多行读
1101
双地址周期
1110
线存储器读取(存储器一行读)
1111
存储器写并无效
2).一个PCI的数据传输进程,都是以拉低FRAME信号开始的。
在idsel='1'andframe='0'andirdy='1'andtrdy='1'anddevsel='1'andstop='1'的前提下,注:
idsel高有效,它是唯一区别是的io操作仍是寄放器操作的,咱们也锁存add信号与cmd信号。
3). 下面讲解状态机:
配置读状态机:
i. 在cfg_rd_sel='1'orio_rd_sel='1'ormem_rd_sel='1'的前提下,咱们进入dev_st1状态,何时cfg_rd_sel='1'呢
在idsel='1'andframe='0'andirdy='1'andtrdy='1'anddevsel='1'andstop='1'前提下(表示咱们进行寄放器配置操作),咱们锁存住cmd的指令是cmd="1010",读配置寄放器时,使cfg_rd_sel='1'。
ii.在dev_st1状态,让devsel=0那个工作,使FPGA成为目标设备。
进入rdst1状态。
iii.它代表了配置寄放器前64字节的内容。
图5
当add(5downto2)="0000"thendevid<='1';elsedevid<='0';表示设备识别码。
当add(5downto2)="0001"thenstatecmd<='1';elsestatecmd<='0';表示厂商识别码
依次往下,再也不赘述。
那个状态咱们把电脑想要取得的配置的寄放器的数放到了PCI总线上,想要哪个数呢由add决定。
下面咱们跳到rdst2状态。
4). 在rdst2状态,没有做什么工作,延时功能,跳到rdst3状态。
5). 在rdst3状态,没有做什么工作,延时功能,跳到rdst4状态。
6). 在rdst4状态,trdy<='0',当trdy为0,表示目标设备预备好,数据在这时真正到了电脑上。
spar_en<='1'whenpre_state1=rdst4,spar_en是输出口,应该是校验等,跳到rdstopst状态。
7). 在rdstopst状态。
发送了stop信号,一次PCI操作完成。
8). 就如此咱们咱们通过改变ad的数据,一次一次的将寄放器中的数给了电脑。
6、 FPGA作为从模式的配置写进程:
配置写进程和配置读进程是类似的。
1). 在cfg_wr_sel='1'orio_wr_sel='1'ormem_wr_sel='1'的前提下,咱们进入dev_st2状态,何时cfg_wr_sel='1'呢
在idsel='1'andframe='0'andirdy='1'andtrdy='1'anddevsel='1'andstop='1'前提下(表示咱们进行寄放器配置操作),咱们锁存住cmd的指令是cmd="1011",写配置寄放器时,使cfg_wr_sel='1'。
2).在dev_st2状态,让devsel=0那个工作,使FPGA成为目标设备。
进入wrst1状态。
3).在wrst1状态,没有做什么工作,延时功能,跳到wrst2状态。
4).在wrst2状态,咱们让cfgwr='1',表示能够写我了。
eg:
basereg0(31downto8)<=wrreg(31downto8);写什么数据呢wrreg是随着ad不断的转变的。
写给谁呢取决于再FRAME=0,咱们锁存的指令.
当add(5downto2)="0100"thenbase0<='1';elsebase0<='0';表示咱们写基地址0,当add(5downto2)="0101"thenbase1<='1';elsebase1<='0';表示咱们写基地址1,
在base0='1'的前提下,咱们让basereg0(31downto8)<=wrreg(31downto8),这时会读回运算机给咱们的基地址0的地址。
FPGA程序中,咱们会接收4种数据,基地址0,基地址1,中断向量寄放器,命令。
其它下发数据不接收。
配置寄放器中的数是咱们FPGA的固定数。
跳到wrst3状态。
5).在wrst3状态,没有做什么工作,延时功能,跳到wrst4状态。
6).在wrst4状态,trdy<='0'whenpre_state1=rdst4orpre_state2=wrst4能够以为我已经接完数了,在trdy<='0'时锁存数据。
跳到wrstopst状态。
7).在wrstopst状态,发送stop,终止整个PCI写的操作进程。
8).就如此咱们一次一次的将电脑给的指令数据锁存的咱们的FPGA内部。
注:
在运算机一上电时,会第一进行配置写,然后再把写的数读上去。
7、 DMA数据传输进程:
顶上将的讲的是上电配置,数据是如何通过DMA传输的呢
下面讲解数据传输进程:
1). adinreg<=ad;在DMA进程中,ad是不断的将数送到adinreg当中的。
ext_add记录在frame0下的状态下数据口ad的状态。
2).在iosel='1'时,表示进行io操作。
咱们的FPGA一共进行了两种操作,IO操作和寄放器配置操作。
上面讲的都是寄放器配置操作。
Io操作确实是数据操作。
而且cbe是“0111”,寄放器写时:
当ext_add="00000100" ,咱们让int_reg_sel<='1';
当ext_add="00001000",咱们让head_reg_sel<='1';表示写DMA起始地址寄放器。
当ext_add="00001100",咱们让count_reg_sel<='1';表示写DMA传递个数寄放器
当ext_add="00010000",咱们让master_reg_sel<='1'; 表示FPGA作为DMA的主模式
具体这些寄放器配置进程如下:
看slave_mode模块。
i. iosel='1'和cbe是“0111”会使mem_wr_sel='1',会进入写的状态机,那个状态机实际确实是顶上刚讲的那个状态机。
ii.会进入在dev_st2状态,让devsel=0那个工作,使FPGA成为目标设备。
进入wrst1状态。
iii.在wrst1状态,没有做什么工作,延时功能,跳到wrst2状态。
iv.在wrst2状态,咱们让cfgwr='1',表示能够写我了。
data_wr是输入信号,
它是由以下赋值的data_wr<=cfgwrand((iowrselandiobase0_sel)or
(memwrselandmembase0_sel));
当cfgwr,也确实是(wrst2wrst3)时,data_wr为1,
当(data_wr='1'andmaster_reg_sel='1')都为1时,master_reg_sel在iosel='1'andext_add="00010000"时为1,咱们把master_reg<=adinreg;
也确实是在wrst2wrst3状态,咱们将ad数据给了master_reg寄放器,那个状态机被谁启动的呢iosel='1'和cbe是“0111”,何时赋值呢在wrst2wrst3状态,赋给了谁呢取决于ext_add="00010000",它不同给的人不同。
要紧给了四个:
当ext_add="00000100" ,咱们让int_reg_sel<='1';
当ext_add="00001000",咱们让head_reg_sel<='1';表示写DMA起始地址寄放器。
当ext_add="00001100",咱们让count_reg_sel<='1';表示写DMA传递个数寄放器
当ext_add="00010000",咱们让master_reg_sel<='1'; 表示FPGA作为DMA的主模式
然后往下不介绍了,要紧发stop之类。
8.当电脑发的master_reg<=adinreg,master_reg(8)='1',表示启动一次DMA操作。
咱们会使mast_rd_sel='1'。
进入DMA的状态机。
9.下面进入DMA状态机,
1).在mast_wr_sel='1'时,咱们进入wraddst状态。
何时mast_wr_sel='1'呢上面。
2).在wraddst,检查FIFO的空满状态,在FIFO非空时,进入wrst1
3).在wrst1,上传数据,上传多少呢取决于count_reg(19downto2),DMA传递个数寄放器,当count_reg(19downto2)="000000000000000000",表示传递完毕时,mast_en<='1';
使master_reg_sel='0',等待启动下一次DMA.进入ctst
10.Ctst终止DMA进程。
DMA读进程与写进程类似。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PCIE 调试 心得