无符号操作需要有符号变量还是VHDL中的什么

无符号操作需要有符号变量还是VHDL中的什么,vhdl,Vhdl,我面临一个问题…其中p3,p6,p9,p1,p4,p7是8位标准逻辑向量 我想做(p3+2*p6+p9)-(p1+2*p4+p7)这样的运算,不需要多个乘法器,而是通过移位运算(by two=>左移位1),其结果可能是+或-ve 所以我想要一个带符号的。如果它大于255,则使结果255与8位值的值不同。第一个h1给出了错误的结果 下面是代码 - -公司: --工程师: -- --创建日期:21:01:45 01/11/2013 --设计名称: --模块名称:HRZ-行为 --项目名称: --目

我面临一个问题…其中p3,p6,p9,p1,p4,p7是8位标准逻辑向量

我想做(p3+2*p6+p9)-(p1+2*p4+p7)这样的运算,不需要多个乘法器,而是通过移位运算(by two=>左移位1),其结果可能是+或-ve

所以我想要一个带符号的。如果它大于255,则使结果255与8位值的值不同。第一个h1给出了错误的结果

下面是代码

-

-公司:
--工程师:
-- 
--创建日期:21:01:45 01/11/2013
--设计名称:
--模块名称:HRZ-行为
--项目名称:
--目标设备:
--工具版本:
--说明:
--
--依赖项:
--
--修订:
--版本0.01-已创建文件
--补充意见:
--
----------------------------------------------------------------------------------
图书馆IEEE;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.STD_LOGIC_ARITH.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
----如果正在实例化,请取消对以下库声明的注释
----此代码中的任何Xilinx原语。
--UNISIM图书馆;
--使用UNISIM.VComponents.all;
实体HRZ是
端口(时钟:在标准逻辑中;
RST:标准逻辑中;
P1,P3,P4,P6,P7,P9:标准逻辑向量(7向下至0);
MAG_HRZ:OUT标准逻辑向量(7到0);
末端HRZ;
HRZ的体系结构是
信号H1:有符号(17向下至0);
信号阈值:有符号(17向下至0):=“0000000000 11111111”;
开始
P:过程(CLK)
开始
H1=阈值)然后

MAG_HRZ使用libs IEEE.STD_LOGIC_ARITH和IEEE.STD_LOGIC_UNSIGNED被认为是不推荐的。您应该改用IEEE.NUMERIC\u STD。
除此之外,我认为您不需要给出明确的范围
P4(7到0)
P4
。这同样适用于
P6


我没有测试它,但是尝试了
SIGNED('0'&P3++'0'&P6&'0'+'0'&P9)-(0'&P1++'0'&P4&'0'+'0'&P7))。我认为这里的问题是转换为有符号时的符号扩展,因此在前面添加一个额外的零应该可以解决它。

我会使用整数,这样生活就容易多了。。。约束输入:

variable p1,p2,... : integer range 0 to 255;
您的两个中间值也是无符号的(或整数世界中的
natural
):

最后的值需要是有符号的值,因此属于
整数类型:

variable final : integer;

final := i1 - i2;
这不是80年代,合成器非常聪明——让合成器自己想办法吧。如果有,请“开火”

  • 它不只是为
    *2
  • 它不会将
    final
    的范围缩小到正确的位数,因为它应该计算出需要多少位。即便如此,地图绘制者可能会在以后找到它,并优化不需要的位

p4、p3、p6、p9、p7、p1是固定的8位像素值。如果其a-ve编号为。。我想要它的绝对值我把数据放在if语句的第二位。。
variable i1, i2 : natural;

i1 := p3 + p6*2 + p9;
i2 := p1 + p4*2 + p7;
variable final : integer;

final := i1 - i2;