Процедуры VHDL - PullRequest
       29

Процедуры VHDL

4 голосов
/ 02 апреля 2012

Для класса меня попросили написать процедуру VHDL, которая принимает два целочисленных входа A и B и заменяет A на A + B, а B на AB.Я написал следующую программу и тестовый стенд.Он завершает реализацию и проверку поведенческого синтаксиса, но не будет имитировать.Хотя я не получаю ошибок, я получаю некоторые предупреждения о том, что A и B находятся в комбинационных циклах обратной связи.Может кто-нибудь пролить свет на проблему?

Модуль:

 library IEEE;
 use IEEE.STD_LOGIC_1164.ALL;

 entity Problem2 is
Port ( A : inout  integer;
       B : inout  integer);
 end Problem2;

 architecture Behavioral of Problem2 is

procedure AB (signal A,B: inout integer) is 
begin
A<=A+B after 20 ns;
B<=A-B after 30 ns;
end AB;

begin

AB(A=>A, B=>B);

end Behavioral;

TestBench:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY Problem2_test IS
END Problem2_test;

ARCHITECTURE behavior OF Problem2_test IS 

    -- Component Declaration for the Unit Under Test (UUT)

    COMPONENT Problem2
    PORT(
     A : INOUT  integer;
     B : INOUT  integer
    );
END COMPONENT;


--BiDirs
   signal A : integer;
   signal B : integer;
  -- No clocks detected in port list. Replace <clock> below with 
-- appropriate port name 

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: Problem2 PORT MAP (
          A => A,
          B => B
        );

 ABproc: process is
begin
    A<=25;
    B<=22;
    wait;
end process;

END;

Ответы [ 2 ]

6 голосов
/ 02 апреля 2012

Проблема:

  1. Ваш компонент записывает на свои собственные входы. Это эквивалент бесконечного цикла. Причина, по которой вы это сделали, заключается в том, что ....
  2. Описание проблемы не имеет смысла.

Меня попросили написать процедуру VHDL, которая принимает два целочисленных входа A и B ...

Fine

... и заменяет A на ...

Что?!

Вы не можете заменить A (или B), потому что вы получите эту проблему. Вы можете написать процедуру, которая принимает два целочисленных ввода и два целочисленных вывода Эти выходы могут затем подавать некоторые регистры, которые затем подают на вход, но там должен быть регистр, чтобы разорвать цепь комбинаторной обратной связи.

1 голос
/ 02 апреля 2012

Не тестируйте его внутри объекта problem2. Просто вызовите процедуру прямо со своего испытательного стенда.

(Этот код не проверен!)

ABproc: process is
begin
    A<=25;
    B<=22;
    AB(A, B);
    wait 1 ns;
    assert A = 47;
    assert B = 3;
    wait; -- forever
end process;
...