我正在用 VHDL 设计一个视频像素数据处理管道,它涉及多个步骤,包括乘法和除法。我想保持信号同步,以便我可以保持同步信号,并在流水线末端正确输出它以及经过多个处理阶段的操纵像素数据。
我假设我想使用移位寄存器或其他东西将信号延迟正确的周期数,以便输出正确,但我正在寻找有关设计它的好方法的建议,特别是不同信号的流水线级数随着我对设计的改进,可能会有所不同。
好问题。
我不知道一个完整的解决方案,但这里有两个部分策略......
互连组件...如果组件可以导出其值是其管道深度的泛型,那将是非常好的。不幸的是你不能,并且为此专门提供一个端口似乎很愚蠢(尽管它可能是可行的;因为它是一个整数常量,它会在综合中消失)
如果做不到这一点,请传入一个通用的指示此模块的预算。在模块内部,如果无法满足预算,则断言 (severity FAILURE)...(此断言在合成时是可检查的,并且至少 Xilinx XST 可以处理类似的断言)
将预算设为硬数字,如果不等于实际管道深度则断言,或者如果预算太大,则在模块内添加管道阶段,仅在预算太小时时断言。
这样您就可以连接可预测的模块,并且顶层可以执行流水线算法来平衡事物(例如,将计算出的常数值传递给可编程延迟线)
在一个组件内……我使用一个进程,寄存器表示为内部信号,其名称反映了它们的管道阶段,exponent_1, exponent_2, exponent_3
依此类推。在流程中,第一部分描述了第一个周期的所有动作,第二部分描述了第二个周期,依此类推。通常,“更简单”的路径可以逐字复制到下一个管道阶段,只是为了将它们与关键路径同步。该过程相当有条理且易于维护。
我可能会将 32 位乘法分解为 16*16 的块,并将部分乘积添加流水线化。这给出的控制,用于给出比 XST 单独给出的更好的结果......
我知道有些人更喜欢流程中的变量,我将它们用于管道阶段的中间结果,但是使用信号我可以按自然顺序描述管道(感谢延迟分配),而使用变量,我必须描述它向后!
我为我的每个主要处理块创建一个包,其中的一个常量是该块的处理延迟。然后我可以将它连接到我的通用“延迟线”块,该块具有通用的周期数。
最好通过自检测试台来保持与实际实现“同步”的恒定。
需要考虑的是延迟线(即背靠背寄存器)与 FIFO。
考虑一个X
具有流水线延迟的模块N
。当存在N
变量时,FIFO 工作良好。诀窍是记住,只有在模块和 FIFO 都可以接受时,您才能请求新工作。理想情况下,您调整 FIFO 的大小,以便它可以包含X
可以同时工作的最大项目数,但有时这不切实际。例如,如果您的计算包括对远程内存的访问。
另一种选择是将侧通道(即同步标志所采用的路径)集成到模块中X
,而不是向外输出。如果您这样做,那么如果计算的任何部分必须停止,您也可以停止侧通道并且两者保持同步。您可以这样做,因为您处于一个包含所有必要信号的范围内。然后所有信号,无论是否用于计算,都会同时出现在输出端。