2 допълващо въвеждане и използване на vhdl библиотека за подписано въвеждане

Моите входни данни са комплимент 2 и проектирах, че входът е подписано число и цялата операция се използва подписано число, библиотеката, която използвах ieee.numeric_std.all, но когато направя „+“, възникна грешка „намерих „0“ дефиниции на оператора "+", не може да определи точната дефиниция на претоварено съвпадение за "+"". Така че промених друга в друга библиотека ieee.std_logic_arith.all и направих операцията за добавяне като компонент, работи. когато симулирах моя код с помощта на testbench, възникна грешка: портът на обекта 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;

синтаксисът е добър, но същата грешка в testbench..

Грешка ли е относно моя 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; в моя код, но testbench все още има същата грешка.. благодаря ви за помощта - 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 за signed ще разшири знака на по-късия операнд, за да съответства на дължината на по-дългия операнд.

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

„+“ и „&“ са с един и същ приоритет, което означава, че се оценяват в текстов ред отляво надясно, което означава, че разширението на знака с оператора за конкатенация се извършва първо (вижте IEEE Std 1076-2008 , 9.2 Оператори).

Операторът "+" вижда левия операнд като по-дълъг и съпоставя десния операнд с неговата дължина (вижте пакет numeric_std "+" за L,R: със знак). Той прави това чрез използване на знак RESIZE и на двата операнда след намиране на МАКСИМАЛНАТА дължина на двата, заедно с преобразуване на метастойности в „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