300 likes | 467 Views
Teised riistvara kirjelduskeeled. L 1 1, L 1 2. Riistvara kirjelduskeel VHDL L13. Mäluga süsteemid VHDL-s L14. VHDL -i paketid ja teegid Sünteesitav VHDL L 1 5. T eised r i i stvara kirjelduskeeled. VHDL-AMS. VHDL-AMS - A nalog & M ixed S ignal extensions IEEE Standard 1076.1
E N D
Teised riistvara kirjelduskeeled L11, L12. Riistvara kirjelduskeel VHDL L13. Mäluga süsteemid VHDL-s L14. VHDL-i paketid ja teegid Sünteesitav VHDL L15. Teised riistvara kirjelduskeeled I207 - Digitaalloogika ja -süsteemid - L15
VHDL-AMS • VHDL-AMS - Analog & Mixed Signal extensions • IEEE Standard 1076.1 • VHDL (IEEE Standard 1076-1993) laiendus • Matemaatiline alus • Analoogi (pidevalt muutuv osa) kirjeldavad algebralised differentsiaalvõrrandid (differential algebraic equations – DAEs) • Võrrandisüsteemi F(x,dx/dt)=0 lahendamine numbriliselt • x – tundmatute vektor • F – avaldiste vektor I207 - Digitaalloogika ja -süsteemid - L15
VHDL-AMS • Kaks uut objekti • terminal • terminalide abil luuakse analoogahelaid terminal t1,t2:electrical; • quantity • koguste abil luuakse signaalide voo mudelid quantity a,b,c: voltage; • Täiendavad atribuudid • tuletis • integraal • Laplace’ teisendus • jne. I207 - Digitaalloogika ja -süsteemid - L15
VHDL-AMS • Elektriliste omaduste pakett package electrical_system is subtype voltage is real; subtype current is real; subtype charge is real; subtype flux is real; nature electrical is voltage across current through; nature electrical_vector is array(natural range <>) of electrical; alias ground is electrical’reference; end package electrical_system; I207 - Digitaalloogika ja -süsteemid - L15
Näide – põrkuv pall entity bouncer is end entity bouncer; architecture ball of bouncer is quantity v:velocity; -- m/sec quantity s:displacement; -- m constant g: real := 9.81; -- m/sec**2 constant air_res : real := 0.001; -- 1/m begin s’Dot == v; if v>0.0 use v’Dot == -g - v**2*air_res; else v’Dot == -g + v**2*air_res; end use; -- Announce discontinuity, reset velocity value break v => -v when not s’Above(0.0); -- Specify initial conditions break v => 0.0, s => 10.0; end architecture ball; I207 - Digitaalloogika ja -süsteemid - L15
Teised riistvara kirjelduskeeled • Verilog • 1983/85 – Automated Integrated Design Systems • 1989/90 – omandatud Cadence Design Systems’i poolt • 1990/91 – OVI (Open Verilog International) • 1995 mai – IEEE Standard 1364-1995 • HardwareC, HandelC, uC++, SystemC • jt. C/C++ laiendused • Java • SDL, Erlang, Lotos • Petri-Nets • jne. ... I207 - Digitaalloogika ja -süsteemid - L15
Verilog • Põhielement – moodul (module) • Signaalid • wire (traat) – pidevalt tüüritavad • reg ~ hoiab omistatud väärtust • muutujad puuduvad • piiratud andmetüübid • Simulatsioonimudel – nullviide • blokeerivad ja mitteblokeerivad omistamised • fork-join paar paralleelseteks lõimedeks I207 - Digitaalloogika ja -süsteemid - L15
// structural module AND2 (in1, in2, out); input in1, in2; output out; wire in1, in2, out; and u1 (out, in1, in2); endmodule // behavioral module AND2 (in1, in2, out); input in1; input in2; output out; wire in1, in2; reg out; always @( in1 or in2 ) out = in1 & in2; endmodule Verilog // data flow module AND2 (in1, in2, out); input in1, in2; output out; wire in1, in2, out; assign out = in1 & in2; endmodule I207 - Digitaalloogika ja -süsteemid - L15
Verilog // Test-bench module test_and2; reg i1, i2; wire o; AND2 u2 (i1, i2, o); initial begin i1 = 0; i2 = 0; #1 $display(”i1 = %b, i2 = %b, o = %b”, i1, i2, o); i1 = 0; i2 = 1; #1 $display(”i1 = %b, i2 = %b, o = %b”, i1, i2, o); i1 = 1; i2 = 0; #1 $display(”i1 = %b, i2 = %b, o = %b”, i1, i2, o); i1 = 1; i2 = 1; #1 $display(”i1 = %b, i2 = %b, o = %b”, i1, i2, o); end endmodule // result i1 = 0, i2 = 0, o = 0 i1 = 0, i2 = 1, o = 0 i1 = 1, i2 = 0, o = 0 i1 = 1, i2 = 1, o = 1 I207 - Digitaalloogika ja -süsteemid - L15
Verilog • Andmetüübid integer i, j; real f, d; wire [7:0] bus; // 1x8 bits reg [0:15] word; // 1x16 bits reg arr[0:15]; // 16x1 bits reg [7:0] mem[0:127]; // 128x8 bits event trigger, clock_high; time t_setup, t_hold; parameter width=8; parameter width2=width*2; wire [width-1:0] ww; // The following are illegal wire w[0:15]; // No arrays wire [3:0] a, [7:0] b; // Only one width per decl. I207 - Digitaalloogika ja -süsteemid - L15
Konkatenatsioon {2’b1x, 4’h7} === 6’b1x0111 {cout, sum} = in1 + in2 + cin; {sreg, out} = {in, reg}; {3{2’b01}} === 6’b010101 Verilog • Indekseerimine reg [15:0] array [0:10]; reg [15:0] temp; ... temp = array[3]; ... temp[7:5] ... // array[3][7:5] is illegal • fork-join module fork_join; event a, b; // Block name! fork : block1 @a disable block1; @b disable block1; join endmodule I207 - Digitaalloogika ja -süsteemid - L15
s1 wb1 wb1d wb3 wb3d wn1 wn1d wn3 wn3d Verilog • blokeeriv always @(s1) #1 wb1 = s1; always @(s1) wb1d = #1 s1; always @(s1) #3 wb3 = s1; always @(s1) wb3d = #3 s1; • mitteblokeeriv always @(s1) #1 wn1 <= s1; always @(s1) wn1d <= #1 s1; always @(s1) #3 wn3 <= s1; always @(s1) wn3d <= #3 s1; I207 - Digitaalloogika ja -süsteemid - L15
Mitte-determinism • Null-viitest põhjustatud mitte-determinisn module stupidVerilogTricks (f,a,b); input a, b; output f; reg f, q; initial f = 0; always @(posedge a) #10 q = b; not ( qBar, q ); always @q f = qBar; endmodule 1) qBar=0 [q==1] q=0 a=1 f=0 f=qBar=b=1 --> #10 q=1 [b==1] 2) f=1 [qBar==1] a=0 f==? qBar=0 [q==1] I207 - Digitaalloogika ja -süsteemid - L15
Eelised Tootlikkus täidetav spetsifik. täpsustamine Süsteemi tase tarkvara osakaalu kasv koos-disain, -simul. jne. Korduvkasutamine OO eelised testkeskkond C/C++ on levinud! Puudused C/C++ pole riistvara C/C++ ei toeta riistvara infovahetust signaalid, protokollid aja mõistet (takt) sama-aegsust reaktiivsust nt. katkestused riistavara andmetüüpe bit, bitivektor, MVL C/C++ & riistvara? I207 - Digitaalloogika ja -süsteemid - L15
Mis on SystemC? • C++ klasside teek • protsessid (sama-aegsus) • taktsignaalid (aja mõiste) • moodulid, väratid, signaalid (hierarhia) • ootamine, valvamine (reaktiivsus) • riistvara andmetüübid • Modelleerimis-stiil • ... süsteemide jaoks, mis koosnevad mitmest doomenist, abstraktsioonitasemest, arhitektuursest komponendist ja realistlikest piirangutest • Lõimeil põhinev simulatsiooni-mehanism I207 - Digitaalloogika ja -süsteemid - L15
SystemC – koostisosad • Moodul – põhikomponent • protsessid (käitumine) & alam-moodulid (struktuur) • Väratid • ühendus mooduli ja väliskeskkonna vahel • mood: in, out, inout; tüüp: C++, SystemC & kasutaja sc_in< type > in_port_name; // input port sc_out< type > out_port_name; // output port sc_inout< type > inout_port_name; // bidirectional sc_out< int > result [32]; // vector • taktsignaal - sc_clock sc_clock my_clk (”CLK”, 20, 0.5, 5, true); my_module.clk( my_clk.signal() ); sc_clock clock_name(”label”,period,duty_ratio,offset,start_value); I207 - Digitaalloogika ja -süsteemid - L15
SystemC – koostisosad • Signaalid • semantika sarnane VHDL & Verilog signaalidele • tüüp: C++, SystemC & kasutaja sc_signal< type > signal_name; // signal declaration sc_signal< double > a[4]; // vector / array • Muutujad • lokaalsed andmed (protsess, funktsioon jne.) • tüüp: C++, SystemC & kasutaja • Lahendatud väratid ja signaalid • 4-väärtuseline loogika (0,1,Z,X) sc_signal_rv< n> y; // n bits wide resolved signal I207 - Digitaalloogika ja -süsteemid - L15
SystemC – andmetüübid • C/C++ tüübid • char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, float, double, long double • SystemC tüübid • 2- (‘0’, ‘1’) ja 4-väärtuseline (‘0’, ‘1’, ‘Z’, ‘X’) loogika / vektor • märgiga ja märgita täis- ja fikskomaarvud (suvaline pikkus) • sc_bit, sc_logic, sc_int, sc_uint, sc_bigint, sc_biguint, sc_bv, sc_lv, sc_fixed, sc_ufixed, sc_fix, sc_ufix sc_uint<4> var_4bits; sc_biguint<124> var_124bits; sc_lv<24> logic_vector; sc_fixed<6,10> cff_1(0.125); • Kasutaja tüübid I207 - Digitaalloogika ja -süsteemid - L15
SC_MODULE( plus ) { sc_in<int> i1, i2; sc_out<int> o1; void do_plus(); SC_CTOR( plus ) { SC_METHOD( do_plus ); sensitive << i1 << i2; } }; void plus::do_plus() { int arg1, arg2, sum; arg1 = i1.read(); arg2 = i2.read(); sum = arg1 + arg2; o1.write(sum); } SystemC – protsessid SC_MODULE( plus ) { sc_in<int> i1, i2; sc_out<int> o1; void do_plus(); SC_CTOR( plus ) { SC_THREAD( do_plus ); sensitive << i1 << i2; } }; void plus::do_plus() { int arg1, arg2; int sum; while ( true ) { arg1 = i1.read(); arg2 = i2.read(); sum = arg1 + arg2; o1.write(sum); wait(); } } SC_MODULE( plus ) { sc_in_clk clk; sc_in<int> i1, i2; sc_out<int> o1; void do_plus(); SC_CTOR( plus ) { SC_CTHREAD (do_plus,clk.pos()); } }; void plus::do_plus() { int arg1, arg2; int sum; while ( true ) { arg1 = i1.read(); arg2 = i2.read(); sum = arg1 + arg2; o1.write(sum); wait(); } } I207 - Digitaalloogika ja -süsteemid - L15
SystemC simulaator • Ühik- ja delta-viite kombinatsioon • 1) Kõik muutuvad taktsignaalid saavad uue väärtuse • 2) Täidetakse kõik SC_METHOD / SC_THREAD protsessid, mille sisendid on muutunud • 3) SC_CTHREAD protsessid, mille sisendid on muutunud, planeeritakse sammu 5 • 4) Samme 2 ja 3 korratakse kuni signaalide väärtused ei muutu • 5) Täidetakse aktiveeritud SC_CTHREAD protsessid • 6) Samm 1 korratakse järgmise simulatsiooni-ajaga I207 - Digitaalloogika ja -süsteemid - L15
// mux.h #include "systemc.h“ SC_MODULE (mux) { int const static bit_number=8; sc_in <sc_bv <bit_number> > a_in; sc_in <sc_bv <bit_number> > b_in; sc_in <sc_bit> juht; sc_out <sc_bv <bit_number> > out_sig; SC_CTOR(mux):a_in("a_in"),b_in("b_in"), juht("juht"),out_sig("out_sig") { cout<<"mux constructor"<<endl; SC_METHOD( choose_out ); sensitive<<juht<<a_in<<b_in; } void choose_out() { if (juht.read()) out_sig.write(a_in.read()); else out_sig.write(b_in.read()); } }; // t_mux.cpp #include "systemc.h" #include "mux.h" SC_MODULE (t_mux) { int const static num_bits=8; sc_signal <sc_bv <num_bits> > t_a_in; sc_signal <sc_bv <num_bits> > t_b_in; sc_signal <sc_bit> t_juht; sc_signal <sc_bv <num_bits> > t_out_sig; mux* mux_instance; void stimulus(); SC_CTOR(t_mux):t_a_in("t_a_in"), t_b_in("t_b_in"),t_juht("t_juht"), t_out_sig("t_out_sig") { cout<<"t_mux constructor"<<endl; mux_instance=new mux("mux"); mux_instance->a_in(t_a_in); mux_instance->b_in(t_b_in); mux_instance->juht(t_juht); mux_instance->out_sig(t_out_sig); SC_THREAD(stimulus); } }; SystemC – näide I207 - Digitaalloogika ja -süsteemid - L15
// t_mux.cpp ... void t_mux::stimulus() { t_a_in.write("11111111"); t_b_in.write("00001111"); t_juht.write((sc_bit)0); wait(1, SC_PS); t_juht.write((sc_bit)1); wait(10, SC_NS); t_juht.write((sc_bit)0); wait(10, SC_NS); t_a_in.write("11110000"); t_b_in.write("10101010"); t_juht.write((sc_bit)0); wait(10, SC_NS); t_juht.write((sc_bit)1); wait(); } // t_mux.cpp ... int sc_main(int args, char* argv[]) { t_mux testMux("t_mux"); sc_trace_file *trcf= sc_create_vcd_trace_file("trace-it"); if(trcf==NULL) cout<<"Sorry, no tracing..."<<endl; sc_trace(trcf, testMux.t_a_in, "t_a_in"); sc_trace(trcf, testMux.t_b_in, "t_b_in"); sc_trace(trcf, testMux.t_juht, "t_juht"); sc_trace(trcf, testMux.t_out_sig, "t_out_sig"); sc_start(40, SC_NS); sc_close_vcd_trace_file(trcf); return 0; } ---------------------------- > g++ -I/cad/sysC/include -L/cad/sysC/lib t_mux.cpp-lsystemc -o mux > ./mux > gtkwave trace-it.vcd SystemC – näide I207 - Digitaalloogika ja -süsteemid - L15
mux & gtkWave SystemC – näide I207 - Digitaalloogika ja -süsteemid - L15
Näidisprojekt – koodlukk • Neli nuppu (sisendid), üks relee (väljund) • Kolmene kood, kindel vajutamise järjekord • Juhtautomaat • 4 sisendit, 1 väljund • nupule vajutus ja vabastamine –> taktsignaal • s/v puhverdamine on hilisem teema • sisendid – kontaktide värelemine • väljund – signaali võimendamine • Kood – 2, 1, 4 • vale kood ja/või korraga vajutamine viib algusesse I207 - Digitaalloogika ja -süsteemid - L15
0100 0000 1- 1+ 0 2- 2+ 1000 0001 0000 4+ 0100 0000 1000 0000 OK 0001 0000 Näidisprojekt – koodlukk • Kood – 2, 1, 4 • vale kood ja/või korraga vajutamine viib algusesse • Olekud – algus, vajutus, vabastamine, … • 0, 2+, 2-, 1+, 1-, 4+ (lahti laskmine viib 0 tagasi) • näitamata kombinatsioon viib olekusse 0! I207 - Digitaalloogika ja -süsteemid - L15
Koodlukk – VHDL mudel • Vt. http://www.itcollege.ee/~lrv/I207/koodlukk.vhd ja http://www.itcollege.ee/~lrv/I207/test_koodlukk.vhd • Olemus, st. põhiosa -- Siirde- ja valjundfunktsioon process ( nupud, current_state ) begin relee <= '0'; next_state <= s0; case current_state is when s0 => if nupud = "0100" then next_state <= s2p; end if; when s2p => if nupud = "0100" then next_state <= s2p; elsif nupud = "0000" then next_state <= s2m; end if; when s2m => if nupud = "0000" then next_state <= s2m; elsif nupud = "1000" then next_state <= s1p; end if; when s1p => if nupud = "1000" then next_state <= s1p; elsif nupud = "0000" then next_state <= s1m; end if; when s1m => if nupud = "0000" then next_state <= s1m; elsif nupud = "0001" then next_state <= s4p; end if; when s4p => if nupud = "0001" then next_state <= s4p; elsif nupud = "0000" then relee <= '1'; end if; end case; end process; I207 - Digitaalloogika ja -süsteemid - L15
Koodlukk – simulatsioon • run 100 sec • Vt. http://www.itcollege.ee/~lrv/I207/koodlukk1.gif ja http://www.itcollege.ee/~lrv/I207/koodlukk2.gif I207 - Digitaalloogika ja -süsteemid - L15
Koodlukk – realisatsioon • Automaatne süntees • Synopsys Design Compiler I207 - Digitaalloogika ja -süsteemid - L15
nupud | st | st+ | out ------+-----+-----+---- 0000 | s0 | s0 | 0 0100 | | s2p | 0 1--- | | s0 | 0 0-1- | | s0 | 0 0-01 | | s0 | 0 ------+-----+-----+---- 0100 | s2p | s2p | 0 0000 | | s2m | 0 1--- | | s0 | 0 0-1- | | s0 | 0 0-01 | | s0 | 0 ------+-----+-----+---- 0000 | s2m | s2m | 0 1000 | | s1p | 0 -1-- | | s0 | 0 -01- | | s0 | 0 -001 | | s0 | 0 ------+-----+-----+---- 1000 | s1p | s1p | 0 0000 | | s1m | 0 -1-- | | s0 | 0 -01- | | s0 | 0 -001 | | s0 | 0 ------+-----+-----+---- 0000 | s1m | s1m | 0 0001 | | s4p | 0 1--- | | s0 | 0 01-- | | s0 | 0 001- | | s0 | 0 ------+-----+-----+---- 0001 | s4p | s4p | 0 0000 | | s0 | 1 1--- | | s0 | 0 01-- | | s0 | 0 001- | | s0 | 0 ------+-----+-----+---- espresso-le .i 7 .o 4 0000000 0000 0100000 0010 1---000 0000 0-1-000 0000 0-01000 0000 0100001 0010 0000001 0110 1---001 0000 0-1-001 0000 0-01001 0000 0000011 0110 1000011 0100 -1--011 0000 -01-011 0000 -001011 0000 1000010 0100 0000010 1100 -1--010 0000 -01-010 0000 -001010 0000 0000110 1100 0001110 1000 1---110 0000 01--110 0000 001-110 0000 0001100 1000 0000100 0001 1---100 0000 01--100 0000 001-100 0000 ----101 ---- ----111 ---- .e Koodlukk – realisatsioon nupud | st | st+ | out ------+---------+---------+---- 0000 | s0 000 | s0 000 | 0 0100 | | s2p 001 | 0 1--- | | s0 000 | 0 0-1- | | s0 000 | 0 0-01 | | s0 000 | 0 ------+---------+---------+---- 0100 | s2p 001 | s2p 001 | 0 0000 | | s2m 011 | 0 1--- | | s0 000 | 0 0-1- | | s0 000 | 0 0-01 | | s0 000 | 0 ------+---------+---------+---- 0000 | s2m 011 | s2m 011 | 0 1000 | | s1p 010 | 0 -1-- | | s0 000 | 0 -01- | | s0 000 | 0 -001 | | s0 000 | 0 ------+---------+---------+---- 1000 | s1p 010 | s1p 010 | 0 0000 | | s1m 110 | 0 -1-- | | s0 000 | 0 -01- | | s0 000 | 0 -001 | | s0 000 | 0 ------+---------+---------+---- 0000 | s1m 110 | s1m 110 | 0 0001 | | s4p 100 | 0 1--- | | s0 000 | 0 01-- | | s0 000 | 0 001- | | s0 000 | 0 ------+---------+---------+---- 0001 | s4p 100 | s4p 100 | 0 0000 | | s0 000 | 1 1--- | | s0 000 | 0 01-- | | s0 000 | 0 001- | | s0 000 | 0 ------+---------+---------+---- tulemus 00011-- 1000 010000- 0010 -00001- 0100 000010- 0001 0000--1 0110 0000-10 1100 skeem t1 = i1'i2'i3'i4 q1 t2 = i1'i2 i3'i4'q1'q2' t3 = i2'i3'i4'q1'q2 rl = i1'i2'i3'i4'q1 q2' t5 = i1'i2'i3'i4'q3 t6 = i1'i2'i3'i4'q2 q3' d1 = t1+t6 d2 = t3+t5+t6 d3 = t2+t5 natuke optimeerimist t0 = i1'i2'i3'i4' t0 = not(i1+i2+i3+i4) rl = t0 q1 q2' t5 = t0 q3 t6 = t0 q2 q3' I207 - Digitaalloogika ja -süsteemid - L15
Vt. http://www.itcollege.ee/~lrv/I207/koodlukk.txt • Simulaator – http://www.falstad.com/circuit/ I207 - Digitaalloogika ja -süsteemid - L15