Opalkelly Frontpanel SDK到Pionway SDK的代码迁移实例

1.概述

        PionwaySDK和Opal Kelly的FrontPanel SDK的架构和组件名称比较相近,可经过较为简单的代码修改操作完成项目的代码迁移。

2. Pionway SDK系统架构简介

        Pionway SDK由PC端的API、USB接口芯片的固件和FPGA端的HDL IP Core组成,其中USB接口芯片的固件是通用的,已经内置在SDK中。用户在代码迁移过程中只需要修改PC端和FPGA工程。

        API运行在PC端,由引入库(.lib)、动态链接库(.dll)和头文件(.h)组成。其中引入库和头文件要一并包含在PC端原代码工程,参与程序编译。编译完成后的可执行文件需要在当前路径下包含动态链接库文件来供程序运行时使用。用户在做PC端源代码工程迁移的时候需要注意Pionway SDK与Frontpanel SDK在API类名称和若干类方法名称及原型上的差异。

        HDL库所包含的IP Core工作在FPGA端,由一个总控制器(pwHost)及若干endpoint功能模块(pwXXX)组成,总控制器和FPGA的I/O引脚相连接,各个功能模块的输入端都与总控制器相连接,而功能模块的输出端需要先经过pwMUX多路复用器转变成一路信号,再总入总控制器。

        用户在做FPGA端的项目代码迁移的时候需要注意Pionway SDK与Frontpanel SDK在HDL IP Core的名称和接口的名称及位宽上的差异,不同种类的Endpoint功能模块有各自的地址空间范围,需要特别注意的是Opal kelly Frontpanel SDK的Pipe和与Block Pipe的Endpoint地址范围是重叠的((Block)Pipe In:0x80-0x9F,(Block)Pipe Out:0xA0-0xBF),而Pionway SDK的这两类功能模块的地址范围是独立的(PipeIn:0x80-0x9F,PipeOut:0xA0-0xBF,BlockPipeIn:0xC0-0xDF,BlockPipeOut:0xE0-0xFF)。

        我们以Ramtest项目为例进行FrontPanel SDK到PionwaySDK的代码迁移操作。迁移前后的部分源代码工程可以从Pionway开发者计划网页中获取。

        本文以Pionway SDK v1.5.0版本为例,进行Ramtest项目的Opal Kelly Frontpanel SDK到PionwaySDK的代码迁移操作。

3. Ramtest项目简介

        Ramtest例程演示了FPGA USB模块从数据产生、数据发送以及数据传输和数据取回的全部流程。包括了数据上传、下发、数据缓冲及中间的流控制。在USB标准中,所有操作都是PC端发起的,XMS6302在这里作为设备端。

例程运行的基本流程是:

  1.  PC首先生成一定量的随机数据。
  2.  PC调用WriteToBlockPipeIn API将上位机上的数据通过USB3.0传输FPGA内部的PipeInBlock IP Core。
  3.  FPGA内部的控制逻辑在PC调用WriteToWireIn API控制下将接收到的数据经过FIFO写入到与之相连接的DDR2 SDRAM中。
  4. PC调用ReadFromBlockPipeOut API将DDR2 SDRAM的数据通过BlockPipeOut IP Core读回到PC。
  5. PC随即对发送和接收到的数据进行比对,并输出比对结果。

4.代码迁移操作汇总

4.1 PC端程序迁移

