2 комплиментарный ввод и использование библиотеки vhdl для подписанного ввода

Мои входные данные являются комплиментом 2, и я разработал входное число со знаком, а вся операция использует число со знаком, библиотеку, которую я использовал ieee.numeric_std.all, но когда я делаю «+», возникает ошибка «найдены определения» 0 оператора "+", не может определить точное определение перегруженного сопоставления для "+"". Поэтому я изменил другую на другую библиотеку ieee.std_logic_arith.all и сделал операцию добавления как компонент, она работает. когда я имитировал свой код с помощью тестового стенда, произошла ошибка: порт объекта xin не соответствует типу, подписанному портом компонента. Я думаю, что эта ошибка связана с моей библиотекой. Может кто-нибудь помочь мне ?

новый

я не использую сумматор в качестве компонента, и приведенный ниже код работает

adder: process(clk)
begin
  if (clk'event and clk = '1')then
   if enable1='1' then
    add1 <= (x0(7)&x0) + (x15(8)&x15);
    add2 <= (x1(7)&x1) + (x14(8)&x14);
     add3 <= (x2(7)&x2) + (x13(8)&x13);
     add4 <= (x3(7)&x3) + (x12(8)&x12);
     add5 <= (x4(7)&x4) + (x11(8)&x11);
     add6 <= (x5(7)&x5) + (x10(8)&x10);
     add7 <= (x6(7)&x6) + (x9(8)&x9);
     add8 <= (x7(7)&x7) + (x8(8)&x8);
    end if;
  end if;
 end process adder;

и библиотека моего тестового стенда использует use ieee.numeric_std.all;

    USE ieee.std_logic_1164.ALL;
    use ieee.numeric_std.all;
    use ieee.std_logic_textio.all;
    use std.textio.all;

    ENTITY tb_signedinput IS
    END tb_signedinput;

ARCHITECTURE behavior OF tb_signedinput IS 

  -- Component Declaration
COMPONENT signedinput is
   port(   Clk : in std_logic; 
           reset : in std_logic;
             enable1 : in std_logic;
           Xin : in signed(7 downto 0); 
           Yout : out signed(19 downto 0) 
        );
END COMPONENT;

  --Inputs
   signal Clk : std_logic := '0';
   signal reset : std_logic := '0';
   signal Xin : signed(7 downto 0) := (others => '0');
   signal enable1 : std_logic := '0';
    --Outputs
   signal Yout : signed(19 downto 0);
   -- Array
    constant MEMSIZE: integer :=99;
    type testarray is array (MEMSIZE downto 0) of signed(7 DOWNTO 0);
   signal testvectors: testarray;

   shared variable vectornum,outnum: integer;

   -- Clock period definitions
constant Clk_period : time := 10 ns;

BEGIN

  -- Component Instantiation
 uut: signedinput PORT MAP(  Clk => Clk,
                             reset => reset,
                             Xin => Xin,
                                      enable1 =>enable1,
                             Yout => Yout   );  

ошибка все еще возникает:

Entity port xin does not match with type std_logic_vector of component port
Entity port yout does not match with type std_logic_vector of component port

поэтому я снова изменил свой сумматор на

add1 <= resize(x0,9) + x15;

синтаксис хороший, но та же ошибка в тестовом стенде..

Ошибка связана с моим типом ISE или типом библиотеки? Спасибо!


person qian huang    schedule 07.02.2015    source источник


Ответы (2)


Ваше выражение сложения в adder1 недопустимо, потому что вы пытаетесь проиндексировать элемент "8", когда диапазон a1 и a2 составляет от 7 до 0.

Предполагая, что вы пытаетесь подписать расширение, это будет выглядеть примерно так:

q <=(a1(7)&a1 + a2(7)&a2);

Оператор «+» имеет более высокий приоритет, чем «&», поэтому вы пытаетесь добавить a1 + a2(7), который равен signed + std_logic. Это не имеет перегрузки, определенной в numeric_std, кроме того, что это логически неправильно.

Это работает:

q <=(a1(7)&a1) + (a2(7)&a2);

Но это не канонический способ реализации расширения знака при использовании numeric_std. Вам нужно только, чтобы левый член имел тот же размер, что и q. Знаковый оператор "+" позаботится о том, чтобы знак расширял свою правую сторону автоматически.

q <= resize(a1, q'length) + a2; -- Sign extend a1 and add

Это дает более чистый код, который говорит, что он делает, не полагаясь на нестандартный std_logic_arith.

Фактическая ошибка о несоответствии типов на xin не очевидна из вашего кода. Возможно, у вас есть более старая версия signedinput, скомпилированная с портом другого типа, и вы не обновили библиотеку.

person Kevin Thibedeau    schedule 07.02.2015
comment
Я не использую сумматор в качестве компонентов и изменил свой сумматор на add1 ‹= (x0(7)&x0) + (x15(8)&x15); оно работает. поэтому бесполезно ieee. std_logic_arith.all; в моем коде, но тестовый стенд все еще имеет ту же ошибку.. спасибо за вашу помощь - person qian huang; 07.02.2015

Кевин сделал это сложным, поэтому я решил показать что-то, что дает хорошее объяснение:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity adder1 is
    port ( 
        a1:         in   signed (7 downto 0);
        a2:         in   signed (7 downto 0);
        clk:        in   std_logic;
        enable1:    in   std_logic;
        q:          out  signed (8 downto 0)
    );
end entity;


architecture behavioral of adder1 is

begin
UNLABELLED:
    process(clk)
    begin 
        if clk'event and clk ='1' then 
            if enable1 = '1' then
                q <= a1(7) & a1 + a2 ;
            end if;
        end if;
        end process;
end architecture;

Присвоение q выглядит голым, поэтому его стоит пояснить. Знак «+» в numeric_std для знака расширяет более короткий операнд, чтобы он соответствовал длине более длинного операнда.

Остальное — приоритетная магия.

"+" и "&" имеют одинаковый приоритет, что означает, что они оцениваются слева направо в текстовом порядке, то есть сначала выполняется расширение знака с оператором конкатенации (см. IEEE Std 1076-2008). , 9.2 Операторы).

Оператор "+" считает левый операнд более длинным и сопоставляет правый операнд с его длиной (см. пакет numeric_std "+" для L,R: со знаком). Он делает это, используя подписанный RESIZE для обоих операндов после нахождения MAX длины обоих операндов, наряду с преобразованием метазначений в 'X'.

Это работает, если правый операнд тоже длиннее:

        q <= a1 + (a2(7) & a2) ;

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

Нет причин снова вызывать изменение размера, это всего лишь однобитовое расширение знака путем конкатенации, основанное на знании того, что знак воплощен в левом элементе (бите) числа дополнения до двух.

Термин «канонический» не встречается в стандарте VHDL.

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

Каждое объявление, используемое в проекте, уникально. Если сказать, что фактический в карте портов зависит от подписанного объявления типа в пакете std_logic_arith, а формальный должен зависеть от объявления подписанного в пакете numeric_std, они будут разных типов.

person Community    schedule 07.02.2015
comment
Я меняю библиотеку на ieee.numeric_std.all и не использую компонент для сумматора, тогда синтаксис успешен. Поэтому библиотеки ieee.ats_logic_arith.all нет; но в моем тестовом стенде ошибка Entity port xin не соответствует типу, подписанному портом компонента, все еще появляется. проблема в типе библиотеки? - person qian huang; 07.02.2015
comment
какой пакет вы используете на своем тестовом стенде? Оно хочет быть таким же. - person ; 07.02.2015