首页 文章

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

提问于
浏览
5

在VHDL中,如果你想增加一个表示实数的std_logic_vector,我会遇到一些选项 .

1)使用类型转换数据类型转换函数将std_logic向量更改为有符号或无符号值,然后将其转换为整数,向该整数添加1,并将其转换回std_logic_vector,方式与之前相反 . 尝试这样做时,下面的图表很方便 .

Number to Vector Conversion Chart

2)检查LSB的值 . 如果是'0',则将其设为'1' . 如果它是'1',则执行“向左移位”并将'0'连接到LSB . 例如:(对于16位向量)向量(15 downto 1)&'0';

在FPGA中,与微处理器相比,物理硬件资源似乎是限制因素,而不是实际处理时间 . 你总是有可能用完物理门 .

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

3 回答

  • 14

    没有任何类型的转换成本 .

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

    类型转换是告诉编译器“是的,我打算这样做”的方式 .

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

    如果你使用太多的类型转换,那通常意味着某些东西被声明为错误的类型;停下来思考一下设计,它通常会很好地简化 . 如果你想增加一个std_logic_vector,它应该是一个无符号的,甚至是自然的 .

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

    转换可能会极大地减慢模拟速度,但这是另一回事 .

    至于你的选择2:低级详细描述不仅比 a <= a + 1; 更难理解,但它们对于合成工具来说并不容易翻译,而且更容易包含错误 .

  • 0

    我给出了另一个答案,以便更好地回答为什么在门和FPGA资源方面,使用哪种方法并不重要 . 最后,逻辑将在查找表和触发器中实现 . 通常(或总是?)FPGA架构中没有本机计数器 . 综合将您的代码转换为LUT,句点 . 我总是建议尝试尽可能简单地表达代码 . 您尝试在RTL中编写代码的次数越多(与行为相比),它就越容易出错 . KISS是每次都适当的行动方案,综合工具,如果有任何好处,将尽可能简化您的意图 .

  • 0

    手动实现算术的唯一原因是:

    • 认为你可以比综合工具做得更好(更好的可能更小,更快,更省电等)

    • 并且您认为从长远来看,代码的可移植性和可维护性降低并不重要

    • and 如果你的工作比综合工具做得更好,那实际上很重要(例如,只有手工完成,而不是让综合工具为你做这件事,你才能达到你想要的工作频率) .

    在许多情况下,您还可以稍微重写RTL代码或使用KEEP之类的综合属性来说服综合工具做出更优化的实现选择,而不是手工实现算术组件 .

    顺便说一下,降低硬件计数器成本的一个相当标准的技巧是避免正常的二进制算术,而是使用例如LFSR计数器 . 如果您对FPGA感兴趣,请参阅Xilinx XAPP 052以获得该领域的一些灵感(它很老但是当前FPGA的一般原理是相同的) .

相关问题