查看: 11260|回复: 2

如何使用寄存器级读&写控制基于PXI平台的FPGA?

[复制链接]
发表于 2017-9-27 20:48:56 | 显示全部楼层 |阅读模式
关键词: FPGA , Quartus , PCI , PXI
阅读带图完整版: 使用寄存器级读&写控制基于PXI平台的FPGA-无广告.pdf (1018.45 KB)



目录
简介
设计实例概览
   地址译码(AddressDecoding)
   引脚控制
   寄存器映象(RegisterMapping)
软件控制
   ATEasy 例程 (使用ATEasy GX3500驱动)
   “C” 例程
   LabView例程
摘要:本文以基于PXI平台的Marvin TestSolutions 3U FPGA板卡GX3500为设计对象,通过设计实例讲解如何使用寄存器级读&写控制FPGA,并提供FPGA设计相关文件(如SVF)和软件控制例程。
简介
为了更好地理解如何访问GX3500 FPGA的寄存器,需要有一个使用寄存器的设计。本篇文章分为两部分内容:第一部分,以读者已经熟练使用AlteraQuartus II设计工具为前提(参考《GX3500 User’s Guide: GXFPGA Tutorialand Examples》的第五章),概述了如何使用GX3500设计128通道的静态I/O。此设计实例配置为4组32通道双向引脚,双缓冲结构支持同步更新128通道逻辑状态的读和写。
本篇文章的第二部分讲述了如何向GX3500 FPGA内加载设计文件,如何连接GX3500 I/O引脚,为了实现FPGA静态数字I/O的操作如何对寄存器进行读和写。
                              
图1 MTS-GX3500FPGA板卡
设计实例概览
地址译码(Address Decoding)
GX3500支持对两种类型的PCI总线读和写操作:一类是针对寄存器,使用PCI BAR 1;另一类是针对RAM,使用PCI BAR 2。静态数字I/O设计实例使用寄存器控制对I/O引脚的读和写,所以使用PCI BAR 1片选信号进行地址译码 — 与ChipSelect 1 (CS[1])同意。BAR 1信号可以访问的地址范围为1024 byte(0x400),访问时必须以4-byte为准对齐。 图2为地址译码逻辑单元,将5路地址信号(Addr[6..2]))译码后,可提供32路“写使能”信号(WE[31..0])和32路“读使能”信号(RE[31..0]),这些信号用于控制锁存寄存器的向I/O引脚写入(WE[x]) )和从I/O引脚读取(RE[x])功能。
图2:寄存器地址译码
引脚控制
本设计实例中有四组完全相同的I/O引脚(见图4),每组有32路通道。每路通道都支持双向传输,并可以独立配置传输方向。输出寄存器为双缓冲结构,支持四组I/O引脚(128路通道)同步更新。第一阶段,通过WE_Data控制信号,将输出数据使用写入第一级数据寄存器,通过WE_Tristate写入三态控制信号。以上这些信号来自于WE[31..0]信号,并且这些信号在每组I/O引脚间独立。第二阶段,通过WE_UpdatePort控制信号,将第一级输出的数据和三态控制信号写入第二级寄存器。以上这些信号也来自于WE[31..0]信号,但是四组I/O引脚共用以实现四组I/O引脚数据的同步更新。使用RE_Tristatelatch,RE_DataLatch,RE_TristatePort和RE_DataPort控制信号访问输出寄存器两个阶段的数据和三态控制寄存器从而进行读操作。
图3:引脚控制逻辑单元(图4中的Port_Control)
通过RE_SamplePortIO控制信号可实现四组I/O引脚(128路通道)的所有通道同时被采样,采样数据被储存在锁存寄存器中以用于后续的数据检索。分别通过RE_PortIO 控制信号实现数据检索。因为每组I/O引脚的三态控制信号可以被读,所以可以推断出GX3500或UUT是否处于采样输入状态(读状态)。
寄存器映象(RegisterMapping)
下面是控制四组I/O引脚(A组、B组、C组、D组)的读和写寄存器偏移地址:
  
