![]() |
![]() |
module TestComp1; reg a,b; wire M,m,igual; Comp1 c(M,igual,m,a,b); // Bloque de comportamiento initial begin $monitor($time," a=%b, b=%b, mayor=%b, igual=%b, menor=%b", a,b,M,igual,m); a=0; b=0; #5 a=0; b=1; #5 a=1; b=0; #5 a=1; b=1; end endmodule |
// MOdulo comparador de un bit module Comp1(output wire mayor, output wire igual, output wire menor, input wire a, input wire b); wire wArriba, wAbajo; not nArriba(wArriba,a); not nAbajo(wAbajo,b); and aArriba(mayor,a,wAbajo); and aAbajo(menor,b,wArriba); nor n(igual,mayor,menor); endmodule |
El módulo raíz no tiene nombre y es instanciado por
Verilog automáticamente. Para hacer referencia a un objeto
directamente perteneciente al módulo raíz desde sí
mismo, simplemente se pone el nombre del objeto como ya hemos visto.
¿Pero qué hacer si queremos acceder desde el
módulo raíz a la puerta aAbajo
del
módulo c
? La respuesta es que se usa un
punto (.) para descender por la jerarquía de objetos.
Por consiguiente, para acceder a dicha puerta, se pondría
c.aAbajo
. El esquema se generaliza cuando hay más
niveles.
bufif1 bIzquierda(Y,A,G); bufif0 bDerecha(Y,A,G);También existen las equivalentes puertas NOT con control de triestado por alto y por bajo que son, respectivamente,
notif1
y notif0
.
wire
, sino como tri
.
tri
,
se resuelve del modo siguiente:
x
frente a las de alta impedancia (z
)x
.tri0
: igual que tri
, pero si todos
son z
, el valor es 0
(resistencia pull-down)tri1
: ídem valor 1 (resistencia
pull-up)wand
o triand
: basta un 0 para que
el resultado sea 0wor
o trior
: basta un 1 para que
el resultado sea 1assign
:
wire w; reg r; assign w=r;
Programemos el módulo:
module Transceiver(inout tri a, inout tri b, input wire g, input wire dir); wire ng,ndir,sa1,sa2; not (ng,g); // No hacemos referencia despuEs => no damos nombres not (ndir,dir); and (sa1,ng,dir); and (sa2,ng,ndir); bufif1 (b,a,sa1); bufif1 (a,b,sa2); endmoduleSe ha cambiado la señal G para que sea activa a nivel alto. Los nombres usados han sido:
module TestTransceiver; tri a,b; reg g,dir; reg ra,rb; Transceiver t(a,b,g,dir); assign a=ra; assign b=rb; // Bloque de comportamiento initial begin $monitor($time," g=%b, dir=%b, a=%b, b=%b, ra=%b, rb=%b", g,dir,a,b,ra,rb); ra=0; rb=1; g=1; dir=0; #5 ra='bz; rb='bz; g=1; dir=0; #5 rb=1; g=0; dir=0; #5 ra='bz; rb='bz; g=1; dir=1; #5 ra=0; g=0; dir=1; #5 ra=0; rb=1; g=0; dir=1; end endmoduleObservad el uso de las variables
tri
y la orden
assign
. Antes de ejecutar la simulación,
tratad de adivinar cuáles son los valores que aparecerán
en la pantalla. ¿Qué cambios habría que hacer
para que la línea G del módulo sea activa por nivel bajo
tal y como aparecía en el diseño original?
Pista: si no sois capaces de construir el multiplexor 4x1, podéis fijaros en esta solución. Hay alternativas similares a la solución de la figura que usan un decodificador o búferes triestado, por ejemplo.
a | b | c | d | h |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
ls
cd
rm
man
cat