无符号运算需要签名变量或VHDL中的变量

时间:2013-03-02 09:14:44

标签: vhdl vhosts vhd

我遇到了一个问题......其中p3,p6,p9,p1,p4 p7是8位std_logic_vector。

我想进行像(p3 + 2 * p6 + p9) - (p1 + 2 * p4 + p7)这样的操作,没有乘数但是通过移位操作。(通过2 =>左移1)并且其结果可能是+或-ve。

所以我想要签名one.if它超过255使得结果255另外明智的8位值。第一个h1给出了错误的结果。

您可以在下面找到代码

-

- Company: 
-- Engineer: 
-- 
-- Create Date:    21:01:45 01/11/2013 
-- Design Name: 
-- Module Name:    HRZ - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity HRZ is
PORT ( CLK     : IN  STD_LOGIC;
             RST     : IN  STD_LOGIC;
             P1,P3,P4,P6,P7,P9 : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
             MAG_HRZ : OUT  STD_LOGIC_VECTOR(7 DOWNTO 0) );
end HRZ;

architecture Behavioral of HRZ is
SIGNAL H1: signed(17 DOWNTO 0) ;

SIGNAL THRESHOLD: signed(17 DOWNTO 0):="000000000011111111";
begin
P :  PROCESS(CLK)

BEGIN

H1<=SIGNED(('0'&P3+'0'&P6(7 DOWNTO 0)&'0'+'0'&P9)-('0'&P1+'0'&P4(7 DOWNTO 0)&'0'+'0'&P7));
IF(H1>=THRESHOLD) THEN
MAG_HRZ<="11111111";
ELSE
 IF H1(17)='0' THEN
  MAG_HRZ<=H1(7)&H1(6)&H1(5)&H1(4)&H1(3)&H1(2)&H1(1)&H1(0);
  ELSE
 MAG_HRZ<=NOT(H1(7)&H1(6)&H1(5)&H1(4)&H1(3)&H1(2)&H1(1)&H1(0))+'1';

  END IF;
END IF;
END PROCESS P;
end Behavioral;
vh

2 个答案:

答案 0 :(得分:1)

使用libs IEEE.STD_LOGIC_ARITH和IEEE.STD_LOGIC_UNSIGNED被认为已弃用。您应该使用IEEE.NUMERIC_STD 除此之外,我认为你不需要给出明确的范围P4(7 downto 0)P4应该做得很好。同样适用于P6 我没有测试它,但尝试SIGNED('0'&(('0'&P3+'0'&P6&'0'+'0'&P9)-('0'&P1+'0'&P4&'0'+'0'&P7)));。我认为这里的问题是转换为signed时的符号扩展,因此在前面添加一个额外的零应修复它。

答案 1 :(得分:0)

我使用整数,生活要容易得多......限制输入:

variable p1,p2,... : integer range 0 to 255;

您的两个中间值也是无符号的(或整数世界中的natural):

variable i1, i2 : natural;

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

最终值必须是有符号值,因此integer类型:

variable final : integer;

final := i1 - i2;

这不是80年代,合成器非常聪明 - 让合成器搞清楚。如果

,请“解雇”
  • 它不只是为*2
  • 换了一点
  • 它不会将final的范围缩小到正确的位数,因为它应该计算出需要多少位。即使这样,映射器也可能会在以后找出它并优化不需要的位