En ocasiones interesa trabajar justo en el sentido opuesto: bajar de nivel y describir el módulo en función de elementos más sencillos que las puertas. Verilog dispone de los siguientes:
nmos
y pmos
.
En un funcionamiento
estándar, G y nG deben ser complementarias y permiten pasar
el valor de A cuando G=1 y nG=0Los nombres de los elementos pueden llevar a engaño. Se debe tener muy en cuenta que Verilog no es un simulador electrónico y las descipciones de los elementos anteriores son meramente funcionales y físicamente inexactas. Más que transistores NMOS o PMOS, podríamos decir que son como conmutadores con las funciones descritas.
nmos
y pmos
las siguientes puertas
NOT, NAND y NOR de tecnología CMOS.
Verificar su correcto funcionamiento.
Tratad de crear el módulo correspondiente en Verilog:
module CeldaSram(inout tri bl, inout tri nbl, input wire sel);Enseguida veréis que no funciona. Al no poder modelar Verilog la mayor resistencia de N2 y N3, cuando confluye un 1 y un 0 en A o B el resultado es X, cuando se debería imponer el 0. Para tratar de solucionar esto, Verilog pone a disposición del programador versiones resistivas de los elementos arriba presentados:
rnmos
,
rpmos
, rcmos
, rtran
,
rtranif1
y rtranif0
.
De nuevo, se trata de una aproximación. No se tiene en cuenta el comportamiento físico exacto. Lo que hacen estos elementos es únicamente debilitar la señal que circula por ellos.
Sustituid, pues, N2 y N3 por dos rnmos
es.
De este modo, casi lograréis que os funcione la celda.
Aún queda por solucionar el problema de la escritura.
El problema es similar al anterior. Se trata de forzar al biestable a que pase a un estado. Pero esto solamente es posible si la fuerza de la señal que introducimos es superior a la fuerza de las señales activas en el biestable, lo que no es el caso. Va siendo hora de que veamos las posibilidades de fuerza que tienen las señales en Verilog, de mayor a menor:
supply1 | supply0 |
strong1 | strong0 |
pull1 | pull0 |
weak1 | weak0 |
highz1 | highz0 |
Cuando confluyen dos señales en un tri
, gana el
valor de la señal más fuerte. En caso de que haya
discrepancia entre las señales más fuertes, el
resultado es X. Por ejemplo, si coinciden como señales
más fuertes una pull0
con una
pull1
, el resultado es pullx
.
Las puertas suministran, por defecto, señales de fuerza
strong
, aunque se puede especificar la fuerza,
como en este ejemplo:
buf (strong1,weak0) (salida,entrada);
También, la instrucción assign
admite
especificar la fuerza con la que se asigna la señal:
assign (supply1,supply0) cable=seNal;
Los elementos vistos en esta sesión (nmos
,
pmos
, etc.) no admiten especificar
una señal, simplemente si transmiten una señal, la
transmiten tal cual o la atenúan, dependiendo de si son
resistivos o no.
Por todo lo visto, si queremos que nuestro biestable cambie
de estado en una escritura, necesitamos excitarlo con una
señal de fuerza supply
. Para ello,
Verilog dispone de dos tipos de variable:
supply1
y supply0
.
Podemos declarar variables de ese tipo que tendrán
siempre la máxima fuerza:
supply1 vdd; supply0 tierra;
También podemos atar una línea a tierra o
a 1 como si se tratara de una resistencia. La órdenes
de Verilog son pulldown
y pullup
.
Lo que hacen estas órdenes es verter señales
de fuerza pull
. Por ejemplo, para conectar
con tierra la línea a
(pulldown), la orden es:
pulldown(a);
Completad con estos datos, pues, la CeldaSram
, de modo que
que se puedan hacer lecturas y escrituras.
Realizad varios ciclos de escritura y lectura para verificar su funcionamiento.
ls
cd
rm
man
cat