School of Engineering Synthetisierbares VHDL Regeln & Empfehlungen.

Post on 06-Apr-2015

108 views 5 download

transcript

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