通过VHDL管道同步信号的设计技巧

时间:2012-11-29 12:52:09

标签: vhdl pipeline fpga

我正在设计VHDL中的视频像素数据处理流水线,其中包括多个步骤,包括乘法和除法。 我希望保持信号同步,以便我可以例如保持同步信号并在管道末端正确输出,同时处理经过多个处理阶段的操纵像素数据。

我假设我想使用移位寄存器或某些东西来按正确的周期数来延迟信号,以便输出正确,但我正在寻找关于设计这种方法的好方法的建议,特别是作为流水线级的数量因为我不断改进设计,因此不同的信号可能会有所不同。

3 个答案:

答案 0 :(得分:2)

好问题。

我不知道一个完整的解决方案,但这里有两个部分策略......

互连组件 ...如果某个组件导出一个通用,其值是其管道深度,那将是非常好的。不幸的是你不能,并且将端口专用于此似乎很愚蠢(尽管它可能是可行的;因为它将是一个整数常量,它将在合成中消失)

如果失败,请传入一个指示此模块预算的通用。如果无法满足预算,则在模块内部断言(严重性为FAILURE)...(此断言可在合成时检查,至少Xilinx XST处理类似的断言)

使预算成为一个硬数字,如果预算太大,则断言如果不等于实际管道深度,或者在模块内添加管道阶段,并且只有在预算太小时才断言。

这样你就可以连接可预测的模块,顶层可以执行流水线算法来平衡事物(例如将计算的常量值传递给可编程的延迟线)

在组件中 ...我使用单个进程,寄存器表示为内部信号,其名称反映其管道阶段exponent_1, exponent_2, exponent_3,依此类推。在此过程中,第一部分描述第一个周期的所有操作,第二部分描述第二个周期,依此类推。通常,“更容易”的路径可以逐字复制到下一个管道阶段,只是为了将它们与关键路径同步。这个过程相当有条理,易于维护。

我可能会将32位乘法分解为16 * 16块,并对部分产品添加进行管道传输。对此给出的控制,USED比XST单独给出更好的结果......

我知道有些人更喜欢一个过程中的变量,并且我将它们用于管道阶段的中间结果,但是使用信号我可以按照其自然顺序描述管道(由于推迟分配),而使用变量,我会有向后描述它!

答案 1 :(得分:1)

我为每个主要处理块创建一个包,其中一个常量是该块的处理延迟。然后我可以将它连接到我的通用“延迟线”块,该块具有循环数的通用。

保持与实际实现“同步”的常量最好通过自检测试平台完成。

答案 2 :(得分:0)

要考虑的是延迟线(即背靠背寄存器)与FIFO。

考虑具有管道延迟X的模块N。当N变量时,FIFO工作得很好。诀窍是记住,当模块和FIFO都可以接受它时,你只能请求新的工作。理想情况下,您可以调整FIFO的大小,使其可以包含X可同时处理的最大项目数,但有时这是不切实际的。例如,如果您的计算包括对远程记忆的访问。

另一种选择是将侧信道(即同步标记所采用的路径)集成到模块X中,而不是将其传输到外部。如果你这样做,那么如果计算的任何部分必须停止,你也可以停止侧通道,并且两者保持同步。你可以这样做,因为你在一个拥有所有必要信号的范围内。然后,无论是否在计算中使用,所有信号都会同时出现在输出端。

相关问题