我应该为我的FPGA使用哪种编码类型?正如我在前一篇文章中所讨论的,编译器通常会为您决定这一点—我建议您遵循编译器的决定。
然而,理解编码类型之间的差异以及为什么编译器可能会得出某种结论是重要的。考虑到这一点,本文将带领您通过一个实验,演示一个示例FPGA应用程序,并逐步讨论哪种编码类型是最好的。
到目前为止,我们已经讨论了这个系列如何创建一个有限状态机(FSM)与Verilog,初始状态以及内存如何影响FPGA编码,并进行高层概述比较二进制编码、单热编码和灰色编码。
被测系统
在这个实验中,我想多次实例化一个状态机,以便在使用二进制、Gray和one-hot编码时放大结果硬件中的差异。
我最终选择的系统是康威的生命游戏,一个细胞自动机,它模拟活细胞在其环境中的行为,是一个矩形的二维细胞阵列。康威的生命游戏模拟了这些细胞的出生、繁殖和死亡,每个细胞都遵循一套简单的规则来决定下一个周期会发生什么。每个活的细胞可以存活或死亡,而每个死的细胞可以保持死亡或变成活的。以下是每个循环的规则:
- 有两个或三个邻居的活细胞存活。
- 死细胞和三个活的邻居苏醒过来。
- 所有其他细胞死亡或保持死亡。
这些规则创造了许多有趣的行为和模式,这些行为和模式已经在计算机科学中得到了广泛的研究。
这就是康威的《生命游戏》在运行高斯帕滑翔枪时的样子。
康威的《生命游戏》的变种,被称为比尔·高斯帕的《滑翔机枪》。Gif由卢卡斯维埃拉(3.0 CC冲锋队]
Verilog代码
回到我们的测试系统,每个单元都被设计为具有8个状态的状态机。不可否认,Conway的Game of Life中的细胞逻辑可以在一个周期内解决,但我决定制作一个8状态的机器,以便在使用不同编码时具有显著的差异。这些状态用于计数一个细胞的活邻居。
下面的Verilog代码显示了这些机器的单元模块结构,包括状态的原始二进制编码。
“定义STATE_0 3 'b000
“定义STATE_1 3 'b001
“定义STATE_2 3 'b010
“定义STATE_3 3 'b011
“定义STATE_4 3 'b100
“定义STATE_5 3 'b101
“定义STATE_6 3 'b110
“定义STATE_7 3 'b111
模块LifeCell (
输入时钟,
输入称说,
输入种子,
输入7:0的邻居,
输出reg活着);
注册(2:0)状态;
总是@ (posedge clk)
如果(nrst == 0)
国家< = ' STATE_0;
其他的
例(状态)
“STATE_0:开始
/ /……
国家< = ' STATE_1;
结束
“STATE_1:开始
/ /……
国家< = ' STATE_2;
结束
/ /……
“STATE_7:开始
/ /……
国家< = ' STATE_1;
结束
endcase
endmodule
如果您想仔细查看代码,请随意检出GitHub上的项目。
FPGA编码实现
该系统被合成并实现为一个23x23细胞的世界,总共有27个变体:使用了三种不同的FSMs,都采用上述三种编码,都在三种不同的目标fpga上。
FSM #1:原始模型
这台机器有一个初始状态,运行一次,然后通过其余七个状态循环运行。这几乎是一个完整的序列,所以Gray编码一开始对我来说似乎很有前途。
FSM #2:一个序列
这台机器的行为就像一个3位计数器,所以我也期望灰色编码能够击败竞争对手。
FSM #3:任意纠结
这台机器具有与FSM #1相同的关键路径,但当已知存活的邻居数超过3时,它将通过任意路径。
对于这种任意状态转换行为,我认为一次性编码是最好的选择。
目标架构
该系统用于三个目标fpga,使用他们的供应商的开发工具:
- Xilinx Vivado套件,用于artix7 FPGA
- Intel Quartus Prime,用于Cyclone V FPGA
- Lattice Diamond,用于LatticeXP2 FPGA
比较结果
比较两个或更多系统的性能是困难的,主要是因为判断取决于我们使用的指标,以及我们认为哪个方面比其他方面更重要。在这个实验中,我收集了以下数据来为每个实现生成一个分数:
- 逻辑单元的数量。这些是Xilinx和Lattice fpga的lut(查找表),或者是Intel fpga的alm。分数:1分。
- 寄存器的数量。分数:1分。
- 估计最大频率。得分:2分。
- 估计芯片上的权力。得分:2分。
对于每个实现,这四个方面都在三种编码中进行了比较,因此在这些编码中,我得到了一个最好的、一个最差的和一个中间结果:最好的得到它的正分数,最差的得到它的负分数,中间的得到0。
将每个模型的所有分数加起来,得到如下结果:
所有27种实现的结果表。在每一行中,最佳编码用绿色表示,最差编码用红色表示,如果没有领带,中间编码用黄色表示。
这似乎表明要远离一热编码,只有两种情况下它会胜出,其中一种是平局。此外,虽然我最初预计one-hot是FSM模型#3的最佳编码,但它却是最糟糕的编码,没有开发工具推荐它。也就是说,在某些情况下,一个热点胜过其他热点,主要是在频率和功率指标上。
总的来说,灰色编码似乎是这个特定系统的最佳选择。
从这个表中提取赢家,我们得到以下结果:
判决结果
尽管这种比较似乎更倾向于灰色编码,而不是二进制编码和单热点编码,但结果很大程度上取决于我们使用的指标,而这些指标反映了什么对我们来说是重要的。例如,在这个比较中,我认为频率和功率比使用(设计中的逻辑元素和寄存器的数量)更重要。如果我重视使用而不是频率,重视频率而不是功率,那么肯定会出现不同的排名。
这种比较并不打算成为使用这些编码获得的性能的决定性工作。相反,它显示了根据我的个人偏好在我使用的体系结构中产生的排名。
再说一次,如果你想看一下代码,看看27个实现,或者看看我对Conway的Game of Life的模拟,请看看GitHub上的项目。
这是一篇很好的理论文章,
假设你使用的是FPGA
依我之见,使用默认的“自动”模式最好。
我知道的所有工具,都有内在的优化,
基本的,使用枚举类型编码状态机,
不要分配状态。
该工具将优化您的FPGA,以满足您的时间限制。
这是工具的事实,如果设备是空的,那么工具就会想出一个解决方案,
当设备装满后,他们会找到另一种解决方案来满足你的设计,
记住,工具,运行,直到他们满足您的时间和适合的设备。
我作为顾问工作的大多数地方,都有设计指南,上面说你只能使用自动模式,
有些人在转移到新设备时,由于不使用自动模式,导致大型机器的设计失败。