diff options
Diffstat (limited to 'sem6/dig/m4')
-rw-r--r-- | sem6/dig/m4/Makefile | 2 | ||||
-rw-r--r-- | sem6/dig/m4/ex2.vhdl | 11 | ||||
-rw-r--r-- | sem6/dig/m4/ex3.vhdl | 2 | ||||
-rw-r--r-- | sem6/dig/m4/ex4.vhdl | 32 | ||||
-rw-r--r-- | sem6/dig/m4/noter.tex | 75 |
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. |