Mots-clés : MOS, CMOS, interrupteur bidirectionnel, PAD

La modélisation au niveau des interrupteurs est une conception à un niveau d'abstraction inférieur à la modélisation au niveau des portes. Dans de rares cas, les concepteurs peuvent choisir d'utiliser des transistors comme modules sous-jacents d'une conception. Avec l'augmentation de la complexité de conception des circuits et l'apparition d'outils avancés, la conception numérique à base d'interrupteurs a progressivement décliné. Actuellement, Verilog ne fournit qu'une capacité de conception numérique utilisant les valeurs logiques 0, 1, x, z avec les forces de pilotage associées. Par conséquent, les transistors en Verilog sont également traités uniquement comme des interrupteurs ouverts ou fermés.


Interrupteur MOS

Il existe 2 types d'interrupteurs MOS, déclarés à l'aide des mots-clés suivants :

nmos(N 类型 MOS 管)   pmos(P 类型 MOS 管)  
rnmos (带有高阻抗的 NMOS 管) rpmos(带有高阻抗的 PMOS 管)

Les transistors MOS sont utilisés pour modéliser la logique de commutation. Les données circulent de l'entrée vers la sortie, et le flux de données peut être activé ou désactivé par des réglages appropriés.

Pour les transistors MOS avec impédance, l'impédance entre la source et le drain est élevée, et la force du signal est réduite lors du passage des signaux.

Le schéma de structure de l'interrupteur à transistor MOS est présenté ci-dessous.

Lors de l'instanciation, le premier port du transistor MOS est la sortie, le deuxième port est l'entrée de données, et le troisième port est l'entrée de commande.

Exemple

   //tri
   pmos pmos1           (OUTX, IN1, CTRL1) ;
   //pas de nom d'instance
   nmos                 (OUTX1, IN1, CTRL2) ;

La table de vérité du transistor MOS est présentée ci-dessous, très similaire à une porte à trois états.

nmosBorne de commande    pmosBorne de commande   
 01xz  01xz
0z00/z0/z 00z0/z0/z
1z11/z1/z 11z1/z1/z
xzxxx xxzxx
zzxxx zxzxx

Commutateur CMOS

Les commutateurs CMOS sont déclarés avec les mots-clés cmos et rcmos (avec haute impédance).

Le CMOS possède une sortie de données, une entrée de données et deux entrées de commande. Le schéma de structure est le suivant :

Les signaux PControl et NControl sont généralement complémentaires. Lorsque NControl vaut 1 et PControl vaut 0, le commutateur devient passant. Lorsque NControl vaut 0 et PControl vaut 1, la sortie du commutateur est en haute impédance. Un commutateur CMOS peut être considéré comme une combinaison de commutateurs NMOS et PMOS.

Lors de l'instanciation, le premier port du transistor CMOS est la sortie, le deuxième est l'entrée de données, le troisième est l'entrée de commande NControl, et le quatrième est l'entrée de commande PControl.

Le format d'instanciation du commutateur CMOS est le suivant.

Exemple

   //coms
   cmos c1              (OUTY, IN1, NCTRL, PCTRL) ;
   //pas de nom d'instance
   cmos                 (OUTY1, IN1, NCTRL, PCTRL) ;

Comme le CMOS peut être considéré comme une combinaison de commutateurs NMOS et PMOS, ces deux commutateurs MOS peuvent également être utilisés pour construire un commutateur CMOS, comme suit :

Exemple

   //la même instanciation à 2 voies de cmos
   nmos n2              (OUTY, IN1, NCTRL) ;
   pmos p2              (OUTY, IN1, PCTRL) ;

La table de vérité du CMOS est similaire à celle des commutateurs MOS. Notez la complémentarité des signaux NControl et PControl.


Commutateur bidirectionnel

