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
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.
| nmos | Borne de commande | pmos | Borne de commande | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | x | z | 0 | 1 | x | z | |||
| 0 | z | 0 | 0/z | 0/z | 0 | 0 | z | 0/z | 0/z | |
| 1 | z | 1 | 1/z | 1/z | 1 | 1 | z | 1/z | 1/z | |
| x | z | x | x | x | x | x | z | x | x | |
| z | z | x | x | x | z | x | z | x | x |
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
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
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
//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
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
//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
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