School ofEngineering
● Einen Zähler generisch aufbauen● CPLD Synthese● Timing Analyse● PIN Zuweisungen fixieren
Inhalt
School ofEngineering
Generic
School ofEngineering
Generic in Entity
ENTITY zaehl_generic ISGENERIC (width : natural := 5); PORT( clk,reset : IN std_logic; cnt_out : OUT std_logic_vector(width-1 downto 0) );END zaehl_generic;
ARCHITECTURE rtl OF zaehl_generic IS
SIGNAL cnt_folge: unsigned(width-1 downto 0); SIGNAL cnt_gegenwart: unsigned(width-1 downto 0);
BEGIN logik : PROCESS(cnt_gegenwart) BEGIN cnt_folge <= cnt_gegenwart + 1 ; END PROCESS logik; flip_flops : PROCESS(clk, reset) BEGIN IF reset = '1' THEN
cnt_gegenwart <= to_unsigned(0,width); 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 rtl;
Default Wert
School ofEngineering
Generic eine Hierarchie höher
instance1: zaehl_generic
GENERIC MAP (width => 50)
PORT MAP(clk => clk50,reset => rst,cnt_out => out_vector);
COMPONENT zaehl_genericGENERIC (width : natural );PORT (clk,reset : IN std_logic;
cnt_out : OUT std_logic_vector(width-1 downto 0); div_out : OUT std_logic); END COMPONENT;
School ofEngineering
Prozess mitKombinatorischer
Logik
comb_
Prozess mitgetakteter
Logik
reg_
cnt_gegenwart
cnt_folge
clk
reset
4
4
Ausgangszuweisung
cnt_out
cnt_out <= std_logic_vector(cnt_gegenwart);
PORT( clk,reset : IN std_logic; cnt_out : OUT std_logic_vector(width-1 downto 0) );
School ofEngineering
CPLD Synthese
School ofEngineering
Zaehler Einfach
ENTITY zaehl_generic ISGENERIC (width : positive := 4); PORT( clk,reset : IN std_logic; cnt_out : OUT std_logic_vector(width-1 downto 0) );END zaehl_generic;
ARCHITECTURE rtl OF zaehl_generic IS
SIGNAL cnt_folge: unsigned(width-1 downto 0); SIGNAL cnt_gegenwart: unsigned(width-1 downto 0);
BEGIN logik : PROCESS(cnt_gegenwart) BEGIN cnt_folge <= cnt_gegenwart + 1 ; END PROCESS logik; flip_flops : PROCESS(clk, reset) BEGIN IF reset = '1' THEN
cnt_gegenwart <= to_unsigned(0,width); 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 rtl;
School ofEngineering
RTL Diagramm zaehler_einfach
A[3..0]
B[3..0]OUT[3..0]
ADDER
D QPRE
ENA
CLR
Add0
4' h1 --
cnt_gegenwart[3..0]
clkreset
cnt_out[3..0]4’h1
School ofEngineering
Ein Logic Element im MAXII
School ofEngineering
Technology Map von zaehler_einfach
!ACLR
CLK
DATAA
REGOUT
LOGIC_CELL (5555) !ACLR
CLK
DATAC
DATAD
REGOUT
LOGIC_CELL (0FF0)
!ACLR
CLK
DATAB
DATAC
DATAD
REGOUT
LOGIC_CELL (3CCC)
!ACLR
CLK
DATAA
DATAB
DATAC
DATAD
REGOUT
LOGIC_CELL (6AAA)
cnt_gegenwart[0]
cnt_gegenwart[1]
cnt_gegenwart[3]
clkreset
cnt_out[0]
cnt_out[1]
cnt_out[2]
cnt_out[3]cnt_gegenwart[2]
School ofEngineeringTechnology Map von zaehler_einfach
(Hierarchien expandiert)
cnt_gegenwart[3]
cnt_gegenwart[2]cnt_gegenwart[1]
cnt_gegenwart[0]
DATAA
DATAB
DATAC
DATAD
OUT
SUM_LUT (6AAA)
D
ENA
QPRE
CLRDATAB
DATAC
DATAD
OUT
SUM_LUT (3CCC)
D
ENA
QPRE
CLR
DATAA OUT
SUM_LUT (5555)
D
ENA
QPRE
CLR
DATAC
DATADOUT
SUM_LUT (0FF0)
D
ENA
QPRE
CLR
S
S
S
S
clkreset
cnt_out[0]
cnt_out[1]
cnt_out[2]
cnt_out[3]
School ofEngineering
Ein Logic Element im MAXII
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;
Up/down counter
School ofEngineering
Mux Diagramm UP-Down Zähler
-1
9
1
0
9
0
0
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;
ELSEIF cnt_gegenwart > 0 THENcnt_folge <= cnt_gegenwart - 1 ;
ELSEcnt_folge <= 9;END IF;
END IF;END IF;
School ofEngineering
Timing Analyse
School ofEngineering
1 2
21
tsu
Q
D
CLK
th
Minimal benötigte Setup ZeitMinimal benötigte Hold Zeit
Fenster in dem Datenstabil sein müssen
Setup und Hold Zeiten beim D-FF
School ofEngineering
QD
!Q
QD
!Q
CLK
tPDCLKQ-cnt_gegenwart(1) + tPD-Logic + tSU-cnt_gegenwart(3) + tPD-VerbindungTperiod-max =
fmax = Tperiod-max
1
FF:cnt_gegenwart(1) FF:cnt_gegenwart(3)
Nur ein Ausschnitt des Zählers gezeigt!
Berechnen der Maximalen Taktfrequenz eines Zählers
School ofEngineering
QD
!QCLK
Q1 Ausgangs-Pin
tcoCPLD = tpdCLKBUF + tcoFLIP-FLOP + tpdLOGIK
tpdCLKBUF
tpdLOGIK
tcoFLIP-FLOP
Propagation Delay am CPLD Ausgang (tco)
School ofEngineering
QD
!Q
QD
!QCLK1 CLK2
cnt_out(0)
cnt_out(1)cnt_gegenwart(1)
cnt_gegenwart(0)CLK
Nur ein Ausschnitt des Zählers gezeigt!
Timing Analyse von clk zu cnt_out
School ofEngineering
QD
!Q
QD
!Q
Q1 Q2
FF1
CLK
tsetup
CLK
D1
D2
D2D1 QD
!Q
FF1
QD
!Q
FF2
Flanke 1)(Launch Clock)
Flanke 2)(Latch Clock)
Die SETUP Zeit beim Verschalten von CPLDs
CPLD Eingangspin
School ofEngineering
QD
!QCLK
D2Eingangs-Pin
tsuCPLD = tsuFLIP-FLOP + tpdLOGIK
tsuFLIP-FLOP
tpdLOGIK
Set Up Zeit am CPLD Eingang (tSU)
School ofEngineering
QD
!Q
QD
!Q
Q1 Q2
FF1
CLK
thold
CLK
Q1
D2
D2D1 QD
!Q
FF1
QD
!Q
FF2
Flanke 1) Flanke 2)
Q2
tlogic
Logic
thold
tlogic
Verfügbare HOLD Zeit für CPLD Eingang
CPLD Eingangspin
School ofEngineering
QD
!QCLK
D2Eingangs-Pin
thFLIP-FLOP tpdLOGIK
thCPLD = thFLIP-FLOP - tpdLOGIK
Hold Zeit am CPLD Eingang
School ofEngineering
Timing Analyse Up/Down Counter
School ofEngineering
PIN Zuweisungen Fixieren
School ofEngineering
Erstellen von Pin Zuweisungen
● Synthetisieren Sie ein erstes Mal● Führen Sie eine Backannotation durch:
Assignments Backannotate● Speichern Sie das Projekt File Save Project● Öffnen Sie den Assignment Editor: Assignments Pins● Editieren Sie die Pins entsprechend dem PCB Board● Kompilieren sie noch einmal und kontrollieren sie
die Pin Assignments mit Assignments pins● Abspeichern als TCL Datei: Project Generate TCL File
for Project● Laden der TCL Datei: Tools TCL scripts