写功能:
  
  
偏移量
  
  
(HEX)
  
  
功能
  
  
0
  
  
(0x0)
  
  
WE[0]:  向I/O引脚(A组)锁存器中写入数据
  
  
4
  
  
(0x4)
  
  
WE[1]:  向I/O引脚(B组)锁存器中写入数据
  
  
8
  
  
(0x8)
  
  
WE[2]:  向I/O引脚(C组)锁存器中写入数据
  
  
12
  
  
(0xC)
  
  
WE[3]:  向I/O引脚(D组)锁存器中写入数据
  
  
16
  
  
(0x10)
  
  
WE[4]:  向I/O引脚(A组)锁存器中写入三态控制信号
  
  
20
  
  
(0x14)
  
  
WE[5]:  向I/O引脚(B组)锁存器中写入三态控制信号
  
  
24
  
  
(0x18)
  
  
WE[6]:  向I/O引脚(C组)锁存器中写入三态控制信号
  
  
28
  
  
(0x1C)
  
  
WE[7]:  向I/O引脚(D组)锁存器中写入三态控制信号
  
  
80
  
  
(0x50)
  
  
WE[20]: 同步更新I/O引脚(A~D组)
  
  
读功能:
  
  
偏移量
  
  
(HEX)
  
  
功能
  
  
0
  
  
(0x0)
  
  
WE[0]:  从I/O引脚(A组)锁存器中读取数据
  
  
4
  
  
(0x4)
  
  
WE[1]:  从I/O引脚(B组)锁存器中读取数据
  
  
8
  
  
(0x8)
  
  
WE[2]:  从I/O引脚(C组)锁存器中读取数据
  
  
12
  
  
(0xC)
  
  
WE[3]:  从I/O引脚(D组)锁存器中读取数据
  
  
16
  
  
(0x10)
  
  
WE[4]:  从I/O引脚(A组)锁存器中读取三态控制信号
  
  
20
  
  
(0x14)
  
  
WE[5]:  从I/O引脚(B组)锁存器中读取三态控制信号
  
  
24
  
  
(0x18)
  
  
WE[6]:  从I/O引脚(C组)锁存器中读取三态控制信号
  
  
28
  
  
(0x1C)
  
  
WE[7]:  从I/O引脚(D组)锁存器中读取三态控制信号
  
  
32
  
  
(0x20)
  
  
WE[8]:  读取I/O引脚(A组)的输出数据
  
  
36
  
  
(0x24)
  
  
WE[9]:  读取I/O引脚(B组)的输出数据
  
  
40
  
  
(0x28)
  
  
WE[10]:  读取I/O引脚(C组)的输出数据
  
  
44
  
  
(0x2C)
  
  
WE[11]:  读取I/O引脚(D组)的输出数据
  
  
48
  
  
(0x30)
  
  
WE[12]:  读取I/O引脚(A组)的三态控制信号
  
  
52
  
  
(0x34)
  
  
WE[13]:  读取I/O引脚(B组)的三态控制信号
  
  
56
  
  
(0x38)
  
  
WE[14]:  读取I/O引脚(C组)的三态控制信号
  
  
60
  
  
(0x3C)
  
  
WE[15]:  读取I/O引脚(D组)的三态控制信号
  
  
64
  
  
(0x40)
  
  
WE[16]:  从I/O引脚(A组)输入锁存器中读取采样数据
  
  
68
  
  
(0x44)
  
  
WE[17]:  从I/O引脚(B组)输入锁存器中读取采样数据
  
  
72
  
  
(0x48)
  
  
WE[18]:  从I/O引脚(C组)输入锁存器中读取采样数据
  
  
76
  
  
(0x4C)
  
  
WE[19]:  从I/O引脚(D组)输入锁存器中读取采样数据
  
  
80
  
  
(0x50)
  
  
WE[20]: 对I/O引脚(A~D组)同步采样到输入锁存器
  

图4:I/O引脚(A~D组)的读和写控制
GX3500静态I/O设计文件和SVF文件下载:  here.
软件控制
为了控制本文中的GX3500设计实例,首先要初始化仪器驱动,然后加载SVF文件,然后写和读本设计实例中使用的寄存器地址。GX3500 API,包含用于访问内存的函数、使能或旁路扩展板卡继电器的函数和其他函数。参考《GX3500 User’s Guide》获取API函数详细列表和调用语法。
本文提供的控制GX3500 FPGA静态I/O的代码,支持三种不同的编程环境:ATEasy,“C” 和LabView。这些例程假设GX3500安装在PXI机箱的第12槽中、使用Altera Quartus II 设计软件生成SVF文件“Static_IO.svf”、SVF文件在应用程序可读入的目录下。
ATEasy 例程 (使用ATEasy GX3500驱动)
dwDataWord[4] ! Contains output state for 32-bit ports A- D
dwTristateWord[4] ! Contains tristate control for 32-bit ports A-D
dwInputWord[4] ! Contains data read from four latches A-D
iong ! Index counter

