在VHDL中,数据类型转换与位数组操作的成本有多高?

在VHDL中,数据类型转换与位数组操作的成本有多高?,vhdl,fpga,Vhdl,Fpga,在VHDL中,如果要将表示实数的std_逻辑_向量增加1,我会遇到一些选项 1) 使用类型转换数据类型转换函数将std_逻辑向量更改为有符号或无符号值,然后将其转换为整数,将一个添加到该整数,然后以与以前相反的方式将其转换回std_逻辑向量。尝试执行此操作时,下面的图表非常方便 2) 检查以查看LSB的值。如果是“0”,则将其设为“1”。如果是“1”,请执行“左移”,并将“0”连接到LSB。例如:(对于16位向量)向量(15到1)和“0” 在FPGA中,与微处理器相比,物理硬件资源似乎是限制因

在VHDL中,如果要将表示实数的std_逻辑_向量增加1,我会遇到一些选项

1) 使用类型转换数据类型转换函数将std_逻辑向量更改为有符号或无符号值,然后将其转换为整数,将一个添加到该整数,然后以与以前相反的方式将其转换回std_逻辑向量。尝试执行此操作时,下面的图表非常方便

2) 检查以查看LSB的值。如果是“0”,则将其设为“1”。如果是“1”,请执行“左移”,并将“0”连接到LSB。例如:(对于16位向量)向量(15到1)和“0”

在FPGA中,与微处理器相比,物理硬件资源似乎是限制因素,而不是实际处理时间。你总是有可能耗尽物理大门的风险


所以我真正的问题是:在FPGA中哪一种实现“更昂贵”,为什么?编译器是否足够健壮以实现相同的物理表示

所有类型转换都不需要成本

不同的类型纯粹是为了尽可能清楚地表达设计——不仅是对其他读者(或者你自己,明年:-)而且是对编译器,让它捕获尽可能多的错误(例如,这个整数值超出范围)

类型转换是告诉编译器“是的,我想这么做”的方式

使用最能表达设计意图的类型

如果您使用了太多的类型转换,这通常意味着某些内容被声明为错误的类型;停下来思考一下设计,它通常会很好地简化。如果您想要递增一个std_逻辑_向量,它可能应该是一个无符号的,甚至是一个自然值

然后在必要时进行转换:通常在顶级端口或其他人的IP

转换可能会无限地减慢模拟速度,但那是另一回事


至于你的选项2:低层次的详细描述不仅比
a更难理解,我给出了另一个更好的答案,为什么在门和FPGA资源方面,使用哪种方法并不重要。最后,逻辑将在查找表和触发器中实现。通常(或始终?)FPGA结构中没有本机计数器。综合将把你的代码变成LUT,句号。我总是建议尽可能简单地表达代码。您越是尝试用RTL编写代码(与行为代码相比),它就越容易出错。每次亲吻都是适当的行动过程,合成工具(如果有的话)会尽可能简化你的意图。

手工实现算术的唯一原因是如果你:

  • 认为您可以比合成工具做得更好(更好的是更小、更快、更少的功耗,等等)
  • 您认为从长远来看,代码的可移植性和可维护性的降低并不重要
  • 如果您的工作比合成工具做得更好,这实际上很重要(例如,您只能通过手动操作,而不是让合成工具为您完成操作,才能达到所需的工作频率)
在许多情况下,您还可以稍微重写RTL代码,或者使用合成属性(如KEEP)说服合成工具做出更优化的实现选择,而不是手动实现算术组件


顺便说一下,降低硬件计数器成本的一个相当标准的技巧是避免使用普通的二进制算法,而是使用例如LFSR计数器。如果您对FPGA感兴趣,请参阅Xilinx XAPP 052,以获取这方面的一些灵感(它非常古老,但一般原理在当前FPGA中是相同的)。

您的第二个算法不会将值增加1。例如,如果您的值是
“01001”
,会发生什么?谁说您不能?