280 likes | 560 Views
VHDL ja süntees. L4, L5. Riistvara kirjelduskeel VHDL L6. Mäluga süsteemid VHDL-s L7. VHDL ja süntees. Sünteesitav VHDL. Eesmärgid üheselt tõlgendatav kirjeldus asendatavus struktuurse kirjeldusega asendatavus loogikaelementidega VHDL-i alamhulk
E N D
VHDL ja süntees L4, L5. Riistvara kirjelduskeel VHDL L6. Mäluga süsteemid VHDL-s L7. VHDL ja süntees I207 - Digitaalloogika ja -süsteemid - L7
Sünteesitav VHDL • Eesmärgid • üheselt tõlgendatav kirjeldus • asendatavus struktuurse kirjeldusega • asendatavus loogikaelementidega • VHDL-i alamhulk • ainult osa konstruktsioone on sünteesitavad • aeg viitena pole toetatud • võimalused erinevateks tõlgendusteks • taktsignaali sagedus – “wait for …;” • andmeformaadid – ujukomaarvud I207 - Digitaalloogika ja -süsteemid - L7
Kombinatoorne loogika • Protsess on interpreteeritav kombinatoorse loogika plokina siis ja ainult siis, kui: • protsessil on tundlikkuse nimistu või sisaldab ainult ühte ajakontrolli käsku • stiilis “wait on a, b, c;” • lokaalsed muutujad puuduvad või neile omistatakse väärtus ainult enne lugemist • kõik signaalid, mille väärtust kasutatakse, kuuluvad ka tundlikkuse nimistusse • kõik väljundsignaalid saavad väärtuse protsessi kõikides tingimuslikes harudes • s.t., pole vaja väärtust eelmisest tsüklist I207 - Digitaalloogika ja -süsteemid - L7
if-käsu süntees • if-käsk = multiplekser signal A,B,C,P1,P2,Z: BIT; . . . if (P1 = ’1’) then Z <= A; elsif (P2 = ’0’) then Z <= B; else Z <= C; end if; I207 - Digitaalloogika ja -süsteemid - L7
Keerukamad omistamised (I) • Mäluta S <= A when X=’1’ else B when Y=’1’ else C; process begin wait on A, B, C, X, Y; if X=’1’ then S <= A; elsif Y=’1’ then S <= B; else S <= C; end if; end process; I207 - Digitaalloogika ja -süsteemid - L7
Keerukamad omistamised (II) • Mäluga S <= A when X=’1’ else B when Y=’1’ else S; process begin wait on A, B, X, Y; if X=’1’ then S <= A; elsif Y=’1’ then S <= B; end if; end process; I207 - Digitaalloogika ja -süsteemid - L7
D-triger P1_FF: process (CLK) begin if CLK=’1’ and CLK’event then Q<=D; end if; end process P1_FF; P2_FF: process begin wait on CLK until CLK=’1’; Q<=D; end process P2_FF; Nullitav & laetav P3_FF: process (CLK) begin if CLK=’1’ and CLK’event then if RES=’1’ then Q<=(others=>’0’); elsif ENA=’1’ then Q<=D; end if; end if; end process P3_FF; Registrid (flip-flop) I207 - Digitaalloogika ja -süsteemid - L7
Registrid (flip-flop) • Asünkroonne nullimine (& sünkroonne laadimine) P3_FF: process (RESET,CLK) begin if RESET=’1’ then -- async. reset Q<=(others=>’0’); elsif CLK=’1’ and CLK’event then if ENA=’1’ then Q<=D; end if; end if; end process P3_FF; • Sama-aegsed käsud Q<= D when CLK’event and CLK=’1’ else unaffected; I207 - Digitaalloogika ja -süsteemid - L7
Sünteesi reeglid • Tähtsuse järjekorras: • omistatav signaal on flip-flop, kui omistamist kontrollib frondi avaldis • nt. CLK’event and CLK=’1’ • üldjuhul on lubatud ainult üks frondi avaldis • eri protsessidel võivad olla erinevad taktsignaalid • omistatav signaal toob sisse kolme-olekulise puhvri, kui talle võib omistada väärtuse ‘Z’ • nt. Q <= D when SEL = ’1’ else ’Z’; I207 - Digitaalloogika ja -süsteemid - L7
Sünteesi reeglid • Tähtsuse järjekorras (jätkub): • omistatav signaal on latch, kui omistamist ei toimu kõigis tingimuslikes harudes ja puudub frondi avaldis • vastasel juhul sünteesitakse kombinatoorskeem • Kasulik on eraldada mäluelemendid ja puhvrid kombinatoorsest osast, et olla kindel tulemuse korrektsuses I207 - Digitaalloogika ja -süsteemid - L7
+ / - < / > RG RG Sünteesi reeglid process (a, b, c) begin x <= f (a, b); y <= g (b, c); end process; process (clk) begin if clk’event and clk=’1’ then q <= d; end if; end process; Funktsionaalsed sõlmed Mäluelemendid I207 - Digitaalloogika ja -süsteemid - L7
Signaal või muutuja? signal A1, A2: BIT; process (CLOCK) variable A3 : BIT; begin if CLOCK=’1’ and CLOCK’event then A3 := A1 and A2; Z <= A3; end if; end process; signal A1,A2,A3 : BIT; process (CLOCK) begin if CLOCK=’1’ and CLOCK’event then A3 <= A1 and A2; Z <= A3; end if; end process; I207 - Digitaalloogika ja -süsteemid - L7
Aritmeetika • Üledefineeritud aritmeetikaoperatsioonid: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; • Ettevaatust operatsioonidega ‘*’, ‘/’, ‘**’ – äärmiselt palju loogikaelemente • Ohutu mõningatel juhtudel – kahe astmega korrutamine / jagamine • Sulgude kasutamine grupeerib elemente I207 - Digitaalloogika ja -süsteemid - L7
Algväärtustamine • Algväärtused tuletatakse (alam)tüübi deklaratsioonist (nt. “mytype’left”) • Otsene algväärtustamine objekti deklareerimisel • Algväärtustamine toimub omistamisega protsessi alguses • Ainult viimane variant on sünteesitav • osa koodist kulub algväärtustamistele I207 - Digitaalloogika ja -süsteemid - L7
Tsüklite sünteesimine • for-tsükkel või while-tsükkel? • Sõltub üldjuhul sünteesivahendist • Design Compiler (Synopsys):for – paralleelne, while – järjestikuline • ISE (Xilinx):for / while – ainult paralleelne • Leonardo (Mentor Graphics): sõltub ajalistest piirangutest (takt jms.) I207 - Digitaalloogika ja -süsteemid - L7
for-tsükkel paralleelne realisatsioon tsükli keha ei tohi sisaldada ajakontrolli käske (wait) Sõltub süntesaatorist… for i in 0 to 7 loop x(i) := a(i) and b(i); end loop; Tsüklite sünteesimine I207 - Digitaalloogika ja -süsteemid - L7
while-tsükkel järjestikuline realisatsioon tsükli keha peab sisaldama ajakontrolli käsku (wait) Sõltub süntesaatorist… i := 0; while i<7 loop data(i) := in_port; wait on clk until clk=’1’; i := i + 1; end loop; Tsüklite sünteesimine I207 - Digitaalloogika ja -süsteemid - L7
Kaks protsessi library IEEE; use IEEE.std_logic_1164.all; entity counter03 is port ( clk: in bit; resetn: in std_logic; three: out std_logic ); end entity counter03; library IEEE; use IEEE.std_logic_1164.all; architecture fsm2 of counter03 is subtype state_type is integer range 0 to 3; signal pres_state, next_state: state_type:=0; begin process (clk) begin -- State memory if clk'event and clk = '1' then pres_state <= next_state; end if; end process; -- Next state & output functions process (resetn, pres_state) begin three <= '0'; if resetn='0' then next_state <= 0; else case pres_state is when 0 to 2 => next_state <= pres_state + 1; when 3 => next_state <= 0; three <= '1'; end case; end if; end process; end architecture fsm2; Loendur & süntees 22 ekv.l.elem. / 3,70 ns I207 - Digitaalloogika ja -süsteemid - L7
Kolm protsessi library IEEE; use IEEE.std_logic_1164.all; entity counter03 is port ( clk: in bit; resetn: in std_logic; three: out std_logic ); end entity counter03; library IEEE; use IEEE.std_logic_1164.all; architecture fsm3 of counter03 is subtype state_type is integer range 0 to 3; signal pres_state, next_state: state_type:=0; begin process (clk) begin -- State memory if clk'event and clk = '1' then pres_state <= next_state; end if; end process; -- Next state function process (resetn, pres_state) begin if resetn='0' then next_state <= 0; else if pres_state=3 then next_state <= 0; else next_state <= pres_state + 1; end if; end if; end process; -- Output function process (resetn, pres_state) begin if pres_state=3 then three <= '1'; else three <= '0'; end if; end process; end architecture fsm3; Loendur & süntees 23 ekv.l.elem. / 4,36 ns I207 - Digitaalloogika ja -süsteemid - L7
Üks protsess library IEEE; use IEEE.std_logic_1164.all; entity counter03 is port ( clk: in bit; resetn: in std_logic; three: out std_logic ); end entity counter03; library IEEE; use IEEE.std_logic_1164.all; architecture fsm1 of counter03 is subtype state_type is integer range 0 to 3; signal state: state_type := 0; begin process (clk) begin if clk'event and clk = '1' then three <= '0'; if resetn='0' then state <= 0; else case state is when 0 | 1 => state <= state + 1; when 2 => state <= state + 1; three <= '1'; when 3 => state <= 0; end case; end if; end if; end process; end architecture fsm1; Loendur & süntees 38 ekv.l.elem. / 5,68 ns I207 - Digitaalloogika ja -süsteemid - L7
Eraldi loendur ja automaat architecture synth of TLC2 is type state_type is (S1, S2, S3, S4); signal state: state_type := S1; signal road1, road2: bit_vector (1 to 3); signal counter: integer range 0 to 15 := 0; Begin process begin -- counter wait on timer until timer='1'; if counter = 14 then counter <= 0; else counter <= counter + 1; end if; end process; process begin -- next state wait on timer until timer='1'; case state is when S1 => if counter>=12 then state <= S2; else state <= S1; end if; when S2 => if counter>=12 then state <= S2; else state <= S3; end if; when S3 => if counter>=12 then state <= S4; else state <= S3; end if; when S4 => if counter>=12 then state <= S4; else state <= S1; end if; end case; end process; process (state) begin -- output case state is when S1 => R1 <= '0'; Y1 <= '0'; G1 <= '1'; R2 <= '1'; Y2 <= '0'; G2 <= '0'; when S2 => R1 <= '0'; Y1 <= '1'; G1 <= '0'; R2 <= '1'; Y2 <= '1'; G2 <= '0'; when S3 => R1 <= '1'; Y1 <= '0'; G1 <= '0'; R2 <= '0'; Y2 <= '0'; G2 <= '1'; when S4 => R1 <= '1'; Y1 <= '1'; G1 <= '0'; R2 <= '0'; Y2 <= '1'; G2 <= '0'; end case; end architecture synth; Süntees & valgusfoor??? I207 - Digitaalloogika ja -süsteemid - L7
VHDL & valgusfoor • Simulatsioonide tulemused TLC synth pisierinevused aegades pole praegu oluline… I207 - Digitaalloogika ja -süsteemid - L7
Valgusfoor skeemina? http://www.itcollege.ee/~lrv/I207/tlc-applet.txt I207 - Digitaalloogika ja -süsteemid - L7
Sünteesi metodoloogia • Defineeri disaini tase • automaat, RTL, struktuurne • Defineeri kasutatavad paketid • tarnija, kasutaja poolt määratud • Tükelda disain • komponendid, ühendused, testikava, testkeskkond • Sünteesi disain • komponentide süntees, viidete analüüs • Verifitseeri/valideeri disain • loogikalülid võrreldes RTL-ga I207 - Digitaalloogika ja -süsteemid - L7
Mitu “wait” käsku? • VHDL semantika peab alles jääma • on võimalikud erinevad interpretatsioonid • Operatsioonide hajutamine mitme takti vahel • Algoritm • sisendid: a, b, c, d • väljund: x • kordajad: c1, c2 • x = a + b*c1 + c*c2 + d • ajaline piirang - 3 takti process variable av, bv, cv, dv: ...; begin av:=a; bv:=b; cv:=c; dv:=d; wait on clk until clk=’1’; wait on clk until clk=’1’; x <= av + bv*c1 + cv*c2 + dv; wait on clk until clk=’1’; end process; I207 - Digitaalloogika ja -süsteemid - L7
Mitu “wait” käsku? • Käitumuslik interpretatsioon pole alati parim process variable av, bv, cv, dv: ...; begin av:=a; bv:=b; cv:=c; dv:=d; wait on clk until clk=’1’; wait on clk until clk=’1’; x <= av + bv*c1 + cv*c2 + dv; wait on clk until clk=’1’; end process; process variable av, bv, cv, dv: ...; variable r1, r2: ...; begin av:=a; bv:=b; cv:=c; dv:=d; r1 := av + dv; r2 := bv * c1; wait on clk until clk=’1’; r1 := r1 + r2; r2 := cv * c2; wait on clk until clk=’1’; x <= r1 + r2; wait on clk until clk=’1’; end process; 2 korrutit, 3 summaatorit 1 korruti, 1 summaator I207 - Digitaalloogika ja -süsteemid - L7
“wait” käskude lisamine • VHDLi semantika s/v suhtes paigas • 16-järguline filter • lugem - sys_clk • täiendava takti lisamine võimalik • Tsüklid? • 1. paralleelselt • 2. järjestikuliselt process variable sum: ...; variable buff: ...; -- array (0 to 15) begin for i in 15 downto 1 loop buff(i):=buff(i-1); end loop; buff(0):=data_in; sum:=0; for i in 0 to 15 loop sum := sum + buff(i) * coeff(i); end loop; x <= sum; wait on sys_clk until sys_clk=’1’; end process; I207 - Digitaalloogika ja -süsteemid - L7
-- gcd - greates common denominator -- - suurima ühisteguri leidmine -- bit16 = integer range -- -(2**16) to 2**16-1 entity gcd is port (xi, yi : in bit16; rst : in bit; ou : out bit16; clk : in bit); end gcd; architecture behavior of gcd is begin process variable x,y: bit16; begin wait on clk until clk='1' and (rst = '0'); x := xi; y := yi; while (x /= y) loop if (x < y) then y:=y-x; else x:=x-y; end if; end loop; ou <= x; end process; end behavior; Näide ohtlikust koodist… I207 - Digitaalloogika ja -süsteemid - L7