VHDL-AMS
Počátek jazyků HDL sahá do šedesátých let. V průběhu doby vznikla celá řada jazyků FAS (Anacad 1988), SpetreHDL (Cadence 94), MAST (Analogy 1986) a jiné. V současné době hrají největší roli jazyky - VHDL (IEEE 1076), VHDL-AMS (IEEE 1076.1 – 1999) - Verilog (IEEE – 1376), Verilog-AMS
Základní znaky - HDL plně oddělují modelování a simulaci (parametry i rovnice modelů jsou v knihovně). - Představují potenciální cestu pro analogovou syntézu (zatím lze automatickou syntézu provádět pouze u číslicových obvodů). - Snadněji než Spice popisují různé úrovně abstrakce elektrických i neelektrických systémů. - Ve srovnání se Spice jsou velmi složité a vyžadují dlouhou dobu na plné osvojení. - Velmi nákladné simulační programy. Introduction
1-2
Základem modelování je entita (černá skříňka) a d ref
entity comparator is generic (level : REAL := 2.5); port (terminal a, ref : ELECTRICAL; signal d : out BIT); end;
Introduction
1-3
K entitě existuje jedna nebo více implementací: architecture simple of comparator is quantity v across i through a to ref; begin v == 1.0E6*i; -- Rin = 1Mohm d <= '1' when v'ABOVE(level) else '0'; end architecture simple ;
a d ref
Použití (instance) comp1 : entity comparator (simple) generic map (level => 5.0) port map (a => n1, ref => n2, d => n3);
Introduction
1-4
Typy portů (svorek)
signal – klasický digitální (in, out, inout) terminal - analogový uzel (odvozují se rovnice 1. a 2. KZ) - energetické domény (elektrická, mechanická,....) quantity - analogová proměnná ( in, out, signal-flow modeling) generic - obecná konstanta
Introduction
1-5
Implementace modelu
* struktura – spojení bloků (= netlist) * chování (behavioral style) - Concurrent Statements (souběžné výrazy pro digitální část) - Simultaneous Statements (souběžné výrazy pro analogovou část) – soustava rovnic Je možné mixovat vše dohromady.
Introduction
1-6
Typy promenných VHDL má velmi přísnou typovou kontrolu. Existují skalární typy a kompozitní typy (pole, záznamy). Většinou jsou předdefinované v knihovně (příkazy library, use) integer podinterval: type byte_int is range 0 to 255; real podinterval: type level is range –10.00 to +10.00;
Introduction
1-7
fyzikální typy (= real + označení jednotky) type resistance is range 0 to 1E8 units ohms; kohms = 1000 ohms; Mohms = 1E6 ohms; end units;
výčtové typy type bit is ('0', '1'); type boolean is (false, true);
std_logic (U, X, 0, 1, Z, W, L, H, -) Introduction
1-8
pole type word is array (31 downto 0) of bit;
poziční a jmenná asociace type a is array (1 to 4) of character;
poziční asociace jmenná asociace
('f', 'o', 'o', 'd') (1 => 'f', 3 => 'o', 4 => 'd', 2 => 'o') ('f', 4 => 'd', others => 'o')
deklarace proměnných constant e : real := 2.71828; variable count : natural := 0; (pouze pro procesy)
Introduction
1-9
Prvky číslicového modelu
Procesy (příkazy uvnitř procesu se provádějí sekvenčně)
p1a : process (a, b) begin s <= a xor b; end process p1a; p1b : process is variable mem : bit := ‘0’; -- je to vidět jen v procesu begin s <= a xor b; wait on a, b; .......... end process p1b;
Introduction
1-10
Přiřazení se provede až po skončení procesu y1 <= not a ; y2 <= a after 5 ns ; y3 <= 0.0, 1.0 after 250 ns ;
Uspání procesu wait until clk = '1' for 1.2 ns; -- timeout 1.2 ns wait on clk;
Introduction
1-11
Sekvenční příkazy (uvnitř procesu) count := count + 1 ; --proměnná max_ab : if a > b then vmax := a ; else vmax := b ; end if max_ab ; case int is when 0 => null; when 1 | 2 | 7 => v := 6; when 3 to 6 => v := 8; when others => v := 0; end case; Introduction
1-12
Sekvenční příkazy (uvnitř procesu) L : loop wait until clk = '1'; q <= d after 5 ns ; exit L when NOW > 100 ms ; end loop L; while mpier > 0.0 loop prod : = prod * mpcand ; mpier : = mpier - 1.0 ; end loop; for i in 15 downto 0 loop vector(i) := i * 2.0; end loop ;
Introduction
1-13
Souběžné výrazy
proces instance jiného modelu y1 <= not a ; y2 <= a after 5 ns ; y3 <= 0.0, 1.0 after 250 ns ; mux_out <= 'Z' after Tpd when en = '0' else in_0 after Tpd when sel = '0' else in_1 after Tpd; with sel select z>=d0 when ''00'' | ''11'', d1 when others; Introduction
1-14
Analogový model
Výsledkem formulace popisu analogové části je soustava algebraicko-diferenciálních rovnic v implicitním tvaru. Počet rovnic = počet neznámých. Soustava se formuluje z „Simultaneous Statements“ (souběžné výrazy pro analogovou část).
Introduction
1-15
Volné veličiny Proměnné, které vystupují v soustavě alg. dif. rovnic. quantity q1, q2 : REAL ; -- v deklarační části entity integ is -- jako svorky jedním směrem port (quantity qin : in real; quantity qout : out real); end;
Introduction
1-16
Volné veličiny Proměnné, které vystupují v soustavě alg. dif. rovnic. quantity q1, q2 : REAL ; -- v deklarační části entity integ is -- jako svorky jedním směrem port (quantity qin : in real; quantity qout : out real); end; Pro svorky kvantit se nesestavují KZ. použití: qout == qin’integ; qin’integ == qout; Introduction
1-17
Uzly „Konzervativní sémantika“ – z propojení uzlů se automaticky odvodí topologické rovnice (1. a 2. KZ pro elektrické systémy) terminal t1, t2 : ELECTRICAL ;
V hlavičce nebo v těle jako obecný uzel. ELECTRICAL – „nature“ (povaha) udává typ veličin spojených s uzlem. Dva uzly definují větev (bránu) – branové napětí a proud quantity v across i through n1 to n2; Je možné definovat více paralelních proudů. electrical_ref - referenční uzel Introduction
1-18
Souběžné analogové výrazy jednoduchý výraz qout == qin’integ; (může to být implicitní rovnice) - tolerance (obdoba ABSTOL, RELTOL, VNTOL ve Spice) f == m*x'DOT'DOT + k*x tolerance "mechanical_mst";
if vmax = REAL’RIGHT use verr== vin ; elsif vin > vmax useverr== vmax ; elsif vin < -vmax useverr== -vmax ; else verr == vin ; end use ; case din use when '0' => v == ron * i + vlo; when '1' => v == ron * i + vhi; when 'X'’ => v == ron * i + vx; when 'Z' => v == roff * i + vx; end case ;
Introduction
1-19
procedural is variable sum := 0.0 ; begin for i in inp’RANGE loop sum := sum + inp(i); end loop; outp := sum; end procedural ; Při použití větvení musí být stále stejný počet rovnic. Nvolné + Nproudy + Nvýst – Nvst = počet rovnic
Introduction
1-20
Nespojitosti příkaz break korektní ošetření nespojitosti
* sekvenční break (v procesu) break; Break se nesmí volat v procesu, který změnil hodnotu analogové veličiny (přiřazení se stane až po skončení – break by se volal předčasně). * simultánní break (v architektuře) break on s when Q > 2.0 ; (citlivý na dig. signál s + podmínka)
Introduction
1-21
Pomocí příkazu break je možné nastavit nové hodnoty stavových proměnných (atributy dot a integ) – je možné generovat nespojitosti (stavové proměnné se změní skokem). break v_x=> 1.0 on trigger
Introduction
1-22
A/D převod * pro A/D použít atribut above process(v’above(level)) begin if v>= level then d<=’1’; else d<=’0’; end if; end process
Introduction
1-23
D/A převod * pro D/A atribut ramp signal sr : real; -- „číslicový“ signál process(dig) begin if dig=‘1‘ then sr<=5.0; else sr<=0.0; end if end process; v_out == sr’ramp(1e-8); --délka hrany 10ns
Introduction
1-24
Modely ve frekvenční oblasti Typ analýzy (časová / frekvenční) se nastaví v solveru. Model je o tom informován pomocí proměnné domain (quiescent_domain, time_domain, frequency_domain) Ve frekvenční oblasti se rovnice linearizují + derivace -> jω, ........ Jako stimul v AC oblasti se musí použít speciální deklarace: quantity v : real spectrum 2.5, ACMAG
math_pi/2.0; ACPHASE (v zdroji VAC, PSpice)
Jen v AC existuje funkce frequency, která se dá použít pro definici stimulu. Introduction
1-25
Zdroj VAC
entity v_source is generic ( DC : voltage := 1.0; ac_mag : voltage := 1.0; -- AC magnitude ac_phase : real := 0.0 ); -- AC phase [Degree] port ( terminal pos, neg : electrical ); end entity v_source; architecture behavior of v_source is quantity vout across iout through pos to neg; quantity ac_spec : real spectrum ac_mag, math_2_pi*ac_phase/360.0; begin if domain = quiescent_domain or domain = time_domain use vout == DC; else vout == ac_spec; -- used for frequency (AC) analysis end use; end architecture behavior; Introduction
1-26
Atribut LTF
constant num : real_vector := (0=>1.0); --jednoprvkový vektor constant den : real_vector := (1.0, 0.01); -- a0, a1*s, a2*s2 , ..... v_out ==v_in’LTF(num, den); Atribut LTF je veličina transformovaná pomocí bloku s přenosem num/den. Ve frekvenční oblasti jde o násobení, v časové oblasti se použije ekvivalentní systém diferenciálních rovnic.
Introduction
1-27