首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FPGA编程时的一些注意事项(4)

FPGA编程时的一些注意事项(4)

五、FPGA编程时的普通循环和单周期定时循环
        在说循环之前,我们首先来看一下FPGA在对代码编译到硬件上时会做什么样的操作。默认情况下,LabVIEW需要确保程序在顶层时钟下能编译成功。在编程时,我们常常对数据进行多种联结在一起的运算操作,如下所示。这些联结在一起的运算使得联合路径较长并导致总的时钟速率降低。基于这样的原因,LabVIEW会在如下代码的各运算函数之间增加寄存器,来拆分关键路径的长度,确保程序可以在顶层时钟下执行。每个寄存器的执行都需要一个tick,那么以下这段代码的执行之间就是3个ticks。

While循环和For循环都可以用来执行重复的计算操作。这一点,与上位机中的功能是完全一致的。通常,我们会将一些操作放在循环中进行持续的处理。那么上述代码在循环中的执行时序如下:

循环中每一个函数都在预留的硬件资源中等待上一个函数给出有效的输出。因此,每次循环的执行都需要三个时钟周期。上图中显示的还是一些简单的运算,例如乘法、加法、逻辑比较等。如果程序中用到了一些多周期的数值运算函数,比如商与余数、倒数、平方根、除法等,那么一个循环执行的时间将会更长。总结来说,一个普通的while或者for循环执行的速率依赖于顶层时钟以及一行代码最多有多少个运算。
        基于上述的原理,很多时候,普通的while循环或者for循环并不能满足实际的需求。即使将顶层时钟提升,也是有上限的。这种情况下,可以使用单周期定时循环(SCTL)来实现功能。在单周期定时循环中,程序员可以控制联合路径的长度,因为程序不再自动在函数之间增加寄存器,而使用到的反馈节点以及移位寄存器在硬件上都使用触发器来实现。另外,单周期定时循环可以使用的时钟频率更加丰富。基于这些原因,单周期定时循环的效率接近HDL语言。同样将之前所述的代码放入到单周期定时循环中。

我们来看一下这段代码在普通的循环中和在单周期定时循环中的执行效率。

可以看见,普通的循环由于 有系统自动添加的寄存器的效果,每个时钟周期执行一个运算函数,而单周期定时循环可以在一个时钟周期内执行循环内的所有代码。当然,如果循环内的代码无法在一个时钟周期内完成,那么,程序在编译时就会报出定时错误。这种情况下,需要修改代码,减少关键路径所占用的时间。
继承事业,薪火相传
返回列表