Datapath


\documentclass[border=3pt]{standalone}

%%Fonts
%\usepackage{fontspec}
%\setmainfont[Mapping=tex-text]{Times New Roman}
%\setmonofont[Mapping=tex-text]{JetBrains Mono}

%Drawing
\usepackage{tikz}

%Tikz Library
\usetikzlibrary{calc}

% Align text in the center of nodes
\tikzset{every text node part/.style={align=center}}

% Circuits
\usepackage{circuitikz}

% Colors
\usepackage{xcolor}
%
\definecolor{myblue}{HTML}{4698ED}
%
\def\muxcolor{orange!40}
\def\nonarchcolor{yellow!40}
\def\processingcolor{green!70!blue!30!}
\def\storagecolor{myblue!50}
\def\controlcolor{cyan!80!blue}

% Label
\tikzset{label_args/.style={
		font=\scriptsize\ttfamily,
	}
}

% FF size
\def\ffsize{2.2}
\def\ffwidth{1.3}

% CLK above components
\tikzset{clk/.pic = {
		\node[above] at (#1) {\scriptsize{CLK}};
	}
}

% Non-Architectural Flip Flop
\tikzset{non_arch_ff/.style={
	muxdemux,
	muxdemux def={
			Lh=\ffsize, Rh=\ffsize, w=\ffwidth, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=1, NR=1, NB=0, NT=1,
		},
	muxdemux label ={
			cT1=1,
		},
	circuitikz/muxdemuxes/fill=\nonarchcolor,
    append after command={
			pic{clk=\tikzlastnode.tpin 1}
		},
	},
}

% Non-Architectural Flip Flop with We
\tikzset{non_arch_ff_we/.style={
	muxdemux,
	muxdemux def={
			Lh=\ffsize, Rh=\ffsize, w=\ffwidth, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=1, NR=1, NB=1, NT=1,
		},
	muxdemux label ={
			cT1=1,
			B1=WE
		},
	circuitikz/muxdemuxes/fill=\nonarchcolor,
    append after command={
			pic{clk=\tikzlastnode.tpin 1}
		},
	},
}

% Architectural Flip Flop with We
\tikzset{ff_we/.style={
	muxdemux,
	muxdemux def={
			Lh=\ffsize, Rh=\ffsize, w=\ffwidth, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=1, NR=1, NB=1, NT=1,
		},
	muxdemux label ={
			cT1=1,
			B1=WE,
		},
	circuitikz/muxdemuxes/fill=\storagecolor,
    append after command={
			pic{clk=\tikzlastnode.tpin 1}
		},
	},
}

% Instruction Memory
\tikzset{instr_mem/.style={
	muxdemux,
	muxdemux def={
			Lh=6, Rh=6, w=5, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=2, NR=2, NB=0, NT=0,
		},
	muxdemux label ={
			L1=A,
			R1=RD,
		},
	draw only left pins={1},
	draw only right pins={1},
	circuitikz/muxdemuxes/fill=\storagecolor,
	circuitikz/muxdemux/inner label font=\scriptsize,
	},
}

% PC + 4
\tikzset{PC_4/.style={
	muxdemux,
	muxdemux def={
			Lh=3, Rh=1.4, w=1.5, square pins=1,
			inset Lh=1, inset Rh=0, inset w=0.75,
			NL=2, NR=1, NB=0, NT=0,
		},
	circuitikz/muxdemuxes/fill=\processingcolor
	},
}

% Register File
\tikzset{RF/.style={
	muxdemux,
	muxdemux def={
			Lh=9, Rh=9, w=5, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=5, NR=2, NB=0, NT=5,
		},
	muxdemux label ={
			L1=A1, L2=A2, L3=A3, L4=R15, L5=WD3,
			R1=RD1, R2=RD2,
			cT2=1, T4=WE3
		},
	draw only top pins={2,4},
	circuitikz/muxdemuxes/fill=\storagecolor,
	circuitikz/muxdemux/inner label font=\scriptsize,
    append after command={
			pic{clk=\tikzlastnode.tpin 2}
		},
	},
}

% Extend Unit
\tikzset{extend/.style={
	muxdemux,
	muxdemux def={
			Lh=2, Rh=2.5, w=6, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=1, NR=1, NB=0, NT=1,
		},
	circuitikz/muxdemuxes/fill=\processingcolor
	},
}

% MUX\documentclass[border=3pt]{standalone}
\tikzset{mux2to1/.style={
	muxdemux,
	muxdemux def={
			Lh=2, Rh=1.5, w=0.8, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=2, NR=1, NB=0, NT=1,
		},
	muxdemux label ={
			L1=0, L2=1,
		},
	circuitikz/muxdemuxes/fill=\muxcolor,
	circuitikz/muxdemux/inner label font=\small,
	},
}
\tikzset{mux2to1_reverse/.style={
	muxdemux,
	muxdemux def={
			Lh=2, Rh=1.5, w=0.8, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=2, NR=1, NB=0, NT=1,
		},
	muxdemux label ={
			L1=1, L2=0,
		},
	circuitikz/muxdemuxes/fill=\muxcolor,
	circuitikz/muxdemux/inner label font=\small,
	},
}

% ALU
\tikzset{ALU/.style={
	muxdemux,
	muxdemux def={
			Lh=8, Rh=3.5, w=2.5, square pins=1,
			inset Lh=2, inset Rh=0, inset w=1.2,
			NL=2, NR=1, NB=0, NT=3,
		},
	circuitikz/muxdemuxes/fill=\processingcolor,
	external pins width=1,
	},
}

% Data Memory
\tikzset{data_mem/.style={
	muxdemux,
	muxdemux def={
			Lh=8, Rh=8, w=4, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=3, NR=3, NB=0, NT=6,
		},
	muxdemux label ={
			L1=A, L3=WD,
			R3=RD,
			cT2=1, T5=WE,
		},
	draw only left pins={1,3},
	draw only right pins={3},
	draw only top pins={2,5},
	circuitikz/muxdemuxes/fill=\storagecolor,
	circuitikz/muxdemux/inner label font=\scriptsize,
    append after command={
			pic{clk=\tikzlastnode.tpin 2}
		},
	},
}

% MUX 3 to 1
\tikzset{mux3to1/.style={
	muxdemux,
	muxdemux def={
			Lh=2, Rh=2.4, w=0.8, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=1, NR=3, NB=0, NT=1,
		},
	muxdemux label ={
			R1=00, R2=01, R3=10,
		},
	circuitikz/muxdemuxes/fill=\muxcolor,
	circuitikz/muxdemux/inner label font=\scriptsize,
	},
}

% MUX\documentclass[border=3pt]{standalone}
\tikzset{mux2to1_leftsided/.style={
	muxdemux,
	muxdemux def={
			Lh=2.4, Rh=3, w=0.8, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=1, NR=2, NB=0, NT=1,
		},
	muxdemux label ={
			R1=0, R2=1,
		},
	circuitikz/muxdemuxes/fill=\muxcolor,
	circuitikz/muxdemux/inner label font=\small,
	},
}

% Control Signal
\newcommand{\control}[3]{
	\node[#3] at (#2) {\ttfamily\scriptsize\color{\controlcolor}#1};
}

\begin{document}
	\begin{tikzpicture}
		%%%% Components %%%%
		
		% PC
		\node[ff_we] (PC) 
			 at (0,0) {PC};
			 
		% Instruction Memory
		\node[instr_mem, anchor=lpin 1, xshift=0.5cm] (instr_mem)
			 at (PC.rpin 1) {\\[4mm]Instruction\\Memory};
			 
		% IR
		\node[non_arch_ff_we, anchor=lpin 1, xshift=0.5cm] (IR) 
			 at (instr_mem.rpin 1) {IR};			 
			 
		% PC + 4
		\node[PC_4] (PCPlus4) 
   			 at ($(instr_mem.center) + (0,-3.5)$) {+};			
   			 
		% PC p4
		\node[non_arch_ff] (PC_p4) 
			 at (IR.bpin 1|-PCPlus4) {PC\\p4};
			 
		% PC + 8
		\node[PC_4, anchor=lpin 2, shift={(2cm,1cm)}] (PCPlus8) 
   			 at (PC_p4.rpin 1) {+};
   			 
   		% Register File
		\node[RF, anchor=lpin 4, xshift=4cm] (RF) 
   			 at (PCPlus8.rpin 1) {Register\\File};	
   			 
   		% Extend Unit
   		\node[extend, yshift=-2cm] (Extend)
   			 at (RF.bottom) {Extend};
   			 
   		% MUX A1
   		\node[mux2to1, anchor=brpin 1, xshift=-4.5cm] (mux2to1_A1)
   			 at (RF.lpin 1) {};
   			 
   		% MUX A2
   		\node[mux2to1, anchor=brpin 1, xshift=-3cm] (mux2to1_A2)
   			 at (RF.lpin 2) {};
   			 
   		% MUX A3
   		\node[mux2to1, anchor=brpin 1, xshift=-1.5cm] (mux2to1_A3)
   			 at (RF.lpin 3) {};
   			 
   		% MUX WD3
   		\node[mux2to1_reverse, anchor=blpin 1, xshift=-0.23cm] (mux2to1_WD3)
   			 at (PC_p4.brpin 1-|mux2to1_A3) {};
   			 
		% A
		\node[non_arch_ff, anchor=rpin 1, xshift=1.5cm] (A) 
			 at (RF.rpin 1) {A};	
			 
		% B
		\node[non_arch_ff, anchor=rpin 1, xshift=1.5cm] (B) 
			 at (RF.rpin 2) {B};	
			 
		% I
		\node[non_arch_ff] (I) 
			 at (Extend.rpin 1-|A) {I};	
			 
   		% MUX B
   		\node[mux2to1, anchor=blpin 1, xshift=1.5cm] (mux2to1_B)
   			 at (B.brpin 1) {};
   			 
		% ALU
		\node[ALU, anchor=lpin 2, xshift=0cm] (ALU) 
   			 at (mux2to1_B.rpin 1) {\rotatebox{90}{ALU}};
			 
		% MA
		\node[non_arch_ff_we, anchor=rpin 1, xshift=1cm] (MA) 
			 at (ALU.rpin 1) {MA};	
			 
		% Status Register
		\node[ff_we] (SR) 
			 at (MA|-ALU.tpin 3) {SR};
		
		% Data Memory
		\node[data_mem, anchor=lpin 1, xshift=1cm] (data_mem)
			 at (MA.rpin 1) {Data\\Memory};
			 
		% WD
		\node[non_arch_ff, anchor=rpin 1, xshift=-1cm] (WD) 
			 at (data_mem.lpin 3) {WD};	
		
		% MUX 3 to 1	 
		\node[mux3to1, yshift=-3cm] (mux3to1)
			 at (PCPlus4) {};
		
		% MUX\documentclass[border=3pt]{standalone}
		\node[mux2to1_leftsided] (mux2to1_leftsided)
			 at (mux3to1.rpin 3-|WD) {};
			 
		% S
		\node[non_arch_ff, anchor=lpin 1, xshift=0.2cm] (S)
			 at (mux2to1_leftsided.rpin 1) {S};

		% RD
		\node[non_arch_ff] (RD)
			 at (mux2to1_leftsided.rpin 2-|data_mem) {RD};
		
		%%%% Connections %%%%
		
		% Buses of 32 bits
		\draw[ultra thick] 
			 (PC.brpin 1) -- (instr_mem.blpin 1)
			 %
			 (instr_mem.brpin 1) -- (IR.blpin 1)
			 %
			 (PCPlus4.blpin 1) -| ($(PC.rpin 1)!0.5!(instr_mem.lpin 1)$)
	  		 (PCPlus4.brpin 1) -- (PC_p4.blpin 1)
			 (PC_p4.brpin 1) -| (PCPlus8.lpin 2) -- (PCPlus8.blpin 2)
			 %
			 (PCPlus8.brpin 1) -- (RF.blpin 4)
			 %
			 (IR.brpin 1) -- +(0.7,0) coordinate (ir_tmp)
			 			  -- (ir_tmp|-ALU.tpin 1)
			 			  -- (ir_tmp|-Extend.lpin 1)
			 			  -- (Extend.blpin 1)
			 %
  			 (mux2to1_WD3.brpin 1) -- ++(0.3,0) |- (RF.blpin 5)
			 (mux2to1_WD3.blpin 1) -- (PC_p4.brpin 1)
  			 (mux2to1_WD3.blpin 2) -- (mux2to1_WD3.lpin 2) 
  			 					   -- (mux2to1_WD3.lpin 2|-mux3to1.rpin 3)
  			 %
  			 (RF.brpin 1) -- (A.blpin 1)
  			 (RF.brpin 2) -- (B.blpin 1)
  			 %
  			 (Extend.brpin 1) -- (I.blpin 1)
  			 %
  			 (B.brpin 1) -- (mux2to1_B.blpin 1)
  			 (I.brpin 1) -| (mux2to1_B.lpin 2) -- (mux2to1_B.blpin 2)
  			 %
  			 (ALU.blpin 1) -- (A.brpin 1)
  			 (ALU.blpin 2) -- (mux2to1_B.brpin 1)
  			 %
  			 (ALU.brpin 1) -- (MA.blpin 1)
  			 %
  			 (MA.brpin 1) -- (data_mem.blpin 1)
  			 %
  			 (data_mem.blpin 3) -- (WD.brpin 1)
  			 (data_mem.brpin 3) -- (data_mem.rpin 3) |- (RD.rpin 1) -- (RD.brpin 1)
  			 %
  			 (WD.blpin 1) -| ($(B.brpin 1)!0.5!(mux2to1_B.blpin 1)$)
  			 %
  			 (mux3to1.blpin 1) -| ($(PC.lpin 1)+(-0.4,0)$) -- (PC.blpin 1)
  			 (mux3to1.brpin 1) -| ($(PC_p4.brpin 1)+(0.35,0)$)
  			 (mux3to1.brpin 2) -| ($(ALU.brpin 1)!0.5!(MA.blpin 1)$) coordinate (ALU_tmp)
  			 (mux3to1.brpin 3) -- (mux2to1_leftsided.blpin 1)
  			 %
  			 (mux2to1_leftsided.brpin 1) -- (S.blpin 1)
  			 (mux2to1_leftsided.brpin 2) -- (RD.blpin 1)
  			 %
  			 (S.brpin 1) -- (S.rpin 1) -- ++(0,1.4cm) coordinate (S_tmp)
  			             -- (S_tmp-|ALU_tmp)
			 %
			 (ALU.btpin 1) -- (ALU.tpin 1) |- (ALU.tpin 1-|ir_tmp) -- (ir_tmp);

		% Smaller Buses			 			  
		\draw[thick]
			 (mux2to1_A1.brpin 1) -- (RF.blpin 1)
			 (mux2to1_A1.blpin 1) -- (mux2to1_A1.blpin 1-|ir_tmp)
			 %
 			 (mux2to1_A3.brpin 1) -- (RF.blpin 3)
			 (mux2to1_A3.blpin 1) -- (mux2to1_A3.blpin 1-|ir_tmp)
			 %
 			 (mux2to1_A2.brpin 1) -- (RF.blpin 2)
			 (mux2to1_A2.blpin 1) -- (mux2to1_A2.blpin 1-|ir_tmp)
			 (mux2to1_A2.blpin 2) -| (mux2to1_A2.lpin 1|-mux2to1_A3.blpin 1)
			 %
			 (ALU.btpin 3) -- (ALU.tpin 3) -- (SR.blpin 1)
			 [-stealth] (SR.brpin 1) -- (SR.rpin 1) 
			 			 -- +(0,1.2) node[right,pos=0.45] {\rotatebox{-90}{\small{Flags}}};
		
		%%%% Control %%%%
		\control{PCWrite}{PC.bpin 1}{below};
		%
		\control{IRWrite}{IR.bpin 1}{below};
		%
		\control{ImmSrc[1:0]}{Extend.tpin 1}{above};
		%
		\control{RegSrc[0]}{mux2to1_A1.tpin 1}{above};
		%
		\draw (mux2to1_A2.tpin 1) -- (mux2to1_A2.tpin 1|-mux2to1_A1.tpin 1)
			  coordinate (control_mux2to1_A1);
		\control{RegSrc[1]}{control_mux2to1_A1}{above};		
		%
		\draw (mux2to1_A3.tpin 1) -- (mux2to1_A3.tpin 1|-mux2to1_A1.tpin 1)
			  coordinate (control_mux2to1_A3);
		\control{RegSrc[2]}{control_mux2to1_A3}{above};	
		%
		\draw (mux2to1_WD3.tpin 1) -- (mux2to1_A3.bottom);
		%
		\control{RegWrite}{RF.tpin 4}{above};
		%
		\control{ALUSrc}{mux2to1_B.tpin 1}{above};
		%
		\control{ALUControl[2:0]}{ALU.tpin 2}{above};
		%
		\control{FlagsWrite}{SR.bpin 1}{below};
		%
		\control{MAWrite}{MA.bpin 1}{below};
		%
		\control{MemWrite}{data_mem.tpin 5}{above};
		%
		\control{PCSrc[1:0]}{mux3to1.tpin 1}{above};
		%
		\control{MemtoReg}{mux2to1_leftsided.tpin 1}{above};
		
		%%%% Inputs %%%%
		\node[left] at (PCPlus4.lpin 2) {\ttfamily4};
		%
		\node[left] at (PCPlus8.lpin 1) {\ttfamily4};
		%
		\node[left] at (mux2to1_A1.lpin 2) {\ttfamily15};
		%
		\node[left] at (mux2to1_A3.lpin 2) {\ttfamily14};
		
		%%%% Instruction Bits %%%%
		\node[above] at 
			 ($(mux2to1_A1.blpin 1-|ir_tmp)!0.24!(mux2to1_A1.blpin 1)$) 
			 {\scriptsize\ttfamily19:16};
		%
		\node[above] at 
			 ($(mux2to1_A2.blpin 1-|ir_tmp)!0.1!(mux2to1_A2.blpin 1)$) 
			 {\scriptsize\ttfamily3:0};
		%
		\node[above] at 
			 ($(mux2to1_A3.blpin 1-|ir_tmp)!0.09!(mux2to1_A3.blpin 1)$) 
			 {\scriptsize\ttfamily15:12};
		%
		\node[above] at 
			 ($(Extend.blpin 1-|ir_tmp)!0.06!(Extend.blpin 1)$) 
			 {\scriptsize\ttfamily23:0};
		%
		\node[above] at 
			 ($(ALU.tpin 1-|ir_tmp)!0.024!(ALU.tpin 1)$) 
			 {\scriptsize\ttfamily11:5};
			 
		%%%% Labels %%%%
		\node[label_args, above, xshift=-1.5pt] at 
			 (PC.lpin 1) {PC'};
		\node[label_args, above] at 
			 ($(PC.rpin 1)!0.5!(instr_mem.lpin 1)$) {PC};
		\node[label_args, above] at 
			 ($(instr_mem.rpin 1)!0.5!(IR.lpin 1)$) {Instr};
		\node[label_args, above] at 
			 ($(PCPlus4.rpin 1)!0.5!(PC_p4.lpin 1)$) {PCPlus4};
		\node[label_args, below, xshift=0.6cm] at 
			 (I.rpin 1) {ExtImm};
		\node[label_args, above] (SrcB) at 
			 ($(mux2to1_B.brpin 1)!0.5!(ALU.blpin 2)$) {SrcB};
		\node[label_args, above] at 
			 (A-|SrcB) {SrcA};
		\node[label_args, above] at 
			 (WD.lpin 1-|ALU.blpin 2) {WriteData};
		\node[label_args, above, xshift=-0.9cm] at 
			 (S_tmp) {ALUResult};
		\node[label_args, above] at 
			 (mux2to1_leftsided-|mux2to1_WD3) {Result};
		\node[label_args, above] (WA) at 
			 ($(mux2to1_A3.rpin 1)!0.5!(RF.lpin 3)$) {WA};
		\node[label_args, above] at 
			 (WA|-mux2to1_A1) {RA1};
		\node[label_args, above] at 
			 (WA|-mux2to1_A2) {RA2};
		\node[label_args, above] at 
			 (WA|-PCPlus8) {PCPlus8};
	\end{tikzpicture}
\end{document}

Control Unit


\documentclass[border=3pt]{standalone}

%%Fonts
%\usepackage{fontspec}
%\setmainfont[Mapping=tex-text]{Times New Roman}
%\setmonofont[Mapping=tex-text]{JetBrains Mono}

%Drawing
\usepackage{tikz}
\usetikzlibrary{calc, positioning}

% Circuits
\usepackage{circuitikz}

% Lengths
\def\instrdeclen{7}
\def\fsmlen{10}
\def\condlogiclen{4}
\def\width{10.5}

% Node specifics
\def\fillcolor{cyan!60}
\def\innderlabelfont{\scriptsize}

% Connections
\def\outlen{1.5cm}

\tikzset{
every node/.style={rounded corners=0.5cm},
% Instruction Decoder
instr_dec/.style={
	muxdemux,
	muxdemux def={
			Lh=\instrdeclen, Rh=\instrdeclen, w=\width, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=2, NR=5, NB=2, NT=0,
		},
	muxdemux label ={
			L1=op, L2=funct,
			R1=RegSrc, R2=ALUSrc, R3=MemtoReg, R4=ALUControl, R5=ImmSrc,
			B1=NoWrite\_in, B2=BL\_in,
		},
	circuitikz/muxdemuxes/fill=\fillcolor,
	circuitikz/muxdemux/inner label font=\innderlabelfont,
	},
% FSM
fsm/.style={
	muxdemux,
	muxdemux def={
			Lh=\fsmlen, Rh=\fsmlen, w=\width, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=3, NR=7, NB=0, NT=0,
		},
	muxdemux label ={
			L1=op, L2=S/L, L3=R\_d,
			R1=IRWrite, R2=RegWrite, R3=MAWrite, R4=MemWrite, R5=FlagsWrite, R6=PCSrc, R7=PCWrite,
			B1=NoWrite\_in,
		},
	circuitikz/muxdemuxes/fill=\fillcolor,
	circuitikz/muxdemux/inner label font=\innderlabelfont,
	},
% Conditional Logic
cond_logic/.style={
	muxdemux,
	muxdemux def={
			Lh=\condlogiclen, Rh=\condlogiclen, w=\width, square pins=1,
			inset Lh=0, inset Rh=0, inset w=0,
			NL=2, NR=0, NB=0, NT=1,
		},
	muxdemux label ={
			L1=cond, L2=flags,
			T1=CondEx\_in,
		},
	circuitikz/muxdemuxes/fill=\fillcolor,
	circuitikz/muxdemux/inner label font=\innderlabelfont,
	},
% Label
label/.style={
	font=\large\bfseries,
	align=center,
},
% Connection
connection/.style={
	thin,
},
% Input
input/.style={
	font=\scriptsize\ttfamily, above, xshift=-0.2cm,
},
% Output
output/.style={
	font=\ttfamily, right,
},
}

\begin{document}
	\begin{tikzpicture}[node distance = 1cm]
		% Components
		\node[instr_dec, label] 
			 (instr_dec) {Instruction\\Decoder};

		\node[fsm, label, anchor = north, below=of instr_dec.south] 
			 (fsm) {FSM};

		\node[cond_logic, label, anchor = north, below=of fsm.south] 
			 (cond_logic) {Conditional\\Logic};
			 
			 
		% Connections
		
		% Instruction Decoder Output
		\draw[connection] (instr_dec.brpin 1) -- ++(\outlen,0) node[output] {RegSrc};
		\draw[connection] (instr_dec.brpin 2) -- ++(\outlen,0) node[output] {ALUSrc};
		\draw[connection] (instr_dec.brpin 3) -- ++(\outlen,0) node[output] {MemtoReg};
		\draw[connection] (instr_dec.brpin 4) -- ++(\outlen,0) node[output] {ALUControl};
		\draw[connection] (instr_dec.brpin 5) -- ++(\outlen,0) node[output] {ImmSrc};
		%
		\draw[connection] (instr_dec.blpin 1) -- ++(-\outlen,0) node[input, pos=0.4] {27:26};
		\draw[connection] (instr_dec.blpin 2) -- ++(-\outlen,0) node[input, pos=0.4] {25:20};
		
		% FSM Input
		\draw[connection, -stealth] (cond_logic.top) -- (fsm.bottom); 
		\draw[connection, -stealth] (instr_dec.bbpin 1) -- (instr_dec.bbpin 1|-fsm.top);
		\draw[connection, -stealth] (instr_dec.bbpin 2) -- (instr_dec.bbpin 2|-fsm.top);
		%
		\draw[connection] (fsm.blpin 1) -- ++(-\outlen,0) node[input, pos=0.4] {27:26};
		\draw[connection] (fsm.blpin 2) -- ++(-\outlen,0) node[input, pos=0.4] {20};
		\draw[connection] (fsm.blpin 3) -- ++(-\outlen,0) node[input, pos=0.4] {15:12};
		
		% FSM Output
		\draw[connection] (fsm.brpin 1) -- ++(\outlen,0) node[output] {IRWrite};
		\draw[connection] (fsm.brpin 2) -- ++(\outlen,0) node[output] {RegWrite};
		\draw[connection] (fsm.brpin 3) -- ++(\outlen,0) node[output] {MAWrite};
		\draw[connection] (fsm.brpin 4) -- ++(\outlen,0) node[output] {MemWrite};
		\draw[connection] (fsm.brpin 5) -- ++(\outlen,0) node[output] {FlagsWrite};
		\draw[connection] (fsm.brpin 6) -- ++(\outlen,0) node[output] {PCSrc};
		\draw[connection] (fsm.brpin 7) -- ++(\outlen,0) node[output] {PCWrite};
		
		% Conditional Logic Input
		\draw[connection] (cond_logic.blpin 1) -- ++(-\outlen,0) node[input, pos=0.4] {31:28};
		\draw[connection] (cond_logic.blpin 2) -- ++(-\outlen,0) coordinate (in);
		
		% Input to Control Unit
		\draw[very thick]
			 ($(fsm.left)!0.5!(cond_logic.left) + (-3cm,0)$) node[output, left] (IR) {IR} -- 
			 (IR-|in) -- 
			 ($(in|-instr_dec.lpin 1) + (0,0.3)$) --
			 ($(in|-cond_logic.lpin 1) + (0,-0.3)$);
			 
		\draw[very thick]
			 (cond_logic.blpin 2) -- ++(-3cm,0) node[output, left] {SR};
						   
		\node[
			draw, 
			ultra thick, 
			cyan, 
			fill=cyan,
			fill opacity=0.2,
			rectangle, 
			minimum height=16cm, 
			minimum width=9cm, 
			yshift=1.5cm,
			xshift=-0.8cm] (control) at (fsm) {};
		\node[yshift=-0.5cm] at (control.north) {\LARGE\bfseries Control};
	\end{tikzpicture}
\end{document}



























FSM Schematic


\documentclass[border=3pt]{standalone}

%%Fonts
%\usepackage{fontspec}
%\setmainfont[Mapping=tex-text]{JetBrains Mono}

% Tikz
\usepackage{tikz}
\usetikzlibrary{calc, positioning}

\tikzset{
node distance = 1.5cm and 1.5cm,
state/.style={
	draw,
	very thick,
	shape=circle, 
	inner sep=0pt,
	outer sep=2pt,
	text width=25pt,
	align=center,
	fill=gray!30,
},
S0/.style={
	draw=gray!100,
	fill=gray!20,
},
S1/.style={
	draw=green!70!black,
	fill=green!20,
},
S2/.style={
	draw=magenta!100,
	fill=magenta!20,
},
S3/.style={
	draw=cyan!100,
	fill=cyan!20,
},
S4/.style={
	draw=orange!100,
	fill=orange!20,
},
connection/.style={
	-stealth,
},
label/.style={
	font=\tiny\ttfamily,
	align=center,
}
}

% Notation
\usepackage{amsmath}

\begin{document}
	\begin{tikzpicture}
		% State 0
		\node[state, S0] (S0) {S0};
		% State 1
		\node[state, below = of S0, S1] (S1) {S1};
		% State 2
		\node[state, below = of S1, S2] (S2a) {S2a};
		\node[state, right = of S2a, S2] (S2b) {S2b};
		% State 3
		\node[state, below = of S2a, S3] (S3) {S3};
		% State 4
		\node[state, below = of S3, S4] (S4a) {S4a};
		%% Right
		\node[state, right = of S4a, S4] (S4b) {S4b};
		\node[state, right = of S4b, S4] (S4e) {S4e};
		\node[state, right = of S4e, S4] (S4f) {S4f};
		\node[state, right = of S4f, S4] (S4g) {S4g};
		%% Left
		\node[state, left = of S4a, S4] (S4d) {S4d};
		\node[state, left = of S4d, S4] (S4c) {S4c};
		\node[state, left = of S4c, S4] (S4h) {S4h};
		\node[state, left = of S4h, S4] (S4i) {S4i};
		
		% Connections
		
		% Reset
		\draw[connection] (-1,0) -- (S0) node[pos=-1.5] {\texttt Reset};
		
		% S0 ->
		\draw[connection] (S0) -- (S1);
		
		% S1 ->
		\draw[connection] (S1) -- (S2a) 
			 node[label, pos = 0.5, xshift=-10] {op=01\\cEx=1};
		\draw[connection] (S1) -- (S2b)
			 node[label, pos = 0.5, anchor=35] {op=00\\cEx=1\\NoW=0};
		\draw[connection] (S1) -- (S4g.120) 
			 node[label, pos = 0.5, anchor=south west] {op=00\\cEx=1\\NoW=1};
			 
		\draw[connection] (S1) -- (S4c) 
			 node[label, pos = 0.65, anchor=base east] {cEx=0};
		\draw[connection] (S1) -- (S4h) 
			 node[label, pos = 0.65, anchor=base east] {op=10\\cEx=1\\BL\_in=0};
		\draw[connection] (S1) -- (S4i)
			 node[label, pos = 0.65, anchor=base east] {op=10\\cEx=1\\BL\_in=1};
			 
		% S2a ->
		\draw[connection] (S2a) -- (S3)
			 node[label, pos = 0.5, right] {L=1};
		\draw[connection] (S2a) -- (S4d)
			 node[label, pos = 0.5, left] {L=0};
		
		% S2b ->
		\draw[connection] (S2b) -- (S4a)
			 node[label, pos = 0.5, right] {S=0\\Rd!=15};
		\draw[connection] (S2b) -- (S4b)
			 node[label, pos = 0.5, right] {S=0\\Rd=15};
		\draw[connection] (S2b) -- (S4e)
			 node[label, pos = 0.58, above right] {S=1\\Rd!=15};
		\draw[connection] (S2b) -- (S4f)
			 node[label, pos = 0.58, above right] {S=1\\Rd=15};
			 
		% S3 -> 
		\draw[connection] (S3) -- (S4a)
			 node[label, pos = 0.5, left] {Rd!=15};
		\draw[connection] (S3) -- (S4b)
			 node[label, pos = 0.45, anchor=base west] {Rd=15};
		
		
		% S4g ->
		\draw[connection] (S4g) -- ++(0,-1) -| ++(1,0) coordinate (S4g_temp) -- 
						  (S0-|S4g_temp) coordinate (S4g_temp) -- (S0);
		
		% S4f ->
		\draw[connection] (S4f) -- ++(0,-1) -| (S4g_temp) -- (S0);		
		
		% S4e ->
		\draw[connection] (S4e) -- ++(0,-1) -| (S4g_temp) -- (S0);		
		
		% S4b ->
		\draw[connection] (S4b) -- ++(0,-1) -| (S4g_temp) -- (S0);
		
		% S4a ->		
		\draw[connection] (S4a) -- ++(0,-1) -| (S4g_temp) -- (S0);
		
		% S4d ->
		\draw[connection] (S4d) -- ++(0,-1) -| (S4g_temp) -- (S0);
		
		% S4c ->
		\draw[connection] (S4c) -- ++(0,-1) -| (S4g_temp) -- (S0);
		
		% S4h ->
		\draw[connection] (S4h) -- ++(0,-1) -| (S4g_temp) -- (S0);
		
		% S4i ->
		\draw[connection] (S4i) -- ++(0,-1) -| (S4g_temp) -- (S0);
	\end{tikzpicture}
\end{document}

Leave a Reply

Your email address will not be published.