概览
关于运用LabVIEW FPGA完结RIO方针渠道上的定制硬件的工程师与开发人员,他们能够很简略地运用所引荐的组件规划构建合适其运用的、可复用且可扩展的代码模块。依据现已验证的规划进行代码模块开发,将使现有IP在未来运用中得到更好的复用,也能够使在不同开发人员和内部安排之间进行同享和交流的代码更好服用。
目录
1.代码模块
2.可复用代码——知识产权
3.I/O与资源的独立性
4.守时独立性
5.框图独立性
6.文档、测验与典范
7.总结
代码模块
任一项软件开发作业均包括函数、子例程、方针和代码模块,以及其他较大架构的根底构建模块的开发。当规划一个运用时,各个函数与操作均被辨认和完结。然后,这些构建模块被组合与集成以构成更大的运用。经过长期开发不同运用的进程,一个开发小组或团队将创立表明常见操作的代码模块库,并对其进行复用以更快速地构建未来的运用。开发这样的代码库意图是经过一次构建和测验函数并屡次复用它,削减开发的总作业量。模块化规划,除了促进现有代码的复用外,还提高了代码的可测验性与可保护性,然后答应开发人员和规划人员重视于运用相关的特性和代码段。
每种编程言语以及某些情况下的编程环境都有一个优选的代码模块规划模型,以便改进代码模块的完结与集成。该优选规划能够因详细的开发人员而异,但一般一个开发组会依据一起的需求和考虑确认一组同享的规划原则。作为一种编程言语,LabVIEW本身具有一组供世界各地的程序人员开发子VI运用的指导方针,以便子VI能够简略了解、而且运用于不同运用并由不同开发人员保护。LabVIEW FPGA,作为LabVIEW的一个子集,具有其本身的一组用于运用FPGA特定行为构建代码模块(子VI)的指导方针,以便它们能够有用运用于广泛的依据FPGA的运用。
可复用代码——知识产权
FPGA渠道上的可复用代码模块一般称为IP(知识产权)核——从传统芯片规划长期演化来的称号。在LabVIEW FPGA中,这样的IP核由常用于LabVIEW编程和LabVIEW东西集的子VI组成。LabVIEW FPGA中的子VI支撑咱们一次完结不同的函数与操作,优化FPGA上的完结,然后将其运用至不同的运用。为使这样的子VI能够与不同的堆叠需求和架构便利地协同运用,咱们需求遵从某些根本指导方针,以保证子VI广泛可用,而不是专为一项特定运用而优化。
为进一步促进和改进LabVIEW FPGA IP的复用,代码模块应当除子VI源码以外还包括一些组件。这些组件包括文档、测验代码和运用IP的根本典范。
在LabVIEW FPGA运用中,IP代码模块典型地用于一些操作的履行,如通信协议(如SPI、I2C等)的编码与解码、数字信号处理、滤波、操控算法的完结、传感器信号(如PWM、积分信号)的编码/解码和基准标定等。
开发LabVIEW FPGA IP的最根本指导方针便是,开发不只独立于其主运用、而且对其主运用不发生影响或不会有显着要求的代码模块。IP代码模块与其主运用间的仅有需求或依赖性应当是子VI衔接面板的接口。该文档将论述如安在LabVIEW FPGA IP中创立这样的调用独立的IP子VI,并展现一些相关典范。
I/O与资源的独立性
为使LabVIEW FPGA IP便于运用于不同的运用,它应当独立于任何输入/输出通道(I/O)或其他硬件资源,如FPGA块存储器。依据详细的运用,终究运用能够运用不同的RIO板卡或其他FPGA方针渠道。因而,IP代码模块不该依据一个特定类型的I/O资源进行编程。将IP模块集成至终究运用的编程人员或开发人员将挑选运用某个特定的I/O资源。来自I/O资源数据与值,应当以参数的方法传递给IP模块,或从IP模块回来。
例如关于一个PWM输出IP模块,运用开发人员将为PWM输出信号选用某条数字输出线。在此例中,该PWM IP模块应当发生并输出信号的当时状况。开发人员将把在更高层次VI中赋值给I/O资源。该I/O资源未嵌入在IP代码模块的框图中。
图1:一个调用PWM输出IP代码模块(子VI)的运用VI的框图
相同的指导方针运用于恣意输入信号。例如,假定您在运用一个由数字滤波器规划东西包创立的模仿滤波器IP子VI,模仿数值应当自该滤波器子VI外部收集,然后传递给IP代码模块。
图2:运用一个模仿滤波器IP子VI(直接FIR)。模仿数值在主VI收集并传递给滤波器IP。
独立于I/O资源的IP代码模块的开发,使其运用更为便利和灵敏,并支撑将其屡次集成到一项运用,而不用定制该IP代码模块的每个实例。
块存储
除了I/O通道外,其他或许为LabVIEW FPGA IP运用的资源便是块(用户)存储器。LabVIEW FPGA支撑开发人员运用多个不同的函数拜访FPGA上的块存储器,其间包括存储器读/写、FIFO、查询表及其他函数。这些函数中的大多数均在块存储中创立了一个仅有的地址空间,以防止发生IP与该运用其他IP间的存储器抵触。
但是,LabVIEW FPGA 8.0存储器读函数和存储器写函数,关于其在作为当时FPGA功用特性一部分的任一VI中运用的一切实例,均运用了一个16 kB共有地址空间,这个共有地址空间被当时FPGA功用中任一VI的函数实例所运用。运用这些函数或许会与该运用其他部分运用的存储器发生抵触,因而不该当运用这些函数。假如需求在运用LabVIEW FPGA 8.0(或许更早版别)开发的IP代码模块中支撑随机存储拜访,您应当运用运用LabVIEW存储器扩展运用程序创立的一个存储器模块。
在LabVIEW FPGA 8.20中,每个存储器读函数和存储器写函数引证一个特定的存储块(地址空间),典型情况下,它在LabVIEW项目中作为一项资源被创立。因为这些存储块在项目中被界说,因而,假如您将一个IP代码模块VI加载至一项新运用,它们不会主动转递给新的项目。为此,您能够在VI中界说一个存储块作为VI-Scoped存储装备,而不是LabVIEW项目。这一VI-Scoped存储块能够在IP中创立并运用;关于任一运用该IP的新运用,它将被主动创立。
图3:运用LabVIEW FPGA 8.20 VI scoped指定存储块
类似地,运用块存储器来缓存数据的LabVIEW FPGA FIFO函数,是依据一个在LabVIEW项目中创立的FIFO资源。在LabVIEW FPGA 8.0中,假如您决议运用一个IP代码模块中的FIFO,该IP的用户需求在运用项目中手动创立相关的FIFO资源。为革除对IP代码模块用户的这一额定需求,咱们主张关于LabVIEW FPGA 8.0中的任何IP代码模块防止运用FIFO。
在LabVIEW 8.20中,您能够挑选创立一个VI-Scoped FIFO装备以一个VI专用FIFO存储块。这一操作与指定VI-Scoped存储块的方法相同。
图4:运用LabVIEW FPGA 8.20 VI规模指定FIFO
不管存储器怎么被IP代码模块或运用的其他部分运用,都从FPGA上可用的公共块存储器上分配存储空间,存储空间的巨细取决于方针渠道中所运用的特定FPGA。因而,关于IP代码模块的运用者,重要的是知道IP运用了多少存储器。这一信息应当包括在文档和上下文感知的协助文件中。运用IP模块的开发人员有必要清晰了解运用中不同部分所运用的块存储器的巨细,以防止编译进程中或许的存储溢出。
守时独立性
为使IP模块能够自在运用于LabVIEW FPGA运用中,该代码模块不该对主运用的守时发生显着影响。例如,在处理来自一个积分编码器的一对数字输入信号时,解码方位信息的代码模块不该当显着推迟调用它的运用程序。这就意味着,该IP代码模块子VI应当快速、高效地履行其操作。在大多数情况下,这要求子VI中不该存在任何循环结构。而且,子VI也不该运用任何等候或其他推迟代码运转的守时函数。如若守时或循环功用需求作为主运用的一部分,那么应当在调用它的VI中完结这些功用。下面的框图展现了一个积分解码器的完结。该典范运用局部变量存储IP代码模块一次调用以及下一次调用(其详细描绘见下段)的状况信息。
图5:一个积分解码器IP代码模块典范
使IP代码模块守时独立于调用者的指导方针,存在一个破例:假如该IP代码模块意图在于为其调用运用供给守时功用。此类IP代码模块的比如便是一个数据收集扫描时钟例程。下面的框图展现了一个简略的IP代码模块,它完结了一个具有附加功用特性的扫描时钟,附加功用便是验证调用的运用程序是否能够满意指定的守时。这一增强的扫描时钟能够方便运用于多个不同的运用中。在此例中,IP代码模块的操作与守时依赖性应当以文档的方式详细描绘,以便该IP的用户了解其运用的守时行为将遭到怎样的影响。
图6:一个扫描时钟IP代码模块典范
框图独立性
LabVIEW FPGA IP代码模块能够运用于运用不同编程模型的广泛运用中。许多LabVIEW FPGA特性选用while循环和for循环编写而成,这些循环并没有对代码、函数和其间所运用的VI作太多束缚。但是,单周期守时循环能够运用于一些要求更短周期时长的运用。因而,假如可行的话,IP代码模块应当经过编写使其能够运用于一个单周期守时循环中。这将对IP代码模块内的代码施加必定的束缚。但是,这些束缚与前述评论守时独立性的部分中所介绍的指导方针类似。
防止在您的IP代码模块中运用任何循环。
运用局部变量存储您的IP代码模块的一次调用以及下一次调用的状况信息。
防止在您的IP模块中运用任何守时函数。
防止在您的IP代码模块中运用与单周期守时循环不兼容的函数,如商余函数。
一些运用或许运用了一个IP代码模块的多个复制,该代码模块应当无缝支撑这样的操作。假如代码模块子VI运用了任何局部变量存储状况信息,那么该子VI应当设置为可重入。这样将在编译进程中创立多个FPGA之上的子VI的实例,每个实例都具有其专用存储空间用于寄存状况信息。
文档、测验与典范
在IP代码模块开发进程中,文档、测验和典范结构也都应当成为开发进程中有意为之的一部分。其他不熟悉该代码模块的开发人员将在其自己的运用中运用该代码而且需求把握关于怎么正确运用该IP的信息。
作为完结的一部分,每个将为其他开发人员运用的子VI都应当包括有LabVIEW上下文协助。当协助窗口翻开而且鼠标光标悬浮于子VI上方时,该上下文协助将显现在LabVIEW中。该文档应当包括关于VI操作/功用的一个根本描绘,以及关于每个输入输出参数的根本描绘。还应当留意任何其他关于子VI的编程束缚或束缚,如在单周期守时循环中的运用或块存储的运用率。关于VI及其参数的更详细描绘应当包括在一个独自的用户或参考手册文档中。
图7:PWM发生器IP的上下文协助典范
一旦完结了IP代码模块的根本完结,测验与典范结构就成了开发进程中的下一个逻辑过程。测验将保证该IP代码模块在各种不同的运用中完结预期的操作。IP代码模块的测验应当细心进行,掩盖不同的输入值和不同的编程场景,而不是只是掩盖开始所考虑的内容。关于每个IP,应当完结多个实例的测验以及在不同编程结构中的运用。
终究的IP代码模块应当包括一些根本典范和或许更高档的典范,以论述该代码模块如安在运用中运用。一般,关于环绕某个特定的IP的一项运用,这些典范将成为作业的起点。
图8:展现PWM发生器IP的运用方法的VI典范
总结
假如创立的IP代码模块灵敏且易于运用,那么LabVIEW FPGA IP代码模块能够在运用开发中供给显着的优势和节省。该文档所介绍的指导方针将有助于保证IP能够便利地复用并无须为单个运用进行定制处理。
下面是在开发任何LabVIEW FPGA IP进程中应当遵从的指导方针的总结列表:
I/O资源不该嵌入在IP代码模块的框图中。
请勿在IP中运用项目引证的存储器读写函数或FIFO读写函数。如或许,运用一个VI scoped存储块或FIFO(LabVIEW 8.20)。
文档化表述IP中存储器(存储器拓宽例程存储块、FIFO和查询表等)的一切运用。在IP的散布中包括任何存储器拓宽例程存储块VI。
不要在IP中包括任何循环结构或等候/循环守时器函数,除非这便是该IP的首要方针。
在IP中运用局部变量存储状况信息。
文档化表述IP的任何非正常的守时行为。