0

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

我想做 (p3+2*p6+p9)-(p1+2*p4+p7) 之类的操作,没有乘数,而是通过移位操作。(通过两个=>左移 1),其结果可能是 + 或 -五。

所以我想要签名一个。如果它超过 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
4

2 回答 2

1

使用库 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)));. 我认为这里的问题是转换为有符号时的符号扩展,因此在前面添加一个额外的零应该可以解决它。

于 2013-03-02T12:47:22.167 回答
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到正确的位数,因为它应该计算出需要多少位。即便如此,映射器可能会在以后解决它并优化不需要的位
于 2013-03-05T10:26:13.877 回答