序号迁移过程中的代码修改Opalkelly FrontPanelAPI函数原型Pionway API函数原型
1无需修改ErrorCode FlashEraseSector(UINT32 address)ErrorCode FlashEraseSector(UINT32 address)
2无需修改ErrorCode FlashWrite(UINT32 address, UINT32 length, const UINT8 *buf)ErrorCode FlashWrite(UINT32 address, UINT32 length, const UINT8 *buf)
3无需修改ErrorCode FlashRead(UINT32 address, UINT32 length, UINT8 *buf)ErrorCode FlashRead(UINT32 address, UINT32 length, UINT8 *buf)
4无需修改BoardModel GetBoardModel()BoardModel GetBoardModel()
5函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回intGetDeviceCount()ErrorCodeGetDeviceCount(int *device_count);
6无需修改BoardModel GetDeviceListModel(int num)BoardModel GetDeviceListModel(int num)
7无需修改std::string GetDeviceListSerial(int num)std::string GetDeviceListSerial(int num)
8无需修改ErrorCode OpenBySerial(std::string str = "")ErrorCode OpenBySerial(std::string str = "")
9无需修改bool IsOpen()bool IsOpen()
10无需修改void Close()void Close()
11被新函数替代,返回值转到了输出参数所指向的结构体中std::stringGetSerialNumber()ErrorCodeGetDeviceInfo(pwTDeviceInfo *info)
12被新函数替代,返回值转到了输出参数所指向的结构体中std::stringGetDeviceID()ErrorCodeGetDeviceInfo(pwTDeviceInfo *info)
13被新函数替代,返回值转到了输出参数所指向的结构体中boolIsHighSpeed()ErrorCodeGetDeviceInfo(pwTDeviceInfo *info)
14无需修改void SetDeviceID(const std::string& str)ErrorCode SetDeviceID(const std::string& str)
15无需修改ErrorCode ConfigureFPGA(const std::string& strFilename)ErrorCode ConfigureFPGA(const std::string& strFilename)
16无需修改bool IsFrontPanelEnabled()bool IsPionwayEnabled()
17无需修改ErrorCode UpdateWireIns()ErrorCode UpdateWireIns()
18无需修改ErrorCode SetWireInValue(int ep, UINT32 val, UINT32 mask = 0xffffffff)ErrorCode SetWireInValue(int ep, UINT32 val, UINT32 mask = 0xffffffff);
19无需修改ErrorCode UpdateWireOuts()ErrorCode UpdateWireOuts()
20函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回unsigned longGetWireOutValue(int epAddr)ErrorCodeGetWireOutValue(int epAddr,UINT32 *val)
21无需修改ErrorCode ActivateTriggerIn(int epAddr, int bit)ErrorCode ActivateTriggerIn(int epAddr, int bit)
22无需修改ErrorCode UpdateTriggerOuts()ErrorCode UpdateTriggerOuts()
23函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回boolIsTriggered(int epAddr, UINT32 mask)ErrorCodeIsTriggered(int epAddr, UINT32 mask,bool *is_triggered)
24函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回longWriteToPipeIn(int epAddr, long length, unsigned char *data)ErrorCodeWriteToPipeIn(int epAddr, long length, unsigned char *data,long *count)
25函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回longReadFromPipeOut(int epAddr, long length, unsigned char *data)ErrorCodeReadFromPipeOut(int epAddr, long length, unsigned char*data,long *count)
26函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回longWriteToBlockPipeIn(int epAddr, int blockSize, long length, unsignedchar *data)ErrorCodeWriteToBlockPipeIn(int epAddr, int blocksize, long length, un-signed char *data,long *count)
27函数原型改变,函数返回值为错误代码,读取结果从输出型参数返回longReadFromBlockPipeOut(int epAddr, int blockSize, long length, unsignedchar *data)ErrorCodeReadFromBlockPipeOut(int epAddr, int blocksize, long length,unsigned char *data,long *count)

4.2 FPGA端程序迁移

序号Frontpanel HDLPionway HDL迁移说明
1okCoreHarnesspwCore注意端口信号名称及位宽的差异
2okWireInpwWireIn注意端口信号名称及位宽的差异
3okWireOutpwWireOut注意端口信号名称及位宽的差异
4okTriggerInpwTriggerIn注意端口信号名称及位宽的差异
5okTriggerOutpwTriggerOut注意端口信号名称及位宽的差异
6okPipeInpwPipeIn注意端口信号名称及位宽的差异
7okPipeOutpwPipeOut注意端口信号名称及位宽的差异
8okBTPipeInpwBlockPipeIn注意端口信号名称及位宽的差异
9okBTPipeOutpwBlockPipeOut注意端口信号名称及位宽的差异
10okRegisterBridge使用较少,暂无
11okWireORpwMUX注意端口信号名称及位宽的差异

5. Ramtest项目迁移代码修改

 完整版步骤请访问Pionway知识库文章链接 ​​​​​​​​​​​​​​http://pionway.cn/support/library/migration.htmlhttp://pionway.cn/support/library/migration.html

 ​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值