Les portes de commutation NMOS, PMOS et CMOS conduisent toutes du drain vers la source, avec un sens unidirectionnel. Verilog fournit également des dispositifs de commutation à conduction bidirectionnelle, où les données peuvent circuler dans les deux sens, et les signaux des deux côtés peuvent être des signaux pilotes.

Les mots-clés pour les commutateurs bidirectionnels et leurs modes d'impédance sont déclarés comme suit :

tran  tranif1  tranif0   rtran  rtranif1  rtranif0

Le schéma de structure du commutateur bidirectionnel est le suivant :

Le commutateur tran est un tampon direct entre deux signaux ; inout1 ou inout2 peut être le signal pilote.

Le commutateur tranif1 conduit entre les deux signaux uniquement lorsque le signal de commande vaut 1. Lorsque la commande vaut 0, les deux signaux sont déconnectés ; les signaux avec un pilote conservent la valeur du signal cohérente avec le pilote, tandis que les signaux sans pilote présentent un état de haute impédance.

Il en va de même pour tranif0.

Par conséquent, les commutateurs bidirectionnels sont souvent utilisés pour l'isolation entre bus ou signaux.

Lors de l'instanciation, les deux premiers ports du commutateur bidirectionnel

sont des bornes de données, et le troisième port est l'entrée de commande.

Un exemple d'instanciation d'un commutateur bidirectionnel est le suivant :

Exemple

   tranif0 tr0              (inout1, inout2, control) ;
   //pas de nom d'instance
   tranif1                  (inout1, inout2, control) ;

Alimentation et masse

Les circuits au niveau transistor nécessitent une source (Vdd, logique 1) et une masse (Vss, logique 0), définies à l'aide des mots-clés supply1 et supply0, respectivement. L'utilisation est la suivante :

Exemple

   supply1              VDD ;
   supply0              GND ;
   wire                 siga = VDD ; //siga est connecté à la logique 1
   wire                 sigb = GND ; //le signal est connecté à la logique 0

Simulation du modèle PAD

Dans la section « 5.1 Verilog Modules and Ports » du « Verilog Tutorial », l'écriture et la simulation des modèles PAD ont été abordées. Ci-dessous, une porte trois états est utilisée pour remodeler le modèle PAD, avec des fonctions de pull-up et pull-down fixes, et des commutateurs bidirectionnels sont utilisés pour tester la connectivité du PAD.

Un modèle PAD avec fonction pull-up écrit à l'aide d'une porte trois états est le suivant. Pour obtenir le modèle PAD avec fonction pull-down, il suffit d'échanger les commentaires.

Exemple

module PADUP(
   //DIN, pilote de pad lorsque le pad est configuré en sortie
   //OEN, direction du pad (1-entrée, o-sortie)
   input        DIN, OEN ,
   inout        PAD ,
   //charge du pad lorsque le pad est configuré en entrée
   output       DOUT
  );
   //entrée : (n'a pas d'effet sur la logique d'entrée externe du pad), sortie : DIN->PAD
   bufif0 (PAD, DIN, OEN) ;     //sortie 0
   bufif1 (DOUT, PAD, OEN) ;    //entrée 1
   pullup (PAD);
   //pulldown (PAD); //pulldown
endmodule

Un banc de test utilisant des commutateurs bidirectionnels pour contrôler la connectivité d'E/S du PAD est écrit comme suit.

Le déroulement du test est le suivant : PAD0/1 sont interconnectés ; puis PAD0 agit comme sortie et PAD1 comme entrée ; piloter PAD0 et lire la valeur de PAD1. Ensuite, les directions des deux sont inversées ; piloter PAD1 et lire la valeur de PAD0.

Le processus de test pour PAD2/3 est exactement le même.

Exemple

