2013-03-02 38 views
0

我面臨一個問題......其中p3,p6,p9,p1,p4 p7是8位std_logic_vector。 (p3 + 2 * p6 + p9) - (p1 + 2 * p4 + p7)沒有乘法,而是通過移位操作(通過2 =>左移1),其結果可能是be +或-ve。無符號操作需要簽名變量或VHDL中的內容

所以我想簽名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 

回答

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)));。我認爲這裏的問題是轉換爲signed時的符號擴展,因此在前面添加額外的零應該修復它。

+0

P4,P3,P6,P9,P7,P1是固定的8位像素values..and如果一個 - 已經沒有。 。iwant它的絕對值。 – NjN 2013-03-02 13:48:03

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範圍減少位權數,因爲它應該工作有點移需要多少位。即便如此,映射器可能會弄清楚以後反正客場優化不需要位