Example: Static Noise Margin
%%% SNM.m %%%% Static Noise Margins %%%% by Tsung-Chu Huang, 2010/04/06 FilePrefix = 'SNM'; gate1 = 'CMOS Inv'; gate2 = 'nMOS Inv'; Sweep = 1.8; %%%%%%%%%%%%%%%%%%% clc; fprintf('*** Static Noise Margins ***\r\n'); sig = loadsig([FilePrefix, '.sw0']); clf; subplot(2,1,1); title('TF Curves of Gate 1 & 2'); xlabel('DC Sweep (V)'); ylabel('Volts'); box on; hold on; TF1 = evalsig(sig, 'tf1'); TF2 = evalsig(sig, 'tf2'); X = zeros(length(TF1),1); for i=1:length(TF1) X(i) = (i-1)*Sweep/(length(TF1)-1); end plot(X, TF1,'b-'); plot(X, TF2, 'r-'); legend(gate1, gate2, 0); %%%%%%%%%%%%%%%%%%%% for i = 1: length(TF1) slope = (TF1(i+1)-TF1(i))*(length(TF1)-1)/Sweep; if(slope < -1) break; end end
|
plot([X(i-10), X(i+10)], [TF1(i)+X(i)-X(i-10), TF1(i)+X(i)-X(i+10)], 'b-');
TF1C1 = i;
VOH = TF1(TF1C1);
plot([X(i), X(i)], [0, VOH], 'c--');
text(X(i),VOH,'VOH');
for i = TF1C1: length(TF1)
slope = (TF1(i+1)-TF1(i))*(length(TF1)-1)/Sweep;
if(slope > -1) break;
end
end
TF1C2 = i;
VOL = TF1(TF1C2);
plot([X(i-10), X(i+10)], [TF1(i)+X(i)-X(i-10), TF1(i)+X(i)-X(i+10)], 'b-');
plot([X(i), X(i)], [0, VOL], 'c--');
text(X(i),VOL,'VOL');
for i = 1: length(TF2)
slope = (TF2(i+1)-TF2(i))*(length(TF2)-1)/Sweep;
if(slope < -1) break;
end
end
plot([X(i-10), X(i+10)], [TF2(i)+X(i)-X(i-10), TF2(i)+X(i)-X(i+10)], 'r-');
TF2C1 = i;
VIL = X(TF2C1);
plot([0, X(i)], [TF2(i), TF2(i)], 'm--');
text(VIL, TF2(i), 'VIL');
for i = TF2C1: length(TF2)
slope = (TF2(i+1)-TF2(i))*(length(TF2)-1)/Sweep;
if(slope > -1) break;
end
end
TF2C2 = i;
VIH = X(TF2C2);
plot([X(i-10), X(i+10)], [TF2(i)+X(i)-X(i-10), TF2(i)+X(i)-X(i+10)], 'r-');
plot([0, X(i)], [TF2(i), TF2(i)], 'm--');
text(VIH, TF2(i), 'VIH');
%%%%%%%%%%%%%%%%%%
subplot(2,1,2);
title('Butterfly Diagram from Gate 1 to 2');
xlabel('Output of Gate 1 as Input of Gate 2 (V)');
ylabel('Output of Gate 2 (V)');
box on;
hold on;
plot(TF1, X, 'b-');
plot(X, TF2,'r-');
legend(gate1, gate2, 0);
NMH=VOH-VIH;
NML=VIL-VOL;
plot([VIL, VIL],[TF2(TF2C1), X(TF1C2)],'g--');
plot([VOL, VOL],[TF2(TF2C1), X(TF1C2)],'g--');
plot([VIL, VOL],[TF2(TF2C1), TF2(TF2C1)],'k-');
plot([VIL, VOL],[X(TF1C2), X(TF1C2)],'k-');
set(gcf,'DefaultTextColor','black');
text(VOL, X(TF1C2), ['NML=', num2str(NML,3)]);
plot([VIH, VIH],[TF2(TF2C2), X(TF1C1)],'g--');
plot([VOH, VOH],[TF2(TF2C2), X(TF1C1)],'g--');
plot([VIH, VOH],[TF2(TF2C2), TF2(TF2C2)],'k-');
plot([VIH, VOH],[X(TF1C1), X(TF1C1)],'k-');
text(VIH, X(TF1C1), ['NMH=', num2str(NMH,3)]);
fprintf('VOH=%fV, VIH=%fV, NMH=VOH-VIH=%fV\n', VOH, VIH, VOH-VIH);
fprintf('VOL=%fV, VIL=%fV, NML=VIL-VOL=%fV\n', VOL, VIL, VIL-VOL);
fprintf('(Critical) Static Noise Margin = ');
if(NMH>NML) fprintf('%fV\n\n', NML);
else fprintf('%fV\n\n', NMH);
end
* SNM.sp
*
Static Noise Margins from Min-Sized CMOS INV to Min-Sized Pseudo-nMOS INV
.lib 'rf018.l' tt
.GLOBAL VDD
VDD VDD 0 1.8
.SUBCKT CMOS_INV IN OUT
MP OUT IN VDD VDD PCH L=0.18u W=0.22u
MN OUT IN 0 0 NCH L=0.18u W=0.22u
.ENDS
.SUBCKT NMOS_INV IN OUT
MP OUT 0 VDD VDD PCH L=0.18u W=0.22u
MN OUT IN 0 0 NCH L=0.18u W=0.22u
.ENDS
VSW SW 0 DC 0
X1 SW TF1 CMOS_INV
X2 SW TF2 NMOS_INV
.DC VSW 0 1.8 0.01
.OPTION POST
.END