Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> VHDL

Comment utiliser l'instanciation de Port Map dans VHDL

Un module est une unité autonome de code VHDL. Les modules communiquent avec le monde extérieur via l'entité . Carte des ports est la partie de l'instanciation du module où vous déclarez à quels signaux locaux les entrées et les sorties du module doivent être connectées.

Dans les didacticiels précédents de cette série, nous avons écrit tout notre code dans le fichier VHDL principal, mais normalement nous ne le ferions pas. Nous créons une logique dans le but de l'utiliser dans une conception FPGA ou ASIC, pas pour le simulateur.

Un module VHDL créé pour s'exécuter dans un simulateur n'a généralement pas de signaux d'entrée ou de sortie. Il est entièrement autonome. C'est pourquoi l'entité de nos conceptions est vide. Il n'y a rien eu entre le entity balise et le end entity; balise.

Cet article de blog fait partie de la série de didacticiels VHDL de base.

Un module sans aucun signal d'entrée ou de sortie ne peut pas être utilisé dans une conception réelle. Son seul but est de nous permettre d'exécuter du code VHDL dans un simulateur. C'est pourquoi on l'appelle un testbench . Pour simuler un module avec des signaux d'entrée et de sortie, nous devons instancier dans un banc d'essai.

Les modules et bancs de test viennent souvent par paires et sont stockés dans des fichiers différents. Un schéma de nommage courant consiste à appeler le testbench le nom du module avec "Tb" ajouté, et à nommer l'architecture "sim". Si le module s'appelle "MyModule", le testbench s'appellera "MyModuleTb". Par conséquent, les noms de fichiers deviennent "MyModuleTb.vhd" et "MyModule.vhd".

Avec l'aide du code de testbench, nous pouvons vérifier que le module fonctionne correctement dans un environnement de simulation. Le module testé est généralement appelé dispositif testé (DUT).

Les modules peuvent également être instanciés dans d'autres modules. Le partitionnement du code en modules lui permet d'être instancié plusieurs fois. Vous pouvez créer plusieurs instances d'un module dans la même conception, et il peut être réutilisé dans de nombreuses conceptions.

La syntaxe d'une entité avec un port en VHDL est :
entity <entity_name> is
port(
    <entity_signal_name> : in|out|inout <signal_type>;
    ...
);
end entity;

La syntaxe pour instancier un tel module dans un autre fichier VHDL est :
<label> : entity <library_name>.<entity_name>(<architecture_name>) port map(
    <entity_signal_name> => <local_signal_name>,
    ...
);

Le <label> peut être n'importe quel nom, et il apparaîtra dans la fenêtre de hiérarchie de ModelSim. Le <library_name> pour un module est défini dans le simulateur, pas dans le code VHDL. Par défaut, chaque module est compilé dans le work bibliothèque. Le <entity_name> et <architecture_name> doit correspondre au module dont nous créons une instance. Enfin, chacun des signaux d'entité doit être mappé à un nom de signal local.

Il existe d'autres façons d'instancier un module en VHDL, mais c'est la syntaxe de base pour l'instanciation explicite.

Exercice

Dans ce tutoriel vidéo, nous allons apprendre à créer et instancier un module en VHDL :

Le code final pour le MUX testbench :

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

entity T15_PortMapTb is
end entity;

architecture sim of T15_PortMapTb is

    signal Sig1 : unsigned(7 downto 0) := x"AA";
    signal Sig2 : unsigned(7 downto 0) := x"BB";
    signal Sig3 : unsigned(7 downto 0) := x"CC";
    signal Sig4 : unsigned(7 downto 0) := x"DD";

    signal Sel : unsigned(1 downto 0) := (others => '0');

    signal Output : unsigned(7 downto 0);

begin

    -- An instance of T15_Mux with architecture rtl
    i_Mux1 : entity work.T15_Mux(rtl) port map(
        Sel    => Sel,
        Sig1   => Sig1,
        Sig2   => Sig2,
        Sig3   => Sig3,
        Sig4   => Sig4,
        Output => Output);

    -- Testbench process
    process is
    begin
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= Sel + 1;
        wait for 10 ns;
        Sel <= "UU";
        wait;
    end process;

end architecture;

Le code final pour le module MUX :

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

entity T15_Mux is
port(
    -- Inputs
    Sig1 : in unsigned(7 downto 0);
    Sig2 : in unsigned(7 downto 0);
    Sig3 : in unsigned(7 downto 0);
    Sig4 : in unsigned(7 downto 0);

    Sel  : in unsigned(1 downto 0);

    -- Outputs
    Output : out unsigned(7 downto 0));
end entity;

architecture rtl of T15_Mux is
begin

    process(Sel, Sig1, Sig2, Sig3, Sig4) is
    begin

        case Sel is
            when "00" =>
                Output <= Sig1;
            when "01" =>
                Output <= Sig2;
            when "10" =>
                Output <= Sig3;
            when "11" =>
                Output <= Sig4;
            when others => -- 'U', 'X', '-', etc.
                Output <= (others => 'X');
        end case;

    end process;

end architecture;

La fenêtre de forme d'onde dans ModelSim après avoir appuyé sur run et zoomé sur la timeline :

Analyse

Comme nous pouvons le voir sur la forme d'onde, le module multiplexeur (MUX) fonctionne comme prévu. La forme d'onde est identique à celle du tutoriel précédent que nous avons créé sans utiliser de modules.

Il y a maintenant une séparation claire entre le module de conception et le banc d'essai. Le module contenant le MUX est ce que nous avons l'intention d'utiliser dans une conception, et le seul but du testbench est de nous permettre de l'exécuter dans un simulateur. Il y a un processus dans le testbench qui utilise wait déclarations pour créer des retards artificiels dans la simulation. Le module de conception n'a aucune notion de temps, il réagit uniquement aux stimuli externes.

Nous avons nommé l'architecture du banc de test sim , pour simuler. L'architecture du module de conception a été nommée rtl , qui signifie niveau de transfert de registre. Ce ne sont que des conventions de nommage. Lorsque vous voyez un fichier avec un tel nom, vous savez immédiatement s'il s'agit d'un testbench ou d'un module de conception. Différentes entreprises peuvent avoir des conventions de dénomination différentes.

À emporter

Aller au tutoriel suivant »


VHDL

  1. Comment utilisons-nous le molybdène?
  2. Comment créer une liste de chaînes en VHDL
  3. Comment créer un banc d'essai piloté par Tcl pour un module de verrouillage de code VHDL
  4. Comment arrêter la simulation dans un testbench VHDL
  5. Comment créer un contrôleur PWM en VHDL
  6. Comment générer des nombres aléatoires en VHDL
  7. Comment utiliser une procédure dans un processus en VHDL
  8. Comment utiliser une fonction en VHDL
  9. Comment utiliser une meuleuse de coupe