gpt4 book ai didi

binary - VHDL如何处理溢出?

转载 作者:行者123 更新时间:2023-12-01 15:27:25 24 4
gpt4 key购买 nike

我正在做一个设计,我认为可能会发生一些我需要处理的溢出。为了解决我的问题,我需要了解 VHDL 如何处理二进制溢出。下面是一些示例代码。

signal temp   : std_logic_vector (7 downto 0) := "11111111"; 
signal temp_2 : std_logic_vector (7 downto 0) := "11111111";
signal result : std_logic_vector (8 downto 0) := "000000000";

result <= temp + temp_2 ;

显然这没有调用相关的库,但它让我了解了我正在使用的代码。我的问题是:此二进制加法 (temp + temp_2) 是如何工作的,即运行此代码后信号 result 是什么?现在,我在编译中遇到错误,因为 result 是 9 位,而它期望是 8 位。任何关于此二进制加法的确切工作原理的解释都将非常有帮助!

最佳答案

VHDL 是强类型的。任何时候分配信号,都需要匹配类型和宽度。

对于类型:您不能将整数类型的信号分配给 std_logic_vector 信号,编译器会抛出错误。您必须先将整数转换为 std_logic_vector。

对于宽度:您需要始终完美匹配宽度分配。在您的情况下,该工具对您很生气,因为您将 8 位宽的内容分配给 9 位宽的信号结果。

为了完成你想要的,你必须使用符号扩展。您输入的是签名还是未签名?如果它们是无符号的,只需在最高有效位位置添加一个“0”。如果它们是有符号的,则必须确定位位置 7 的符号,然后将其扩展到位位置 8。

在这两种情况下,您都可以这样做:

temp_extended_unsigned <= '0' & temp(7 downto 0);
temp_extended_signed <= temp(7) & temp(7 downto 0);

temp_2_extended_unsigned <= '0' & temp_2(7 downto 0);
temp_2_extended_signed <= temp_2(7) & temp_2(7 downto 0);

result <= temp_extended_unsigned + temp_2_extended_unsigned; -- unsigned case
result <= temp_extended_signed + temp_2_extended_signed; -- signed case

请注意,添加 1 位位置对于加法来说效果很好,但是乘法呢?您必须考虑要执行的操作...将两个 8 位宽的向量相乘将产生 16 位宽的结果,因此您必须在该示例的高 8 位上进行符号扩展。

关于binary - VHDL如何处理溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21163915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com