Driver Initialize (12) ! Initialize driver for instrument in slot #12
FPGA Load (".\\Static_IO.svf",TARGET_VOLATILE,MODE_SYNC) ! Load SVFfile to volatile FPGA memory
FPGA Set ExpansionBoardBypass(0b1111) ! Set the expansion bypass – signals route from theFPGA to the connectors
For i=0 to 3 ! Repeat for port A - D
    FPGA Write Register(i*4,4,dwData) ! Write to DataLatch WE
    FPGA Write Register((i+4)*4,4,dwTristate) ! Write toTristate Latch WE[i+4]
Next
FPGA Write Register(80,4,0) ! Simultaneous Update all 128 I/O pins (tristateand data)
FPGA Read Register(80,4,dwData) ! Simultaneous Sample all 128 I/O pins
For i=0 to 3 ! Repeat for port A-D
    FPGA Read Register(i*4,4,dwInput) ! Read sampledstate from Latch RE
Next
“C” 例程
int    nHandle, nStatus, i;
DWord    dwData[4], dwTristate[4], dwInput[4];

GxFpgaInitialize (12, nHandle, nStatus);  \\ Initialize driver forinstrument in slot #12
GxFpgaLoad (nHandle, 0, "Static_IO.svf" ,0,, pnStatus);  \\Load SVF file to volatile FPGA memory
GxFpgaSetExpansionBoardBypass (nHandle , 0xF, pnStatus);  \\ Set theexpansion bypass
for(i=0;i<4;i++){  \\ Repeat for port A - D
    GxFpgaWriteRegister (nHandle ,i*4, dwData, 4,nStatus);  \\ Write to Data Latch WE
    GxFpgaWriteRegister (nHandle ,(i+4)*4, dwTristate,4, nStatus);  \\ Write to Tristate Latch WE[i+4]
}
GxFpgaWriteRegister (nHandle ,80, 0, 4, nStatus);  \\ SimultaneousUpdate all 128 I/O pins (tristate and data)
GxFpgaReadRegister (nHandle, 80, dwInput[0], 4, nStatus);  \\ SimultaneousSample all 128 I/O pins

for(i=0;i<4;i++){  \\ Repeat for port A - D
    GxFpgaReadRegister (nHandle, i*4, dwInput, 4,nStatus);  \\ Read sampled state from Latch RE
}
图5: LabView例程用户控制界面
图6: LabView例程中层叠顺序结构的帧0
图7: LabView例程中层叠顺序结构的帧1
图8: LabView例程中层叠顺序结构的帧2
图9: LabView例程中层叠顺序结构的帧3
图10: LabView例程中层叠顺序结构的帧4
关键字:GX3500,FPGA,Altera,Quartus,FPGA Design tools,Static I/O,PCI,PXI
若需要关于编程软件、例程调试运行、文件下载等更多帮助,请联系我。

 楼主| 发表于 2017-9-27 20:49:44 | 显示全部楼层
发表于 2017-10-27 16:12:57 | 显示全部楼层
你是否有以下情况:
1.花了大量时间自学,学了一大堆,却不知道有没有用?!!
2.一点小问题就卡住学习进程,浪费了宝贵的学习时间?!!
2.能看懂别人的代码,到自己设计时却不知道先从哪里下手?!!
3.找不到工作,面试难?!!看别人有10K+薪水,而自己只有几K?!!
不要犹豫了,赶紧来报班培训吧,自学没个几年根本达不到就业水平,时间就是金钱,早掌握早赚钱。
明德扬专业FPGA培训,带你摆脱上面的三种情况,一对一辅导教学,您完全掌握了老师才开始下一个知识点的教学,不用担心大班教学跟不上其他学员进度,明德扬承诺能真正让你拥有独立完成任意FPGA项目的能力
就业班:10800
周末班:7999
网络班(线上真人教学):5999
20000以下找对手,欢迎对比,了解更多请Q我821219077,竭诚为您服务。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表