40
School of Engineerin g Synthetisierbares VHDL Regeln & Empfehlungen

School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

Embed Size (px)

Citation preview

Page 1: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Synthetisierbares VHDL

Regeln & Empfehlungen

Page 2: School of Engineering 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

Page 3: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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;

Page 4: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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.

Page 5: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Übung2, Aufgabe 3

Page 6: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

VHDL Kapitel 5 Zähler

Page 7: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

● Zähler ○ Grundprinzip○ Beispiel Dekadenzähler

● Umwandlungsroutinen● Ein Prozess Zähler● Up/Down Zähler● Zähler mit nicht gewichtetem Code

Inhalt

Page 8: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 9: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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)

Page 10: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

1

2 3

4

56

GegenwärtigerZustand

Folge-Zustand

Zustandsdiagramm des Würfel-Zählers

Page 11: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

1

2 3

4

56

Folge-Zustand

GegenwärtigerZustand

Zustandsdiagramm des Würfel-Zählers

Page 12: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

1

2 3

4

56

Folge-Zustand

GegenwärtigerZustand

Zustandsdiagramm des Würfel-Zählers

Page 13: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

QD

!Q

QD

!Q

QD

!Q

Q0

Q1

Q2

Takt

L0

L1

L2

Grundstruktur eines synchronen Zählers

Page 14: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Prozess mitKombinatorischer

Logik

comb_

Prozess mitgetakteter

Logik

reg_

cnt_gegenwart

cnt_folge

clk

reset

4

4

Prozesse des Zählers

Page 15: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 16: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 17: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 18: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 19: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Übung1

• RTL Diagram vom Code zeichnen• Mit getrennten Prozessen umschreiben• Synchronen Reset einfügen

Page 20: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Übung1- Lösung

Page 21: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Umwandlungsroutinen

Page 22: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 23: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 24: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 25: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Achtung: Nicht zusammen mit conv_std Routinen verwenden

IEEE numeric_std Konvertierungsroutinen

Page 26: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 27: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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)

Page 28: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Up/down Zähler

Page 29: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 30: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 31: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 32: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 33: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 34: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

Zähler mit nicht gewichteten Code

Page 35: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 36: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

0

0001

001

5

111

3

010

2

011

4

110

6

101

7

100

Zustand

Graycode

Zustandsdiagramm des Gray Zählers

Page 37: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 38: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

School ofEngineering

logik: Prozess

flip_flops:Prozess

gray_gegenwart

gray_folge

clk

reset

4

4

Prozesse des Gray Zählers

Page 39: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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

Page 40: School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen

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