我正在用VHDL编写代码,用于对信号进行算术运算。我宣布信号如下:
signal x : std_logic_vector (7 downto 0);
signal y: std_logic_vector (7 downto 0);
signal z: std_logic_vector ( 7 downto 0);
z<= x-y ;
详细信息:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
USE ieee.std_logic_arith.conv_std_logic_vector;
library ieee_proposed;
use ieee_proposed.fixed_pkg.all;
signal heat0,heat1,heat2 : std_logic_vector(31 downto 0);
signal Data_In, M_AXIS_TDATA Fixed_input_tdata: std_logic_vector (31 downto 0);
shared variable float, h0,h1,h2,fixed1,fixed2,fixed3,fixed_shift :ufixed (23 downto -8);
shared variable fixed_64: ufixed (31 downto -32);
float := to_ufixed(unsigned (Fixed_input_tdata), 23,-8);
h2 := to_ufixed(unsigned(Data_In),23,-8);
heat1 <= Data_in;
h1 := to_ufixed(unsigned(heat1),23,-8);
heat0<= heat1;
h0 := to_ufixed(unsigned(heat0),23,-8);
heat1_mult := std_logic_vector(unsigned(heat1) sll 1);
fixed_shift := to_ufixed(unsigned (heat1_mult), 23,-8);
fixed1 := fixed_shift+h2;
fixed2 := h0-fixed1;
fixed_64 := fixed2 *float;
fixed3 := h1+fixed_64;--(23 downto -8);
M_AXIS_TDATA <= std_logic_vector (fixed3);
使用定点进行std_logiC-vector的算术运算是否正确?
让我们举一个例子,z = 0x01-0x11。这将给出负输出(0xF0):但我不想要负输出。我希望看到这个价值是积极的。我甚至试图将这些信号类型更改为无符号,但仍然无法成功。实际上我在vhdl中有一些复杂的数学运算,所以我只是举一个例子来说明我的观点是可以理解的。我不想使用签名值。如何发送正无符号输出?
又如:如果我的输出是bf978000,它将显示为负数-1.18。我希望它是积极的,而不是消极的。
让我再举一个例子:
z = 2+ [0.2 *(4-10)] = 0.8。 固定点格式为0.8(0x000000cd)(24整数,8分数格式): 0.2是固定点格式的0x00000033。 (24整数,8分数格式) 但我得到[0x00000002 +(0x00000033 *(0x00000004-0x0000000A)] = FFFFFED0。(这是负数)。如何再次将该输出表示为0.8。
答案 0 :(得分:1)
如果您可以直接使用z <= x - y
,听起来您使用的是ieee.std_logic_unsigned
之类的Synopsys软件包,但您可以考虑使用VHDL标准软件包ieee.numeric_std
,这是在下面的例子中使用。
std_logic_vector
默认情况下不具有任何数字表示形式;它只是一个std_logic
的数组。 unsigned
包中的ieee.numeric_std
类型可以指示执行std_logic_vector
的{{1}}的数字表示。因此,使用无符号减法的上述表达式将为:
unsigned(x).
任何欠载/超限,与“z = 0x01-0x11”一样,将导致包装而没有任何指示。
答案 1 :(得分:1)
我认为你的问题需要一些改进。我不知道它为什么标记了verilog,你所显示的十六进制数字没有被签名,std_logic_vector首先不是算术(添加这样的解释是用std_logic_arith或类似的,但是它最好使用unsigned并从numeric_std签名)。因此,你的代码必须有更多的减法甚至工作,所显示的负数必须来自其他东西;也许是一个模拟器?模拟器和波形查看器往往有自己的设置来解释信号。
因此,展开您的样本以显示您正在使用的环境,并解释您实际寻求的操作。你的意思是采取差异的绝对值,还是使用饱和算术?