在VHDL中有两种常用的编码状态机的方法:一个进程或两个进程。有些谣言(在某些大学教授)两个进程可能会产生更好的硬件。有没有人有这方面的确凿证据?我自己的初步测试表明,没有任何区别。
我正在寻找可重复的实验:两种编码风格的VHDL代码,以及如何合成它们的具体信息(哪个工具,哪些参数)。
请帮我解决或确认两个过程导致更好的合成硬件的神话。
答案 0 :(得分:3)
很多这种“知识”都是基于大约20年前的工具。事情已经发生了变化。
这并不是说它在所有情况下都得到了修复,但你通过实际进行试验来做正确的事。
过去已经避免的其他事情是:
wait
而不是敏感列表的同步过程。这个特别疯狂,因为如果您阅读VHDL规范,它会说两者是等价的,应该以相同的方式实现。答案 1 :(得分:2)
对不起,没有可重复的实验,但如果合成器关心(至少这些天 - 我没有确凿的证据),我会错开!当然,它只是将VHDL解析为一堆逻辑,为一堆触发器提供服务。
我甚至不知道使用是否是老式合成器的问题,或者人们是否只是认为它是这样的!
答案 2 :(得分:0)
下面的代码应该为具有时钟门的库演示这一点。模拟结果将是相同的,并且形式验证将证明这两者相同。然而,第一个可能会使用更少的功率和更少的面积。
//Instances 1 clock gate
reg [7:0] value;
always @(posedge i_clk)
if(enable)
value <= new_value;
//Instances 8 muxes
always @(posedge i_clk)
if(enable)
value <= new_value;
else //Exhaustive so assignment always occurs
value <= value;
第一个例子将时钟门用于所有8个DFF的时钟。第二个例子将使用8个多路复用器将每个DFF的输出循环回到它的输入。根据时钟门到多路复用器的面积和功率比,差异可能很大。这是在Talus上测试的。
当然第二个例子中的else子句是无用的,但实验的目的是看看该工具处理复杂的casez / x语句以及在always块之间共享启用的程度。对于FSM,只要检测到FSM,我就倾向于语法无关紧要。我的基础是XST如何处理它们,状态机优化是一个非常成熟的主题。