1 Digitalteknik, fortsättningskurs Föreläsning 2-2012 VHDL Very High Speed Integrated Circuit Hardware Description Language VHDL = VHSIC Hardware Description Language VHSIC = Very High Speed Integrated Circuit
VHDL & Verilog : Två HDL språk för hårdvarukonstruktion VHDL. Syntaxen liknar programmeringsspråket ADA. VHDL standardiserades 1987 IEEE Standard VHDL Language Reference Manual. Utges av IEEE. Verilog. Ursprung CAD-industrin. Språken har likartade modelleringsmöjligheter men olika syntax. Utökning av VHDL för analoga kretsar: - VHDL-AMS (VHDL- Analog Mixed Signal ) - Verilog-A, Verilog-AMS
Hårdvarubeskrivande språk VHDL, Verilog : RTL-nivå & Grind-nivå. För ASIC, FPGA, CPLD. SystemC : Klassbibliotek till C++. Möjliggör högre abstraktionsnivå än VHDL ( Transaction-Level Modelling ) SystemVerilog : Ursprung Verilog. Beskrivning/Specifikation/ Dokumentation av hårdvara. Simulering av hårdvara. Syntes av hårdvara.
Beskrivningar i VHDL Struktur och beteende Strukturbeskrivning VHDL koden beskriver systemet såsom en samling sammankopplade komponenter. Kan vara hierarkisk eller flat. Beteendebeskrivning VHDL koden beskriver funktionen på systemet eller komponenten, utan att beskriva strukturen på densamma. Struktur och beteende kan blandas i samma VHDL beskrivning. Struktur : Närmare realiseringen. Beteende : Mindre mängd detaljer. Medger snabbare simulering och modellering på högre abstraktionsnivå. 4
5 Entity ENTITY fulladder IS PORT(A:IN STD_LOGIC; B:IN STD LOGIC; Cin:IN STD LOGIC; S:OUT STD_LOGIC; Cout:OUT STD_LOGIC); END fulladder; Entiteten beskriver portarna mot omvärlden för kretsen.
6 Architecture ARCHITECTURE behave OF and2 IS BEGIN Cout<= (A and B) or (A and Cin) or (B and Cin); S<=A xor B xor Cin END behave; Architecture beskriver funktionen inuti kretsen.
7 Varför VHDL? VHDL används för att kunna kontrollera att man har kopplat rätt genom att simulera kretsen Kunna beskriva stora konstruktioner på ett enkelt sätt och sedan generera kretsen genom syntes Möjliggör strukturerade beskrivningar av en krets VHDL öka abstraktionsnivån
8 VHDL Ett starkt typat språk Signaler modelleras m.h.a. olika datatyper, t.ex. bit, har värdet 0 eller 1, (används sällan) bit_vector, flera bitar ( 0000, 1111 används sällan) std_logic, används normalt för att representera en digital signal type std_logic is ( U, X, 0, 1, Z, W, L, H, - ) std_logic_vector, används för bussar (tex. 01010101, UUUUUUUU, ZZZZZZZZ, etc). Är en vektor med element av typen std_logic. Type: std_logic_vector is array (NATURAL range <>) of std_logic
VHDL basics cont. Enumeration types cont. Standard logic unsigned Resten av raden är kommentar TYPE std_ulogic IS ( U, -- uninitialized X, -- forcing unknown 0, -- forcing zero 1, -- forcing one Z, -- high impedance W, -- weak unknown L, -- weak zero H, -- weak one - ); -- don t care Relevant för simulering Relevant för compilatorn Tecken saknar betydelse för enstaka bitar Standard logic är vår rekomindation för alla binära signaler
10 VHDL Ett starkt typat språk boolean (false,true) integer (2 komplement representation, tex. -66, 134, 645533, -899) Signed, unsigned Character ( A, B, C,.., 0, 1, 2,.) Uppräkningstyper, tex. type states is (S1,S2,S3,S4);
VHDL bibliotek. Kompilerade VHDL-komponenter lagras default i WORK biblioteket. WORK är ett symboliskt namn. Ofta döper man också katalogen till work. Biblioteken WORK och STD är alltid synliga för kompilatorn. Andra bibliotek som skall användas måste specificeras. Detta göres i koden före de delar som vill använda dem. Tex: library My_Lib; use My_Lib.Mina_Typer.ALL; 11
12 VHDL Hierarkin
13 VHDL std_logic. Typen std_logic finns definierad i paketet IEEE Dessa båda rader skall alltid finnas före varje entity som använder typen för att std_logic skall kunna användas: Library IEEE; use IEEE.std_logic_1164.all;
14 VHDL use ieee.std_logic_unsigned.all Då kan vanliga aritmetiska operatorer (tex +, -, * ) användas för std_logic typer. Motsvarande för tal med tecken: byt mot signed. S <= A+B; (resultatet får inte överskrida vektorns område) S,A och B är av typen std_logic_vector,
15 VHDL Signaltilldelningar Följande tilldelningar är också tillåtna a <= B 110010 -- identisk med 110010 b <= X A32F -- hex-tal, endast bitvektor f <= O 725 -- oktalt tal, end. bitvektor är vektorerna definierade med std_logic måste en konverteringsfunktion användas: f <= std_logic_vector (X A32F )
16 VHDL Signaltilldelningar Aggregate signal a,b : std_logic_vector (7 downto 0); a <= (others => 0 ); -- identiskt med följande a <= 00000000 ;
17 Parallellt - sekventiellt a b x y begin x <= a; y <= b; x <= b; -- fel end; begin p0 : process (a,b) is begin x <= a; y <= b; x <= b; end process p0; end; a b x y
18 VHDL std_ulogic Det resulterande värdet hos en signal av typen std_logic bestäms av en resolveringsfunktion ( resolved i subtype deklarationen ovan), vilken i detta fall finns definierad i paketet ieee.std_logic_1164.
19 begin with cntrl select -- en 4/1 multiplexer ut <= a when 00, b when 01, c when 10, d when 11, X when others; end; Parallellt - sekventiellt begin p0 : process (cntrl,a,b,c,d) is begin case cntrl is when 00 => ut<= a; when 01 => ut <= b; when 10 => ut <= c; when 11 => ut <= d; when others => ut<= X ; end case; end process p0; end; ut
20 Parallellt satser. When-satsen. begin -- en 2/4 avkodare z <= 0001 when a = 00 else 0010 when a = 01 else 0100 when a = 10 else 1000 when a = 11 else XXXX ; end;
21 Sekventiell VHDL (If-satsen) If-satser kan användas i den sekventiella delen av VHDL De får inte placeras i den parallella delen av VHDL-koden syntaxen är IF villkor THEN sats(er); ELSE andra sats(er); END IF; en process i VHDL innehåller sekventiella satser (I parallell VHDL används when else i stället )
22 Sekventiell VHDL (If-satsen) If sats, med fler villkor syntaxen är IF villkor THEN sats(er); ELSE IF nytt villkor THEN andra sats(er); END IF; END IF; Varje if avslutas med end if; else if kan sammanskrivas som elsif elsif får inte avslutas med end if;
23 Implicit memory Process (Sel, x2) begin if Sel = 1 then f <= x2; endif; end process; Om Sel < > 1 så behålls det gamla värdet på f! p0 : process (LD, D) is begin if (LD = 1 ) then Q <= D; end if; end process p0;
24 För syntesen Vippor IF Clk'EVENT AND Clk='1' THEN end if;
p0 : process (Reset,Clk) is begin IF Reset = 0' THEN Q <= '0'; VHDL En flank-triggad D-vippa med asynkron reset ELSIF Clk'EVENT AND Clk='1' THEN Q <= D; END IF; end process p0; Clk D 25 Q
-- Synkron Reset p0 : PROCESS (Clk) IS BEGIN IF Clk'EVENT AND Clk='1' THEN IF Reset = '1' THEN -- Kod som sätter systemet i ett -- väldefinierat tillstånd ELSIF -- Det som ska göras! END IF; END PROCESS p0; 26
27 library ieee; use ieee.std_logic_1164.all; entity reg is generic (n : NATURAL := 4); port (D : in std_logic_vector (n-1 downto 0); Clk, Reset : in std_logic; Q : out std_logic_vector (n-1 downto 0)); end entity reg; architecture behavioural of reg is begin p0 : process (Clk, Reset) is begin IF Reset = '1' THEN Q <= (OTHERS => '0'); ELSIF Clk'EVENT AND Clk='1' THEN Q <= D; END IF; end process p0; end architecture behavioural; n-bitars Register
28 VHDL Variabler kan vara av samma typer som signaler deklareras och används i sekventiella delen uppdateras omgående har inget värde utanför processen tilldelas med := operatorn
29 Räknare på 2 sätt library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt is port (Clk, Reset : in std_logic; Q : out std_logic_vector (3 downto 0)); end entity cnt; Clk Reset Q
30 architecture arch_cnt of cnt is begin p0 : process (Clk, Reset) is variable cnt : std_logic_vector (3 downto 0); begin if Reset = '1' then cnt := (others => '0'); elsif Clk'EVENT and Clk='1' then cnt := cnt+1; end if; Q <= cnt; end process p0; end architecture arch_cnt; architecture arch_cnt of cnt2 is begin p0 : process (Clk, Reset) is variable cnt : std_logic_vector (3 downto 0); begin if Reset = '1' then cnt := (others => '0'); elsif Clk'EVENT and Clk='1' then cnt(3) := cnt(3) xor (cnt(2) and cnt(1) and cnt(0)); cnt(2) := cnt(2) xor (cnt(1) and cnt(0)); cnt(1) := cnt(1) xor cnt(0); cnt(0) := not cnt(0); end if; Q <= cnt; end process p0; end architecture arch_cnt;
31 VHDL Syntes. Klockade processer skall vara känsliga på en flank. Använd funktionerna Clk'EVENT AND Clk='1' eller Clk= 0'!. Gör rimlighetsanalys på antal grindar och antal vippor. Studera grindschemat efter syntes. Think Hardware Tänk i hårdvara då du skriver VHDL-koden.
http://model.com/
33 Arbetsgång vid simulering skriv in koden med texteditor kompilera filen simulera konstruktionen: 1. Ange insignalers värden (i en testbänk eller i simulatorn) 2. Välj vilka signaler som skall studeras 3. Kör simuleringen 4. Jämför utsignalerna mot förväntat resultat ModelSim/QuestaSim (Mentor Graphics Inc) används hos oss.
34 Work dinfil, välj signalerna (Add to wave) force clk 1 50ns, 0 100ns -repeat 100ns force reset 1 10ns, 0 20ns run 2000ns
35 Do - filer Ett sätt att testa konstruktionen på är men en.do fil. Skriv in kommandona i en text fil Spar den som namn.do (bra om den ligger i samma projekt biblioteket som resten) Kör: do namn.do i Transcript fönstret -- tst_cnt.do -- datum namn restart -f force clk 1 50ns, 0 100ns -repeat 100ns force reset 1 10ns, 0 20ns run 2000ns
36 Ex: BCD räknarfrossa! Implementera en två bitars BCD på två olika vis (i samma entitet) 1. Med case, Synkron reset 2. Med if then else, Asynkron reset Alla skall ha CE (Klock enable), LD (load) och CE_OUT
37 Implementera en två bitars BCD på två olika vis (i samma entitet) Med case, Synkron reset Alla skall ha CE (Klock enable), LD (load) och CE_OUT library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt_bcd is port (Clk, Reset, CE, LD: in std_logic; CEU1, CEU2 : out std_logic; Din : in std_logic_vector (7 downto 0); Q1 : out std_logic_vector (7 downto 0); Q2 : out std_logic_vector (7 downto 0)); end entity cnt_bcd;
architecture arch_cnt of cnt_bcd is begin cnt1 : process (Clk) is variable cnt : std_logic_vector (7 downto 0); begin if Clk'EVENT and Clk='1' then if Reset = '1' then cnt := (others => '0'); elsif CE='1' then if LD='1' then cnt := Din; else Synkron reset skall ha CE (Klock enable), LD (load) 38
case cnt(3 downto 0) is when "1001" => cnt(3 downto 0) := "0000"; case cnt(7 downto 4) is when "1001" => cnt(7 downto 4) := "0000"; when others => cnt(7 downto 4):= cnt(7 downto 4) +1; end case; when others => cnt(3 downto 0):= cnt(3 downto 0) +1; end case; 39 architecture arch_cnt of cnt_bcd is begin cnt1 : process (Clk) is variable cnt : std_logic_vector (7 downto 0); begin if Clk'EVENT and Clk='1' then if Reset = '1' then cnt := (others => '0'); elsif CE='1' then if LD='1' then cnt := Din; else
40 Q1<=cnt; if(cnt = "10011001") then CEU1<='1'; else CEU1<='0'; end if; end process cnt1;
architecture arch_cnt of cnt_bcd is begin cnt1 : process (Clk) is variable cnt : std_logic_vector (7 downto 0); begin if Clk'EVENT and Clk='1' then if Reset = '1' then cnt := (others => '0'); elsif CE='1' then if LD='1' then cnt := Din; else case cnt(3 downto 0) is when "1001" => cnt(3 downto 0) := "0000"; case cnt(7 downto 4) is when "1001" => cnt(7 downto 4) := "0000"; when others => cnt(7 downto 4):= cnt(7 downto 4) +1; end case; when others => cnt(3 downto 0):= cnt(3 downto 0) +1; end case; end if; -- LD=1 end if; -- Reset end if; -- Clk Q1<=cnt; if(cnt = "10011001")then CEU1<='1'; else CEU1<='0'; end if; end process cnt1; 41
Implementera en två bitars BCD på två olika vis (i samma entitet) Med if then else, Asynkron reset Alla skall ha CE (Klock enable), LD (load) och CE_OUT 42 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt_bcd is port (Clk, Reset, CE, LD: in std_logic; CEU1, CEU2 : out std_logic; Din : in std_logic_vector (7 downto 0); Q1 : out std_logic_vector (7 downto 0); Q2 : out std_logic_vector (7 downto 0)); end entity cnt_bcd;
if Reset = '1' then cnt := (others => '0'); elsif Clk'EVENT and Clk='1' then 43 if cnt(3 downto 0)= "1001" then cnt(3 downto 0) := "0000"; if cnt(7 downto 4) = "1001" then cnt(7 downto 4) := "0000"; else cnt(7 downto 4):= cnt(7 downto 4) +1; end if; -- cnt (7 downto 4) else cnt(3 downto 0):= cnt(3 downto 0) +1; end if; -- cnt(3 downto 0)
cnt2 : process (Clk, Reset) is end if; -- cnt(3 downto 0) variable cnt : std_logic_vector (7 downto 0); end if; -- LD=1 begin end if; -- Clk if Reset = '1' then end if; -- Reset cnt := (others => '0'); Q2<=cnt; elsif Clk'EVENT and Clk='1' then if(cnt = "10011001")then CEU2<='1'; if CE='1' then else CEU2<='0'; if LD='1' then end if; cnt := Din; end process cnt2; else if cnt(3 downto 0)= "1001" then cnt(3 downto 0) := "0000"; if cnt(7 downto 4) = "1001" then cnt(7 downto 4) := "0000"; else cnt(7 downto 4):= cnt(7 downto 4) +1; end if; -- cnt (7 downto 4) else cnt(3 downto 0):= cnt(3 downto 0) +1; 44
45 Simulera med do - fil restart -f (add wave clk) force clk 1 50ns, 0 100ns -repeat 100ns force reset 1 10ns, 0 20ns run 2000ns
46
47 VHDL Signaltilldelningar Concatenation & signal a,b : std_logic_vector (3 downto 0); signal c : std_logic; a <= 1 & b (3) & b (1 downto 0); b <= e & f; --e och f är tvåbitarsvektorer
48 Att välja olika realiseringar av en funktion A B C Z 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 Två nivå realisering (vi räknar inte inverterarna) Fler nivå realisering (Grindar med färre ingångar) XOR
49 Vilken realisering är bäst? Minska antalet ingångar Litteral : insignal (inverterad eller inte) Kostnad 2 transistorer per litteral Färre litteraler innebär färre transistorer Mindre kretsar Färre ingångar medför snabbare grindar Fan-in är i vissa teknologier begränsade Minska antalet grindar Färre grindar mindre kretsar Påverkar direkt produktionskostanden Reducera antalet grindnivåer Färre nivåer snabbare (Minsta fördröjning kräver ofta fler grindar) Hur balanserar vi mellan storlek och hastighet. Verktyg som ger olika lösningar Logik minimering Logik optimering
50 Sammanfattning VHDL används till Beskrivning/Specifikation/ Dokumentation av hårdvara. Simulering av hårdvara. Syntes av hårdvara. Entity - Architecture
Sammanfattning forts. 51 VHDL Ett starkt typat språk Bibliotek: Library IEEE; use IEEE.std_logic_1164.all; use ieee.std_logic_unsigned.all; Signaltilldelningar <= Variabel tilldelning :=
Sammanfattning forts. Paralell - Sekventiell kod name : process (<List>) is begin with X select case <expression> is y<= q0 when 00, when <choice> => <Statements>; qn when others; [when others =>..;] end case; 52
Sammanfattning forts. Paralell - Sekventiell kod target <= value_ex when cond else name : process (<List>) is begin if <condition> then value_ex [when cond]; <Statements>; [elsif <condition> then <Statements>; ] [else <Statements>; ] end if; 53
Sammanfattning forts. Implicit memory 54 Värdet behålls om ingen tilldelning sker. D-vippa (Register/räknare mm) IF Clk'EVENT AND Clk='1' THEN Asynkron Reset cnt2 : process (Clk, Reset) is begin if Reset = '1' then <Reset Statements > elsif Clk'EVENT and Clk='1' then <Statements>; end if;
Sammanfattning forts. Synkron Reset 55 cnt2 : process (Clk) is begin if Clk'EVENT and Clk='1' then if Reset = '1' then <Reset Statements > else <Statements>; end if; -- Reset end if; -- Clk'EVENT
Sammanfattning forts. Clock Enable 56 cnt2 : process (Clk) is begin if Clk'EVENT and Clk='1' then if CE = '1' then <Statements>; end if; -- CE
57 Nästa föreläsning Kombinatoriska nät Lite repetition + Karnaughdiagram(4-6var), flera utgångar Quine-McCluskey + intro tid Glöm inte att anmäla er till laborations tillfällena!