aboutsummaryrefslogtreecommitdiff
path: root/sem6/dig/m4
diff options
context:
space:
mode:
Diffstat (limited to 'sem6/dig/m4')
-rw-r--r--sem6/dig/m4/Makefile2
-rw-r--r--sem6/dig/m4/ex2.vhdl11
-rw-r--r--sem6/dig/m4/ex3.vhdl2
-rw-r--r--sem6/dig/m4/ex4.vhdl32
-rw-r--r--sem6/dig/m4/noter.tex75
5 files changed, 118 insertions, 4 deletions
diff --git a/sem6/dig/m4/Makefile b/sem6/dig/m4/Makefile
index 1c04cdd..7c53246 100644
--- a/sem6/dig/m4/Makefile
+++ b/sem6/dig/m4/Makefile
@@ -1,4 +1,4 @@
-INPUTFILES=ex1 ex2 ex3
+INPUTFILES=ex1 ex2 ex3 ex4
include ../common.mk
diff --git a/sem6/dig/m4/ex2.vhdl b/sem6/dig/m4/ex2.vhdl
index 76883ad..cb7e952 100644
--- a/sem6/dig/m4/ex2.vhdl
+++ b/sem6/dig/m4/ex2.vhdl
@@ -1,4 +1,4 @@
--- TEST_START{"inputs": ["sw0"], "outputs": ["o,3,0"], "clk": "bt0", "testin": "000111001001"}TEST_STOP
+-- TEST_START{"inputs": ["sw0"], "outputs": ["o,3,0"], "clk": "bt0", "testin": "010111110000001100"}TEST_STOP
library ieee;
use ieee.std_logic_1164.all;
@@ -17,12 +17,19 @@ begin
-- Implement shifting
next_state(3 downto 1) <= state(2 downto 0);
next_state(0) <= sw0;
- o <= state;
process (bt0)
+ variable bit_count : integer range 0 to 3;
begin
if (bt0'event and bt0 = '1') then
state <= next_state;
+
+ if (bit_count = 3) then
+ o <= next_state;
+ bit_count := 0;
+ else
+ bit_count := bit_count + 1;
+ end if;
end if;
end process;
end impl;
diff --git a/sem6/dig/m4/ex3.vhdl b/sem6/dig/m4/ex3.vhdl
index 650d303..0fc1062 100644
--- a/sem6/dig/m4/ex3.vhdl
+++ b/sem6/dig/m4/ex3.vhdl
@@ -1,4 +1,4 @@
--- TEST_START{"inputs": ["input,3,0", "write", "read"], "outputs": ["output,3,0"], "testin": [["0000", 0, 0], ["0000", 0, 1], ["1010", 1, 0], ["0000", 0, 1], ["1100", 1, 1], ["0011", 1, 1]]}TEST_STOP
+-- TEST_START{"inputs": ["input,3,0", "write", "read"], "outputs": ["output,3,0"], "testin": [["0000", 0, 0], ["0000", 0, 1], ["1010", 1, 0], ["0000", 0, 1], ["0000", 0, 0], ["0000", 0, 1], ["1100", 1, 1], ["0011", 1, 1]]}TEST_STOP
library ieee;
use ieee.std_logic_1164.all;
diff --git a/sem6/dig/m4/ex4.vhdl b/sem6/dig/m4/ex4.vhdl
new file mode 100644
index 0000000..57537bd
--- /dev/null
+++ b/sem6/dig/m4/ex4.vhdl
@@ -0,0 +1,32 @@
+-- TEST_START{"inputs": ["input,7,0", "write", "read"], "outputs": ["output,7,0"], "testin": [["00000000", 0, 0], ["00000000", 0, 1], ["10101010", 1, 0], ["00000000", 0, 1], ["00000000", 0, 0], ["00000000", 0, 1], ["11001010", 1, 1], ["00111111", 1, 1]]}TEST_STOP
+library ieee;
+use ieee.std_logic_1164.all;
+
+entity ex4 is
+ port (
+ input: in std_logic_vector(7 downto 0);
+ write: in std_logic;
+ read: in std_logic;
+ output: out std_logic_vector(7 downto 0)
+ );
+end ex4;
+
+architecture impl of ex4 is
+begin
+
+ mem_low : ENTITY work.ex3
+ PORT MAP (
+ input => input(3 downto 0),
+ write => write,
+ read => read,
+ output => output(3 downto 0)
+ );
+
+ mem_high : ENTITY work.ex3
+ PORT MAP (
+ input => input(7 downto 4),
+ write => write,
+ read => read,
+ output => output(7 downto 4)
+ );
+end impl;
diff --git a/sem6/dig/m4/noter.tex b/sem6/dig/m4/noter.tex
new file mode 100644
index 0000000..de217fd
--- /dev/null
+++ b/sem6/dig/m4/noter.tex
@@ -0,0 +1,75 @@
+\title{Noter til Lektion}
+
+Dette handlede meget om VHDL men vil mest forklare lidt om logic og nogle forskellige ting man kan lave.
+
+\paragraph{Combinatorial Cirquits} er når man har et kredsløb som er en direkt function af input, som for eksempel en and gate.
+
+Herfra kan man implementere memory så output fra kreds afhænger af alt tidligere input.
+Dette bliver kaldt \textbf{Sequential Cirquits}.
+For det meste bliver denne afhængighed implementeret med en slags \emph{state variabel}.
+
+De forskellige kan ses i slides og der er nok en god ide at finde dem frem til eksamnen.
+
+\paragraph{SR latch} er en meget simpel hvor man en set og en reset input, og et output.
+Den har følgende sandhedstabel.
+
+\begin{tabular}{ll|ll} \toprule
+ $S$ & $R$ & $Q$ & $\neg Q$ \\ \midrule
+ 0 & 0 & Last $Q$ & Last $\neg Q$ \\
+ 0 & 1 & 0 & 1 \\
+ 1 & 0 & 1 & 0 \\
+ 1 & 1 & 0 & 0 \\ \bottomrule
+\end{tabular}
+
+Her er det lidt et problem at have en state hvor både $Q$ og $\neg Q$ er 0.
+Dette giver jo ikke så meget mening.
+
+Det også tit en fordel at have en \emph{clock} så man kan bestemme hvornår værdier skal gemmes.
+Dette kan let implementeres med nogle NOR gates.
+
+\paragraph{D latch} udskifter $R$ og $S$ med en et enkelt input og en clock.
+Dette giver mening da man gemmer en værdi på $D$ ved at clock $C$, også er den gemt til man giver den en ny værdi.
+
+\begin{tabular}{ll|ll} \toprule
+ $C$ & $D$ & $Q$ & $\neg Q$ \\ \midrule
+ 0 & x & Last $Q$ & Last $\neg Q$ \\
+ 1 & 0 & 0 & 1 \\
+ 1 & 1 & 1 & 0 \\ \bottomrule
+\end{tabular}
+
+Her tilføjer man tit en \emph{edge triggering} så den kun gemmer når $C$ går fra høj til lav, eller omvendt.
+Dette giver en \textbf{D Flip-Flop} og er implementeret med to D latches.
+
+\paragraph{JK Flip-Flop} fungere som en SR latch men trigger på clock rise eller fall.
+Den har heller ikke problemet med at have en mærkelig state da output bliver flipped når $J=1$ og $K=1$.
+
+\section{Characteristic Equation}
+
+Her beskriver man sin Sequential kreds med en formel.
+Man kan beskrive en D Flip-Flop med:
+\begin{equation*}
+ \begin{split}
+ Q = D \\
+ Q_{n+1} = D_n
+ \end{split}
+\end{equation*}
+
+Eller en JK Flip-Flop med:
+\[
+ Q_{n+1} = J \cdot \neg Q_n + \neg K \cdot Q_n
+\]
+
+\section{State Automaton}
+
+Her har man en enhed hvor output, $O_n$, kan beskrives som følgende.
+\begin{equation*}
+ \begin{split}
+ Q_{n+1} = F(Q_n, I_n) \\
+ O_{n} = G(Q_n, I_n)
+ \end{split}
+\end{equation*}
+
+Her har man altså noget kombinatorisk logic før og efter en block memory, hvilket man kan bruge til at implementere ret avancerede ting.
+Her er det vigtigt at man tager højde for timing mellem disse blokke.
+
+Man kan implementere memory med \texttt{process} functionen i VHDL.