2016-01-12 2 views
0

Я пытаюсь запрограммировать блок FPU в VHDL. Я делаю первые шаги. Я получаю две ошибки при выполнении этой инструкции:
mantissa1 <= std_logic_vector(resize(unsigned(mantissa1),mantissa1'length + d));ошибка при использовании функции изменения размера в vhdl

Ошибки:

Error: C:/Modeltech_pe_edu_10.4a/examples/fpu/shifter.vhd(38): Illegal type conversion to ieee.std_logic_1164.STD_LOGIC_VECTOR (operand type is not known). 

Error: C:/Modeltech_pe_edu_10.4a/examples/fpu/shifter.vhd(36): (vcom-1078) Identifier "unsigned" is not directly visible. 

Вот мой код

library ieee; 

USE ieee.std_logic_1164.ALL; 
USE ieee.std_logic_misc.ALL; 
USE ieee.std_logic_unsigned.ALL; 
USE ieee.std_logic_arith.ALL; 
use ieee.numeric_std.all; 

entity fpu is 
port (
    E1,E2 : IN std_logic_vector(30 downto 23); 
    M1,M2 : IN std_logic_vector(22 downto 0); 
    S1,S2 : IN std_logic_vector (31 downto 31); 
    op : IN std_logic_vector (1 downto 0); 
    SUM : OUT std_logic_vector (45 downto 0); 
    E : OUT std_logic_vector (7 downto 0); 
    clk : IN std_logic 
); 
end entity; 

architecture arch_fpu of fpu is 
SIGNAL d: integer; 

SIGNAL mantissa1 : std_logic_vector (22 DOWNTO 0) ; 
SIGNAL mantissa2 : std_logic_vector (22 DOWNTO 0) ; 
begin 
process(E1,E2,M1,M2,S1,S2,clk) 
BEGIN 
if((op="01") or (op="00")) then 

E<=E1 when E1>E2 else 
E2; 

d<=abs(conv_integer(E1-E2)); 

mantissa1 <= std_logic_vector(resize(unsigned(mantissa1),mantissa1'length + d)); 


end if; 
END process; 
end arch_fpu; 
+0

На словах, что вы пытаетесь выполнить на этой строке кода? – Russell

+0

Я хочу изменить размер битов mantissa1, увеличив его размер на d. –

+0

Однако 'mantissa1' имеет фиксированную длину, определяемую его диапазоном индексов. – user1155120

ответ

2

Вы смешиваете VHDL математические библиотеки. Я предлагаю вам использовать либо numeric_std (мои предпочтения), либо std_logic_unsigned/std_logic_arith, но не оба.

Есть еще несколько вопросов. Вы не можете присвоить значение manitissa1 большего размера (по 'd') обратно manitissa1, вам нужна цель соответствующего размера. Вычитание E1-E2 потребует некоторого преобразования типа, которое может быть законным, возможно: подписанный (E1) - подписанный (E2)

Честно говоря, вы, вероятно, захотите переосмыслить весь подход к тому, что вы пытаетесь сделать, особенно если вы ожидаете синтезировать этот код в логике.

Смежные вопросы