Högskolan Dalarna Elektroteknik LABORATION LABORATIONSINSTRUKTION Sekvensnät med VHDL KURS Digitalteknik LAB NR Ver9 5 INNEHÅLL. Kaskadkopplad räknare 2. Elektronisk tärning NAMN KOMMENTARER PROGRAM/KURS UTFÖRD GODKÄND SIGN
Laboration nr 5 Digitalteknik Innehåll: Syfte: Konstruktion av sekvensiella nät med VHDL Att få kunskap och praktisk efarenhet av: grafiskt gränssnitt för strukturell VHDL principen för kaskadkopplade räknare beskrivning av ett sekvensnät av Moore-typ med VHDL simulering av digitala konstruktioner realisering (programmering) av VHDL-konstruktioner i en CPLD dokumentation Kaskadkopplade räknare För att konstruera räknare som innehåller flera siffror använder man ofta kaskadkoppling. Kaskadkoppling innebär att räknaren delas upp i ett antal separata räknare, t.ex. entalstiotals-, hundratalsräknare, där varje räknare ger en signal när den har räknat till sitt slutvärde. Signalen används för att göra nästa räknare enable under en klockperiod och man kan lätt göra räknare med godtyckligt många siffror. Anledningen till att man inte kan göra räknare med många siffror direkt är att logiken växer dramatisk med antalet räknarsteg. I läroboken finns exempel som visar principen för en kaskadkopplad räknare på sidan 262, studera figuren. En nackdel med kaskadkopplade räknare är att räknarens snabbhet minskar med antalet kaskadkopplade räknesteg. Orsaken är att varje gång enablesignalen aktiverar nästa räknare så används kombinatorisk logik efter räknarens registerutgångar och det innebär en extra tidsfördröjning. För en 3-siffrig dekadräknare blir den största fördröjningen varje gång räknaren ökar -tals-siffran (t.ex.99 till ) eftersom då måste två enablesignaler aktiveras innan -tals siffran kan ändras. Det kan verka onödigt att ta hänsyn till detta men för en tresiffrig dekadräknare kan det innebära att räknehastigheten minskar från MHz för entalssiffran till 5 MHz på hundratalssiffran. Den maximala räknehastigheten för hela räknaren blir naturligtvis bara 5 MHz vilket är en rejäl försämring. Ett sätt att undvika den extra fördröjningen är att avkoda räknevärdet innan slutvärdet dvs värdet (8) för en dekadräknare och att använda det avkodade värdet som insignal till en extra D-vippa. Utsignalen från den extra D-vippan erhålles direkt efter nästa klockflank, dvs på räknevärdet (9), och utsignalen används för att göra nästa räknare enable. Metoden innebär att den extra tidsfördröjningen försvinner och att alla siffrorna i räknaren kan klockas med samma frekvens. Med en trebitars dekadräknare enligt förutsättningarna ovan innebär det att två extra D-vippor alltså fördubblar räknehastigheten. Metoden kallas för pipelining och den används ofta i datorer i liknande sammanhang. Ofta är programvarorna som gör syntesen mycket effektiva och beräknar själv den optimala lösningen. För en enkel räknare är det knappast troligt att räknehastigheten blir högre om man gör en egen pipelining. Lab 5 - - pls
På laborationen ska en 3-siffrig dekadräknare simuleras och testas med utvecklingskortet till CoolRunner. Räknaren ska enbart kunna räkna uppåt. På kortet finns 4 sifferdisplayer och 3 av dem ska användas för att visa räknevärdet som kommer att variera från till 999. Eftersom sifferdisplayen är multiplexerad krävs ytterligare en del elektronik som finns klar i laborationsbeskrivningen. Räknaren ska ha anslutningar enligt figuren nedan. en clk resetn cnt_dec cnt_dec cnt_dec ones tens hdrs De färdiga rutinerna och anslutningarna till CPLD:en framgår av schemat: Anslutningar: clk till stift 38 resetn till stift 94 transistors till stift 3,29,28,26 led till stift 56,53,6,58,57,54,6 Modulerna: clock_divider delar ner systemklockans MHz till en passande frekvens. cnt_4 ger adressignaler,,, som styr mux:en, ger även signaler till transistorerna,,, i samma takt. mux4 väljer rätt siffra, ones, tens, hdrs som ska visas på sifferdisplayen. hex2led omvandlar siffran till 7-segmentkod. Uppgift Kopiera koderna för de färdiga modulerna, generera schemasymboler. Skriv en modul för en dekadräknare och använd den tre gånger för att göra den tresiffriga dekadräknaren. Simulera modulen och övertyga dig om att den gör rätt innan du kopplar ihop den med de övriga. Tips för simuleringen finns i slutet av laborationen. Redovisning Redovisa uppgiften med schemaritning, antal använda makroceller, register etc (från Fitter report), väsentliga data från timing report och eventuellt egna kommentarer. Redovisa i ett Word-dokument med typsnittet Courier på passande ställen. Frivillig uppgift: Gör en styrbar 999-räknare som kan räkna uppåt/nedåt! Lab 5-2 - pls
2. Elektronisk speltärning (sekvenskrets) Uppgift: Konstruera en elektronisk speltärning beskriven av nedanstående tillståndsdiagram. Tärningen utförs som ett synkront sekvensnät av Moore-typ innehållande totalt 7 nyttiga tillstånd S-S7. S är start- eller resettillståndet med utsignalen, dvs alla ögon släckta. S2-S7 utgör de normala räknetillstånden för tärningen. Asynkr. reset S GOn S2 S7 6 S3 2 S6 S4 5 S5 3 4 Då insignalen GOn (obs tag bort strecket ovanför GOn i figuren) aktiveras skall tärningen räkna modulo-6 enligt tillståndsgrafen ovan tills GOn deaktiveras varvid tärningen stannar och visar värdet av tärningskastet. Resultatpresentationen sker med 7 st. lysdioder arrangerade som ögonen på en tärning enligt figuren nedan. Synkronisera insignalen GOn med en D-vippa. Tabellen anger hur resp. LED skall aktiveras beroende av tärningsvärdet. L L2 L3 L4 L5 L6 L7 LLLLLLL 234567 2 3 4 5 6 Vid laborationstillfället finns en färdig modul med lysdioder och motstånd. Lysdiderna är kopplade så att de tänds av en låg nivå från CPLD:n. Undersök hur modulen är kopplad innan du bestämmer vilka pinnar som ska användas på CPLD-kretsen. Som klocksignal till tärningen kan systemklockan frekvens delad till ca Hz användas. Redovisning: På ett bra sätt. Lab 5-3 - pls
Färdiga moduler för 999-räknaren: -- Engineer: pls -- Create Date: 3:: 9/27/2 -- Module Name: clock_divider - rtl use IEEE.STD_LOGIC_64.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity clock_divider is port(clk_in,resetn: in std_logic; en_div_clk: out std_logic); end clock_divider; architecture rtl of clock_divider is signal cnt_b: std_logic_vector(6 downto ); process(clk_in,resetn) if resetn='' then cnt_b<= ""; elsif clk_in='' and clk_in'event then cnt_b<= cnt_b +; end if; end process; en_div_clk<='' when cnt_b="" else ''; -- Engineer: pls -- Create Date: 3:5:24 9/27/2 -- Module Name: cnt_4 - rtl use IEEE.STD_LOGIC_64.ALL; use IEEE.STD_LOGIC_unsigned.ALL; entity cnt_4 is port(clk,resetn: in std_logic; cnt4: out std_logic_vector( downto ); transistors: out std_logic_vector(3 downto )); end cnt_4; architecture rtl of cnt_4 is signal cnt4_b: std_logic_vector( downto ); process(clk,resetn) if resetn='' then cnt4_b<=""; elsif rising_edge(clk) then cnt4_b<=cnt4_b+; end if; end process; cnt4<=cnt4_b; transistors<= "" when cnt4_b="" else "" when cnt4_b="" else "" when cnt4_b="" else ""; Lab 5-4 - pls
-- Engineer:pls -- Create Date: 3:43:7 9/27/2 -- Module Name: mux4 - rtl use IEEE.STD_LOGIC_64.ALL; entity mux4 is port(one,ten,ths: in std_logic_vector(3 downto ); mux_adr: in std_logic_vector( downto ); bcd: out std_logic_vector(3 downto )); end mux4; architecture rtl of mux4 is bcd<= one when mux_adr="" else ten when mux_adr="" else ths when mux_adr="" else ""; -- Module Name: hex2led - rtl -- Target Devices: CoolRunner -- Description: -- segment encoding -- -- --- -- 5 -- --- <- 6 -- 4 2 -- --- -- 3 use IEEE.STD_LOGIC_64.ALL; entity hex2led is port( HEX: in STD_LOGIC_VECTOR (3 downto ); LED: out STD_LOGIC_VECTOR (6 downto )); end hex2led; architecture rtl of hex2led is with HEX SELect LED<= "" when "", -- "" when "", --2 "" when "", --3 "" when "", --4 "" when "", --5 "" when "", --6 "" when "", --7 "" when "", --8 "" when "", --9 "" when "", --A "" when "", --b "" when "", --C "" when "", --d "" when "", --E "" when "", --F "" when others; -- Lab 5-5 - pls