2013-03-02 3 views
0

У меня проблема ... в которой p3, p6, p9, p1, p4 p7 - 8 бит std_logic_vector.Неподписанная операция нуждается в подписанной переменной или в VHDL

Я хочу сделать операцию как (p3 + 2 * p6 + p9) - (p1 + 2 * p4 + p7) без множителя, но с помощью операции сдвига (через два => сдвиг влево на 1), и его результат может be + или -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 

ответ

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)));. Я думаю, что проблема здесь заключается в расширении знака при преобразовании в подписанное, поэтому добавление дополнительного нуля на фронте должно исправить его.

+0

p4, p3, p6, p9, p7, p1 являются фиксированными 8-битными пиксельными значениями..и если его нет. . iwant его абсолютное значение..дат yi поставить второй, если утверждение .. – NjN

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 для правильного числа битов, так как она должна работать сколько бит требуется. Тем не менее, картограф, вероятно, все равно выяснит это позже и оптимизирует ненужные биты.