vhdl关系运算

vhdl关系运算,vhdl,Vhdl,请我需要帮助,我正在尝试将我的值剪裁在+2048和-2048之间,但这是标准逻辑向量,即(“111111111110000000000000000000000000”和“00000000000000000000000000000000000”),我来自软件背景,我想这就是为什么会出现这个问题,我附上了我的代码片段 --Saturate the output to -2048 to +2048 saturate1:process (x1,x2) --variable sum, tmp :st

请我需要帮助,我正在尝试将我的值剪裁在+2048和-2048之间,但这是标准逻辑向量,即(“111111111110000000000000000000000000”和“00000000000000000000000000000000000”),我来自软件背景,我想这就是为什么会出现这个问题,我附上了我的代码片段

  --Saturate the output to -2048 to +2048

saturate1:process (x1,x2)
--variable sum, tmp :std_logic_vector(WWidth downto 0);
begin
    y11 <= x1+x2;

if y11 >= "000000000000100000000000000000000000" then
   y <= "000000000000100000000000000000000000";
elsif y11 >= "111111111111100000000000000000000000" then
   y <= "111111111111100000000000000000000000";
else
   y <= y2fullwidth;
end if;
end process saturate1;  
——将输出饱和至-2048至+2048
饱和1:过程(x1,x2)
--变量和,tmp:std_逻辑_向量(WWidth向下至0);
开始
y11=“00000000000000000000000000000000000”然后
y=“1111111111000000000000000000000”然后
yi)
“00000000000000000000000000000000000000000”
不是二进制的2048。是16772216

你好像在做数学。因此,我建议使用
numeric_std
软件包,并使用类型
signed

iii)您还需要将流程分为两部分。您不能驱动信号y11,然后在同一过程中对其进行采样。(在进程挂起之前,它不会被更新)。如果这对您来说是一个惊喜(而不仅仅是一个打字错误),您需要了解更多关于VHDL如何工作的信息

如果使用类型
signed
,则比较运算符(
=
等)将重载,以处理类型
signed
integer

y11 <= x1+x2;

saturate1:process (y11)
--variable sum, tmp :signed(WWidth downto 0);
begin    
  if y11 >= 2048 then
     y <= 2048;
  elsif y11 <= -2048 then
     y <= -2048;
  else
     y <= y2fullwidth;
  end if;
end process saturate1;  
y11=2048然后

y谢谢@Matthew Taylor,我能够用一个变量来解决它,你的方法不会像我以前那样产生同样的错误,但我感谢你的努力。