我遇到了一个问题......其中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
答案 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
的范围缩小到正确的位数,因为它应该计算出需要多少位。即使这样,映射器也可能会在以后找出它并优化不需要的位