2012-04-01 3 views
4

Pour une classe, il m'a été demandé d'écrire une procédure VHDL qui prend deux entrées entières A et B et remplace A par A + B et B par A-B. J'ai écrit le programme suivant et testbench. Il termine l'implémentation et la vérification de la syntaxe comportementale mais ne simule pas. Bien que je n'obtiens aucune erreur, j'obtiens quelques avertissements indiquant que A et B sont dans des boucles de rétroaction combinatoires. Quelqu'un peut-il faire la lumière sur ce que le problème peut être?Procédures VHDL

Module:

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; 
+0

Cela n'a pas eu de sens ... – ferdepe

Répondre

6

Le problème est:

  1. Votre composant écrit à ses propres entrées. C'est l'équivalent d'une boucle infinie. La raison pour laquelle vous l'avez fait est que ...
  2. La description du problème n'a pas de sens.

on m'a demandé d'écrire une procédure de VHDL qui prend deux entrées entières A et B ...

fin

... et remplace A avec ...

Quoi ?!

Vous ne pouvez pas remplacerA (ou B) car vous aurez ce problème. Vous pouvez écrire une procédure qui prend deux entrées entières et donne deux sorties entières. Ces sorties pourraient alors alimenter certains registres qui alimentent alors l'entrée, mais il doit y avoir un registre pour rompre la boucle de retour combinatoire.

1

Ne pas le tester à l'intérieur de l'entité problem2. Appelez simplement la procédure directement à partir de votre banc d'essai.

(Ce code n'est pas testé!)

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