vhdl关系运算
请我需要帮助,我正在尝试将我的值剪裁在+2048和-2048之间,但这是标准逻辑向量,即(“111111111110000000000000000000000000”和“00000000000000000000000000000000000”),我来自软件背景,我想这就是为什么会出现这个问题,我附上了我的代码片段vhdl关系运算,vhdl,Vhdl,请我需要帮助,我正在尝试将我的值剪裁在+2048和-2048之间,但这是标准逻辑向量,即(“111111111110000000000000000000000000”和“00000000000000000000000000000000000”),我来自软件背景,我想这就是为什么会出现这个问题,我附上了我的代码片段 --Saturate the output to -2048 to +2048 saturate1:process (x1,x2) --variable sum, tmp :st
--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,我能够用一个变量来解决它,你的方法不会像我以前那样产生同样的错误,但我感谢你的努力。