Upload
walburga-schnorr
View
107
Download
5
Embed Size (px)
Citation preview
School ofEngineering
Synthetisierbares VHDL
Regeln & Empfehlungen
School ofEngineering
Kombinatorische Prozesse
● GrundstrukturComb : PROCESS(<alle Eingänge der Logik>)
BEGIN<sequential statements>;
END PROCESS Comb;
● Regeln○ Alle Eingänge müssen in der Sensitivity Liste stehen○ „If“- , „case“ statements müssen auskodiert werden,
sonst werden Speicherelemente synthetisiert○ Kein „wait“-Statement○ Kein „clk‘event“ darf verwendet werden
● Sonderform: concurrent statement (direkte Zuweisung in der Architecture)x <= not a and b or c and not a;
○ Entspricht einem kombinatorischen Prozess mit den Eingängen a,b, cund wird vom Simulator genauso behandelt
School ofEngineering
Clocked Process
Der “Clocked Process” wird benutzt um die Funktionalität von flankengetriggerten Speicherelementen nachzubilden.
Grundform ohne Reset:DFF: process (clk)begin
if clk’event and clk=‘1’ thenq <= d;
end if;end process DFF;
Grundform mit Reset:DFF: process (clk,reset)begin
if reset=‘1’ thenq <= ‘0’;
elsif clk’event and clk=‘1’ then
q <= d;end if;
end process DFF;
School ofEngineering
Clocked Process (2)
Nicht synthetisierbare Varianten Verboten !!
DFF: process (clk)begin
if clk’event and clk=‘1’ and a=‘1’ then
q <= d;end if;
d <= d + 1;
end process DFF;
• Kein sequentielles statement ausserhalb der Taktflanken-Abfrage!• Die Abfrage der Taktflanke darf nicht mit einer anderen logischen Abfrage
verknüpft werden
Wichtig: Diese Konstrukte sind erlaubt in VHDL, werden aber von den Synthese-Tools nicht richtig interpretiert.
School ofEngineering
Übung2, Aufgabe 3
School ofEngineering
VHDL Kapitel 5 Zähler
School ofEngineering
● Zähler ○ Grundprinzip○ Beispiel Dekadenzähler
● Umwandlungsroutinen● Ein Prozess Zähler● Up/Down Zähler● Zähler mit nicht gewichtetem Code
Inhalt
School ofEngineering
1
2 3
4
56
Ein Zähler ist eine Schaltung, die nach einem Taktimpuls von einemAusgangszustand in einen vorbestimmten anderen Zustand übergeht
Definition des Zählers
School ofEngineering
QD
!Q
QD
!Q
QD
!Q
Q0
Q1
Q2
Takt
L0
L1
L2
RTL Beschreibung eines synchronen Zählers (RTL = Register Transfer Level)
School ofEngineering
1
2 3
4
56
GegenwärtigerZustand
Folge-Zustand
Zustandsdiagramm des Würfel-Zählers
School ofEngineering
1
2 3
4
56
Folge-Zustand
GegenwärtigerZustand
Zustandsdiagramm des Würfel-Zählers
School ofEngineering
1
2 3
4
56
Folge-Zustand
GegenwärtigerZustand
Zustandsdiagramm des Würfel-Zählers
School ofEngineering
QD
!Q
QD
!Q
QD
!Q
Q0
Q1
Q2
Takt
L0
L1
L2
Grundstruktur eines synchronen Zählers
School ofEngineering
Prozess mitKombinatorischer
Logik
comb_
Prozess mitgetakteter
Logik
reg_
cnt_gegenwart
cnt_folge
clk
reset
4
4
Prozesse des Zählers
School ofEngineering
LIBRARY ieee;
USE ieee.std_logic_1164.all;USE ieee.numeric_std.all;
ENTITY zaehl_einfach ISPORT( clk,reset : IN std_logic;
cnt_out : OUT std_logic_vector(3 downto 0));END zaehl_einfach;
Paket mit arithmetischen Funktionen
Paket mit std_logic, std_logic_vector
Grundprinzip des Zählers in VHDL
School ofEngineering
ARCHITECTURE rtl OF zaehl_einfach IS
SIGNAL cnt_folge: INTEGER range 0 TO 15; SIGNAL cnt_gegenwart: INTEGER range 0 TO 15;
BEGINlogik : PROCESS(cnt_gegenwart)BEGIN
cnt_folge <= cnt_gegenwart + 1 ;END PROCESS logik;
flip_flops : PROCESS(clk, reset)
BEGINIF reset = '1' THEN
cnt_gegenwart <= 0;ELSIF clk'EVENT AND clk = '1' THEN
cnt_gegenwart <= cnt_folge ;END IF;
END PROCESS flip_flops;
cnt_out <= std_logic_vector(to_unsigned(cnt_gegenwart,4));
END rtl;
UmwandlungInteger zu
Vektor+
ZuweisungZwischen-Signal zum
Ausgangssignal
Logik:Process
Takt:Process
Grundprinzip des Zählers in VHDL
School ofEngineering
Aufgabenstellung:
1. Der Zähler soll 4-bit breit sein.2. Bei Reset soll der Zähler synchron auf den Hexadezimalwert
0x5 gesetzt werden.3. Die Zählfolge ist 0->1->2->3..9->0
Beispiel: Dekadenzähler
School ofEngineering
ARCHITECTURE RTL of DekadenZaehlerSIGNAL cnt_folge, cnt_gegenwart: integer range 0 to 9;
BEGIN comb_logik : PROCESS(cnt_gegenwart,reset)
BEGIN IF reset = '1' THEN
cnt_folge <= 5 ;ELSE
IF cnt_gegenwart < 9 THENcnt_folge <= cnt_gegenwart + 1 ;
ELSEcnt_folge <= 0;
END IF;END IF;
END PROCESS comb_logik; reg_flip_flops : PROCESS(clk)
BEGINIF clk'EVENT AND clk = '1' THEN
cnt_gegenwart <= cnt_folge ;END IF;
END PROCESS reg_flip_flops;END ARCHITECTURE RTL:
Handelt es sich hier um einen synchronen oder asynchronen Reset ?
Beispiel: Dekadenzähler
School ofEngineering
Übung1
• RTL Diagram vom Code zeichnen• Mit getrennten Prozessen umschreiben• Synchronen Reset einfügen
School ofEngineering
Übung1- Lösung
School ofEngineering
Umwandlungsroutinen
School ofEngineering
signal cnt_out : std_logic_vector(3 downto 0));
signal cnt : integer RANGE 0 to 15;
integerEingangswert
std_logic_vectorAusgangswert
Umwandlungsfunktionen(Aufruf von 2 Subroutinen)
cnt_out <= std_logic_vector(to_unsigned(cnt,4));
Anzahl bits zur Umwandlung
std_logic_vector2 Konvertierungsroutinen:
IntegerUnsignedstd_logic_vectorinteger
LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;
Umwandlung von Type integer in Type std_logic_vector
School ofEngineering
ARCHITECTURE RTL OF DekadenZaehlerSIGNAL cnt_folge: INTEGER RANGE 0 to 15 ; SIGNAL cnt_gegenwart: INTEGER RANGE 0 to 15;
BEGINlogik : PROCESS (cnt_gegenwart)BEGIN
cnt_folge <= cnt_gegenwart + 1 ;END PROCESS logik;
flip_flops : PROCESS (clk, reset) BEGIN
IF reset = '1' THENcnt_gegenwart <= 0;
ELSIF clk'EVENT AND clk = '1' THENcnt_gegenwart <= cnt_folge ;
END IF;END PROCESS flip_flops;
cnt_out <= std_logic_vector(to_unsigned(cnt_gegenwart,4));END ARCHITECTURE rtl;
Handelt es sich hier um einen synchronen oder asynchronen Reset
Achtung:Einschränken mit Range, daSonst Synthesizer unnötigviele FF zuteilt
Beispiel am Dekadenzähler
School ofEngineering
ARCHITECTURE rtl OF DekadenZaehler IS SIGNAL cnt_folge : unsigned (3 downto 0); SIGNAL cnt_gegenwart : unsigned (3 downto 0);CONSTANT increment : natural range 0 to 3 :=1;
BEGIN logik : PROCESS (cnt_gegenwart) BEGIN cnt_folge <= cnt_gegenwart + increment ;
END PROCESS logik; flip_flops : PROCESS (clk, reset) BEGIN IF reset = '1' THEN cnt_gegenwart <= “0000“; ELSIF clk'EVENT AND clk = '1' THEN cnt_gegenwart <= cnt_folge ; END IF; END PROCESS flip_flops; cnt_out <= std_logic_vector(cnt_gegenwart);END ARCHITECTURE rtl;
Dekadenzähler Alternative mit Datentyp Unsigned
School ofEngineering
Achtung: Nicht zusammen mit conv_std Routinen verwenden
IEEE numeric_std Konvertierungsroutinen
School ofEngineering
cnt <= to_integer(signed(data));
Convertierung std_logic_vector -> signed
Convertierung signed -> integer
Eingang: std_locic_vector
Ausgang: Integer
Umgekehrte Umwandlung:std_logic_vector in Integer
School ofEngineering
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY counter IS
PORT (clk, reset : IN std_logic;
cnt_out : OUT std_logic_vector(3 downto 0));
END counter;
ARCHITECTURE rtl OF counter IS
SIGNAL cnt: integer range 0 to 9;
BEGIN
cnt_out <= cnt;
cntr : PROCESS (clk, reset)
BEGIN
IF reset = '1' THEN
cnt <= 0 ;
ELSIF clk'EVENT AND clk = '1' THEN
cnt <= cnt + 1 ;
END IF;
END PROCESS cntr;
cnt_out <= std_logic_vector(to_unsigned(cnt, 4));END rtl;
Zähler mit einem Prozess
Takt und Logikin einem Prozess
(möglichst vermeiden)
School ofEngineering
Up/down Zähler
School ofEngineering
29
0
00001
0001
5
0101
3
0011
2
0010
4
0100
6
0110
9
1001
Up = 0
Up = 1
Vorwärts/Rückwärtszähler
School ofEngineering
IF reset = '1' THENcnt_folge <= 0;
ELSE IF up = '1' THEN
IF cnt_gegenwart < 9 THENcnt_folge <= cnt_gegenwart + 1 ;
ELSEcnt_folge <= 0;
END IF;ELSE
IF cnt_gegenwart > 0 THENcnt_folge <= cnt_gegenwart - 1 ;
ELSEcnt_folge <= 9;
END IF;END IF;
END IF;
Geschachtelte if-else statements beimup/down counter
School ofEngineering
IF reset = '1' THENcnt_folge <= 0;
ELSE IF up = '1' THEN
IF cnt_gegenwart < 9 THENcnt_folge <= cnt_gegenwart + 1 ;
ELSEcnt_folge <= 0;
END IF;ELSE
IF cnt_gegenwart > 0 THENcnt_folge <= cnt_gegenwart - 1 ;
ELSEcnt_folge <= 9;
END IF;END IF;
END IF;
Geschachtelte if-else statementsbeim up/down counter
School ofEngineering
IF reset = '1' THENcnt_folge <= 0;
ELSE IF up = '1' THEN
IF cnt_gegenwart < 9 THENcnt_folge <= cnt_gegenwart + 1 ;
ELSEcnt_folge <= 0;
END IF;ELSE
IF cnt_gegenwart > 0 THENcnt_folge <= cnt_gegenwart - 1 ;
ELSEcnt_folge <= 9;
END IF;END IF;
END IF;
Geschachtelte if-else statementsbeim up/down counter
School ofEngineering
A[3..0]
B[3..0]OUT[3..0]
ADDER
A[4..0]
B[4..0]
OUT[4..0]
ADDER
SELDATAA
DATABOUT0
MUX21
D QPRE
ENA
CLR
A[3..0]
B[3..0]OUT
LESS_THAN
A[3..0]
B[3..0]OUT
LESS_THAN
SELDATAA
DATABOUT0
MUX21
SELDATAA
DATABOUT0
MUX21
SELDATAA
DATABOUT0
MUX21
cnt_gegenwart[3..0]
LessThan0
4' h9 -- cnt_folge~[3..0]
4' h0 --
cnt_folge~[7..4]
4' h9 --
up
cnt_out[3..0]
Add0
4' h1 --
resetclk
LessThan1
4' h0 --
cnt_folge[3..0]
4' h0 --
cnt_folge~[11..8]
Add1
1' h1 --
5' h1D --
Mux Diagramm UP-Down Zähler
School ofEngineering
Zähler mit nicht gewichteten Code
School ofEngineering
N Q(2) Q(1) Q(0) N+1 Q(2) Q(1) Q(0)
0 0 0 0 -> 1 0 0 1
1 0 0 1 -> 2 0 1 1
2 0 1 1 -> 3 0 1 0
3 0 1 0 -> 4 1 1 0
4 1 1 0 -> 5 1 1 1
5 1 1 1 -> 6 1 0 1
6 1 0 1 -> 7 1 0 0
7 1 0 0 -> 0 0 0 0
Zustandsfolgetabelle Zähler in Graycode
School ofEngineering
0
0001
001
5
111
3
010
2
011
4
110
6
101
7
100
Zustand
Graycode
Zustandsdiagramm des Gray Zählers
School ofEngineering
37
.q.d
.q.d
.q.d
gray_out(0)
gray_out(1)
gray_out(2)
clk
L0
L1
L2
.ar
.ar
.ar
reset
gray_gegenwart(0)
gray_folge(0)
gray_folge(1)
gray_folge(2)
gray_gegenwart(1)
gray_gegenwart(2)
GegenwärtigerZustand
Folge Zustand
Blockschaltplan Gray Zähler
School ofEngineering
logik: Prozess
flip_flops:Prozess
gray_gegenwart
gray_folge
clk
reset
4
4
Prozesse des Gray Zählers
School ofEngineering
39
gray_logic: PROCESS (gray_gegenwart) BEGIN
CASE gray_gegenwart ISWHEN "000" => gray_folge <= "001";WHEN "001" => gray_folge <= "011";WHEN "011" => gray_folge <= "010";WHEN "010" => gray_folge <= "110";WHEN "110" => gray_folge <= "111";WHEN "111" => gray_folge <= "101";WHEN "101" => gray_folge <= "100";WHEN OTHERS => gray_folge <= "000";
END CASE;
END PROCESS gray_logic;
GegenwärtigerZustand
Folge Zustand
Logik Process des Gray Zähler
School ofEngineering
40
ARCHITECTURE rtl OF graycnt ISsignal gray_gegenwart: std_logic_vector(2 downto 0)signal gray_folge: std_logic_vector(2 downto 0);
BEGINgray_out <= gray_gegenwart ;count: PROCESS (clk, reset) BEGIN
IF reset = '1' THENgray_gegenwart <= "000";
ELSIF clk'EVENT AND clk = '1' THENgray_gegenwart <= gray_folge;
END IF;
END PROCESS count;
GegenwärtigerZustand
Folge Zustand
Getakteter Process des Gray Zählers