diff --git a/PS1/doc.tex b/PS1/doc.tex index 1c5efcc..c1587f9 100644 --- a/PS1/doc.tex +++ b/PS1/doc.tex @@ -11,12 +11,22 @@ \definecolor{gray}{rgb}{0.5,0.5,0.5} \definecolor{mauve}{rgb}{0.58,0,0.82} -\lstset{basicstyle=\small, - keywordstyle=\color{mauve}, - identifierstyle=\color{dkgreen}, - stringstyle=\color{gray}, - numbers=left - } +\lstset{language=Matlab,% + %basicstyle=\color{red}, + breaklines=true,% + morekeywords={matlab2tikz}, + keywordstyle=\color{blue},% + morekeywords=[2]{1}, keywordstyle=[2]{\color{black}}, + identifierstyle=\color{black},% + stringstyle=\color{mylilas}, + commentstyle=\color{mygreen},% + showstringspaces=false,%without this there will be a symbol in the places where there is a space + numbers=left,% + numberstyle={\tiny \color{black}},% size of the numbers + numbersep=9pt, % this defines how far the numbers are from the text + emph=[1]{for,end,break},emphstyle=[1]\color{red}, %some words to emphasise + %emph=[2]{word1,word2}, emphstyle=[2]{style}, +} \title{ECE 456 - Problem Set 1} \date{2021-02-06} @@ -35,29 +45,14 @@ \singlespacing \pagenumbering{arabic} - \section{Introduction} + \section{Question 1} + \subsection{(a)} - The purpose of this lab was to design control circuits according to the provided - specifications, and then verify their operation using a simulation or an FPGA. + \begin{equation} + N = $\int_{-\infty}^{\infty}$ + \end{equation} - In the first part of the lab, a series of boolean expressions - were designed to implement a Multiplexer/Demultiplexer circuit, - intended to route data from one of three radio recievers to one - of three engineers, and signal which engineer was currently - recieving data. - First, Xilinx Vivado Software was used to produce a circuit - to fulfill this objective. Then, using the same software, - the circuit was simulated against input combinations which - would be encountered during normal use, for verification. - - For the second part of the lab, an Access Control circuit was to be designed, - allowing lab entry only if a valid ID was provided alongside a proper keypad - combination. Otherwise, an alarm signal was to be sent out. - The method of designing this circuit was very similar to the method in part one: - Again using Xilinx Vivado, the circuit was designed and simulated against inputs - to verify if the outputs matched those in the specification. - However, for this section, the design was also uploaded to a physical FPGA board - where various could be manually tested and validated. + \section{Design Section} @@ -70,30 +65,112 @@ The VHDL architecture below was written to implement this circuit in hardware. - \begin{lstlisting}[language=MATLAB] -U0 = 0.25; + \begin{lstlisting}[language=Matlab] +clear all; + +%% Constants + +% Physical constants +hbar = 1.052e-34; + +% Single-charge coupling energy (eV) +U_0 = 0.25; +% (eV) kBT = 0.025; +% Contact coupling coefficients (eV) +gamma_1 = 0.005; +gamma_2 = gamma_1; +gamma_sum = gamma_1 + gamma_2; +% Capacitive gate coefficient +a_G = 0.5; +% Capacitive drain coefficient +a_D = 0.5; +a_S = 1 - a_G - a_D; + +% Central energy level mu = 0; + +% Energy grid, from -1eV to 1eV +NE = 501; +E = linspace(-1, 1, NE); +dE = E(2) - E(1); +% TODO name this better cal_E = 0.2; -% Capacitance parameters +% Lorentzian density of states, normalized so the integral is 1 +D = (gamma_sum / (2*pi)) ./ ( (E-cal_E).^2 + (gamma_sum/2).^2 ); +D = D ./ (dE*sum(D)); -alpha_G = 0.5; -alpha_D = 0.5; -alpha_S = 1 - alpha_G - alpha_D; +% Reference no. of electrons in channel +N_0 = 0; -% Energy grid in eV, from -1 eV to 1 eV +voltages = linspace(0, 1, 101); -NE = 501; -E = linspace(-1,1,NE); -dE = E(2) - E(1); +% Terminal Voltages +V_G = 0; +V_S = 0; -% Gamma parameters, in eV +for n = 1:length(voltages) + % Set varying drain voltage + V_D = voltages(n); -gamma_1 = 0.005; -gamma_2 = 0.005; -gamma = gamma_1 + gamma_2; + % Shifted energy levels of the contacts + mu_1 = mu - V_S; + mu_2 = mu - V_D; + + % Laplace potential, does not change as solution is found (eV) + % q is factored out here, we are working in eV + U_L = - (a_G*V_G) - (a_D*V_D) - (a_S*V_S); + + % Poisson potential must change, assume 0 initially (eV) + U_P = 0; + + % Assume large rate of change + dU_P = 1; + + % Run until we get close enough to the answer + while dU_P > 1e-6 + % source Fermi function + f_1 = 1 ./ (1 + exp((E + U_L + U_P - mu_1) ./ kBT)); + % drain Fermi function + f_2 = 1 ./ (1 + exp((E + U_L + U_P - mu_2) ./ kBT)); + + % Update channel electrons against potential + N(n) = dE * sum( ((gamma_1/gamma_sum) .* f_1 + (gamma_2/gamma_sum) .* f_2) .* D); + + % Re-update Poisson portion of potential + tmpU_P = U_0 * ( N(n) - N_0); + dU_P = abs(U_P - tmpU_P); + + % Unsure why U_P is updated incrementally, perhaps to avoid oscillations? + %U_P = tmpU_P; + U_P = U_P + 0.1 * (tmpU_P - U_P) + end + + % Calculate current based on solved potential. + % Note: f1 is dependent on changes in U but has been updated prior in the loop + I(n) = q * (q/hbar) * (gamma_1 * gamma_1 / gamma_sum) * dE * sum((f_1-f_2).*D); + +end + + +%%Plotting commands + +figure(1); +h = plot(voltages, N,'k'); +grid on; +set(h,'linewidth',[2.0]); +set(gca,'Fontsize',[18]); +xlabel('Drain voltage [V]'); +ylabel('Number of electrons'); + +figure(2); +h = plot(voltages, I,'k'); +grid on; +set(h,'linewidth',[2.0]); +set(gca,'Fontsize',[18]); +xlabel('Drain voltage [V]'); +ylabel('Current [A]'); \end{lstlisting} - \newpage \end{document} \ No newline at end of file diff --git a/PS1/q1b.m b/PS1/q1b.m index 73fa455..68f8a3d 100644 --- a/PS1/q1b.m +++ b/PS1/q1b.m @@ -4,10 +4,6 @@ clear all; % Physical constants hbar = 1.052e-34; -q = 1.602e-19; -%epsilon_0 = 8.854e-12; -%epsilon_r = 4; -%mstar = 0.25 * 9.11e-31; % Single-charge coupling energy (eV) U_0 = 0.25; diff --git a/PS1/q1c.m b/PS1/q1c.m new file mode 100644 index 0000000..73fa455 --- /dev/null +++ b/PS1/q1c.m @@ -0,0 +1,109 @@ +clear all; + +%% Constants + +% Physical constants +hbar = 1.052e-34; +q = 1.602e-19; +%epsilon_0 = 8.854e-12; +%epsilon_r = 4; +%mstar = 0.25 * 9.11e-31; + +% Single-charge coupling energy (eV) +U_0 = 0.25; +% (eV) +kBT = 0.025; +% Contact coupling coefficients (eV) +gamma_1 = 0.005; +gamma_2 = gamma_1; +gamma_sum = gamma_1 + gamma_2; +% Capacitive gate coefficient +a_G = 0.5; +% Capacitive drain coefficient +a_D = 0.5; +a_S = 1 - a_G - a_D; + +% Central energy level +mu = 0; + +% Energy grid, from -1eV to 1eV +NE = 501; +E = linspace(-1, 1, NE); +dE = E(2) - E(1); +% TODO name this better +cal_E = 0.2; + +% Lorentzian density of states, normalized so the integral is 1 +D = (gamma_sum / (2*pi)) ./ ( (E-cal_E).^2 + (gamma_sum/2).^2 ); +D = D ./ (dE*sum(D)); + +% Reference no. of electrons in channel +N_0 = 0; + +voltages = linspace(0, 1, 101); + +% Terminal Voltages +V_G = 0; +V_S = 0; + +for n = 1:length(voltages) + % Set varying drain voltage + V_D = voltages(n); + + % Shifted energy levels of the contacts + mu_1 = mu - V_S; + mu_2 = mu - V_D; + + % Laplace potential, does not change as solution is found (eV) + % q is factored out here, we are working in eV + U_L = - (a_G*V_G) - (a_D*V_D) - (a_S*V_S); + + % Poisson potential must change, assume 0 initially (eV) + U_P = 0; + + % Assume large rate of change + dU_P = 1; + + % Run until we get close enough to the answer + while dU_P > 1e-6 + % source Fermi function + f_1 = 1 ./ (1 + exp((E + U_L + U_P - mu_1) ./ kBT)); + % drain Fermi function + f_2 = 1 ./ (1 + exp((E + U_L + U_P - mu_2) ./ kBT)); + + % Update channel electrons against potential + N(n) = dE * sum( ((gamma_1/gamma_sum) .* f_1 + (gamma_2/gamma_sum) .* f_2) .* D); + + % Re-update Poisson portion of potential + tmpU_P = U_0 * ( N(n) - N_0); + dU_P = abs(U_P - tmpU_P); + + % Unsure why U_P is updated incrementally, perhaps to avoid oscillations? + %U_P = tmpU_P; + U_P = U_P + 0.1 * (tmpU_P - U_P) + end + + % Calculate current based on solved potential. + % Note: f1 is dependent on changes in U but has been updated prior in the loop + I(n) = q * (q/hbar) * (gamma_1 * gamma_1 / gamma_sum) * dE * sum((f_1-f_2).*D); + +end + + +%%Plotting commands + +figure(1); +h = plot(voltages, N,'k'); +grid on; +set(h,'linewidth',[2.0]); +set(gca,'Fontsize',[18]); +xlabel('Drain voltage [V]'); +ylabel('Number of electrons'); + +figure(2); +h = plot(voltages, I,'k'); +grid on; +set(h,'linewidth',[2.0]); +set(gca,'Fontsize',[18]); +xlabel('Drain voltage [V]'); +ylabel('Current [A]'); \ No newline at end of file diff --git a/PS1/test.m b/PS1/test.m index d48c2d6..3e5fb84 100644 --- a/PS1/test.m +++ b/PS1/test.m @@ -124,4 +124,4 @@ xlabel('DRAIN VOLTAGE [V]'); ylabel('NUMBER OF ELECTRONS'); figure(2); h = plot(VV,I,'k'); grid on; set(h,'linewidth',[2.0]); set(gca,'Fontsize',[18]); -xlabel('DRAIN VOLTAGE [V]'); ylabel('CURRENT [A]'); \ No newline at end of file +xlabel('DRAIN VOLTAGE [V]'); ylabel('CURRENT [A]');