`timescale 1ns/1ns
module test ;
   paramètre    PULL_UP         = 1 ;
   paramètre    PULL_DOWN       = 0 ;
   paramètre    IO0_OUT         = 0 ;
   paramètre    IO1_OUT         = 1 ;
   paramètre    IO2_OUT         = 2 ;
   paramètre    IO3_OUT         = 3 ;
   paramètre    IO0_IN          = 0 ;
   paramètre    IO1_IN          = 1 ;
   paramètre    IO2_IN          = 2 ;
   paramètre    IO3_IN          = 3 ;
   reg [3:0]    DIN, OEN ;
   wire [3:0]   DOUT ;
   wire [3:0]   PAD ;
   //test de contrôle de connexion, en utilisant tranif1
   reg [1:0]    con_ena ;
   tranif1 (PAD[0], PAD[1], con_ena[0]);
   tranif1 (PAD[2], PAD[3], con_ena[1]);
   reg err = 0;
   task test_io_conn;
      //test de pull
      input             pull_type ;
      //test de connexion
      input [1:0]       xout ;     //position de sortie
      input [1:0]       yin ;     //position de sortie
      DIN[xout]         = ~pull_type ;
      # 20 ;
      if (DOUT[yin] != ~pull_type) begin
         $display("valeur écrite et valeur lue : %h, %h", ~pull_type, DOUT[yin]);
         err        |= 1 ;
      end
      DIN[xout]         = pull_type;
      # 20 ;
      if (DOUT[yin] != pull_type) begin
         $display("la valeur écrite et la valeur lue est : %h, %h", pull_type, DOUT[yin]);
         err        |= 1 ;
      end
   endtask
   initial begin
      con_ena   = 2'b01 ;
      OEN       = 4'b1111 ;
      #13 ;
      //test entre io0/io1
      OEN[0]    = 0 ;
      OEN[1]    = 1 ; //gpio0 -> gpio1
      test_io_conn(PULL_UP, IO0_OUT, IO1_IN);
      OEN[1]    = 0 ;
      OEN[0]    = 1 ; //gpio0 -> gpio1
      test_io_conn(PULL_UP, IO1_OUT, IO0_IN);
      OEN       = 4'b1111 ;
      con_ena   = 2'b10 ;
      OEN[2]    = 1'b0 ;
      OEN[3]    = 1'b1 ;
      test_io_conn(PULL_DOWN, IO2_OUT, IO3_IN);
      OEN[3]    = 1'b0 ;
      OEN[2]    = 1'b1 ;
      test_io_conn(PULL_DOWN, IO3_OUT, IO2_IN);
   end
   PADUP        u_pad_up0( DIN[0], OEN[0], PAD[0], DOUT[0]) ;
   PADUP        u_pad_up1( DIN[1], OEN[1], PAD[1], DOUT[1]) ;
   PADDOWN u_pad_down3( DIN[2], OEN[2], PAD[2], DOUT[2]) ;
   PADDOWN u_pad_down4( DIN[3], OEN[3], PAD[3], DOUT[3]) ;
   initial begin
      forever begin
         #100;
         //$display("---gyc---%d", $time);
         if ($time >= 1000) begin
            $finish ;
         end
      end
   end
endmodule // test

Les résultats de la simulation sont les suivants.

On peut voir sur la figure que dans les 13 ns, lorsque les 4 PAD sont des entrées, les valeurs des PAD correspondent à la fonction de tirage. C'est-à-dire que PAD0-1 ont tous deux une fonctionnalité de pull-up, et PAD2-3 ont tous deux une fonctionnalité de pull-down.

De 13 à 53 ns, PAD0 agit comme sortie et PAD1 comme entrée, et ils sont connectés ; les valeurs logiques des deux changent de manière cohérente. De même, de 53 ns à 93 ns, PAD1 agit comme sortie et PAD0 comme entrée ; dans l'état connecté, les valeurs logiques des deux sont également cohérentes. Cela indique que les fonctions d'entrée et de sortie de PAD0/1 sont toutes deux normales.

Les résultats pour PAD2/3 sont similaires et ne seront pas expliqués plus en détail ici.

Téléchargement du code source pour ce chapitre

Téléchargement