在VHDL中,如果你想增加一个代表实数的std_logic_vector,我会遇到一些选择。
1)使用类型转换数据类型转换函数将std_logic向量更改为有符号或无符号值,然后将其转换为整数,向该整数添加1,并将其转换回std_logic_vector,方式与之前相反。尝试这样做时,下面的图表非常方便。
2)检查LSB的值。如果是'0',则将其设为'1'。如果它是'1',则执行“向左移位”并将'0'连接到LSB。例如:(对于16位向量)向量(15 downto 1)& '0';
在FPGA中,与微处理器相比,物理硬件资源似乎是限制因素,而不是实际处理时间。你总是有可能用完物理门。
所以我真正的问题是:这些实现中的哪一个在FPGA中“更昂贵”,为什么?编译器是否足够强大以实现相同的物理表示?
答案 0 :(得分:15)
所有类型的转换费用都没有。
不同的类型纯粹是为了尽可能清晰地表达设计 - 不仅对其他读者(或自己,明年:-)而且对编译器表达,让它尽可能多地捕获错误(例如,这个整数值超出范围)
类型转换是告诉编译器“是的,我打算这样做”的方式。
使用最能表达设计意图的类型。
如果你使用了太多的类型转换,那通常意味着某些东西被声明为错误的类型;停下来思考一下设计,它通常会很好地简化。如果你想增加一个std_logic_vector,它应该是一个无符号的,甚至是自然的。
然后在必要时转换:通常在顶级端口或其他人的IP。
转换可能会极大地减慢模拟速度,但这是另一回事。
至于你的选择2:低级别的详细描述不仅比a <= a + 1;
更难理解,而且合成工具不易翻译,更容易包含错误。
答案 1 :(得分:0)
我正在给出另一个答案,以便更好地回答为什么就门和FPGA资源而言,使用哪种方法并不重要。最后,逻辑将在查找表和触发器中实现。通常(或总是?)FPGA架构中没有本机计数器。综合将您的代码转换为LUT,句点。我总是建议尝试尽可能简单地表达代码。您尝试在RTL中编写代码的次数越多(与行为相比),它就越容易出错。 KISS是每次都适当的行动方案,综合工具,如果有的话,会尽可能地简化你的意图。
答案 2 :(得分:0)
手动实现算术的唯一原因是:
在许多情况下,您也可以稍微重写RTL代码或使用KEEP之类的综合属性来说服综合工具做出更优化的实现选择,而不是手工实现算术组件。
顺便说一句,降低硬件计数器成本的一个相当标准的技巧是避免使用普通的二进制算法,而是使用例如LFSR计数器。如果您对FPGA感兴趣,请参阅Xilinx XAPP 052以获得该领域的一些灵感(它已经很老了但是当前FPGA的一般原理是相同的。)