2.54k likes | 2.73k Views
Увод у VHDL. Увод. Строго типизиран. Није case sensitive . Основни елементи: библиотека : LIBRARY naziv_ biblioteke; USE naziv_biblioteke.naziv_paketa.deo_paketa; ентитет: ENTITY naziv_entiteta IS port( lista_portova); END [ENTITY][naziv_entiteta] архитектура:
E N D
Увод • Строго типизиран. • Није case sensitive. • Основни елементи: • библиотека: LIBRARY naziv_biblioteke; USE naziv_biblioteke.naziv_paketa.deo_paketa; • ентитет: ENTITY naziv_entiteta IS port( lista_portova); END [ENTITY][naziv_entiteta] • архитектура: ARCHITECTURE naziv_arhitekture OF naziv_ent IS deklarativna_sekcija BEGIN konkurentni_iskazi END [ARCHITECTURE][naziv_arhitekture];
Лексички елементи • Коментари • Идентификатори • Кључне речи • Специјални симболи • Бројеви • Карактери • Стрингови • Бит стрингови
Коментари • Коментар до краја реда почиње са -- • -- Ovo je komentar • Стандард VHDL-2008 уводи и коментар у више редова • /* Ovo je komentar u vise redova*/
Идентификатори • Идентификатори: • могу садржати мала и велика слова, бројеве и доњу црту "_"; • морају почети словом, • не смeју се завршити доњом цртом, • не смeју садржати доњу цртудва пута узастопно. • Проширени идентификатори • Од стандарда VHDL-93 • Пишу се између карактера \ • Могу да садрже све карактере
Примери • Исправни: • а • а0 • а_b • а_b_c • \a____v$324\ -- проширени идентификатор • Неисправни: • a? --недозвољен знак • 0a --не почиње словом • ab_ --завршава се са доњом цртом • a__b --садржи двe узастопне доње црте
Специјални симболи • Један карактер • " # & ' ( ) * + - , . / : ; < = > ? @ [ ] ` | • Више карактера • => ** := /= >= <= <> ?? ?= ?/= ?> ?< ?>= ?<= << >>
Целобројни литерали • Декадне константе: • 0 10 22 • -32 је комбинација оператора '-' и константе 32 • Декадне константе са експонентом: • 10е2 12Е14 • експонент је ненегативан цeо број • Константе у основи из опсега 2..16: • бинарна: 2#1000000000000# = 2#1#е12 • октална: 8#12000# = 8#12#Е3 • хексадесимална: 16#F1A# =16#f1a#е0 • Раздвајање цифара помоћу доње црте • 2_150_252 • 2#1100_0101_1010#
Реални литерали • Декаднереалне константе: • 0.1 1.0 2.2 • Декадне реалне константе константе са експонентом: • 1.0е2 1.2Е-14 • експонент је цeо број • Реалне константе у основи из опсега 2..16: • бинарна: 2#1000000000000.0# = 2#1.0#е12 • октална: 8#1200.0# = 8#1.2#Е3 • хексадецимална: 16#F1.A# = 16#f1.a#е0
Знаковни литерали и литерали стрингова • Знакови: • 'а', 'А', '1', ... • Стрингови: • "Pera", • "Mika", • "Tekst ""pod"" dvostrukim navodnicima" • Оператор & служи за надовезивање стрингова
Бит стрингови • Стрингови који описују бинарне вриједности • садрже само цифре у одговарајућој основи. • Бројни системи: • бинарни: B"1001010", B"0010_0110" • октални: О"1532" • хексадецимални: Х“a3b5" • декадни: D"123" -- подржано тек у стандарду VHDL-2008
Типови • VHDL је строго типизиран језик. • Тип дефинише: • скуп вредности • могуће операције • Скаларни типови • цели бројеви • реални бројеви • физичке величине • типови којима се описује један бит • знакови • набројиви • логички • Сложени типови • фајлови • низови • записи
Целобројни типови • Основни: INTEGER (по стандарду минимално 32 бита) • Дефинисање: RANGEizraz( TO I DOWNTO ) izraz • to: растуће уређени бројеви • downto: опадајуће уређени бројеви • Операције: • + сабирање • – одузимање, или негација • * множење • / дељење • mod модуо • rem остатак • abs апсолутна вриједност • ** експонент • Различит тип од бит вектора • Почетна вредност је најмања вредност у скупу
Дефинисање новог типа • type_declaration ⇐ typeidentifikator_tipa is definicija_tipa ; • Примери: type apples is range 0 to 100; type oranges is range 0 to 100; • Типови су различити иако су дефиниције идентичне. • Није дозвољено вредност једног типа доделити променљивој другог типа.
Дефинисање подтипа • subtype_declaration ⇐ subtype identifikatoris subtype_indication ; • subtype_indication ⇐ type_mark [ range simple_expression ( to I downto ) simple_expression ] • Пример: subtypesmall_int is integer range -128 to 127; variablepomeraj : small_int; variablepozicija : integer; • Исправно је и: pozicija := pozicija + pomeraj; • Резултат се може сместити и у објекат подтипа • ако резултат изађе из опсега, пријављује се грешка.
Набројиви типови • Дефинисање набројивог типа typenaziv_tipais(prva_vrednost{,...} ); • Примјер: • typestanje is(spreman, radi, zavrsio); • Погодан за описивање машина стања • Могуће мењати кодирање стања • Напомена: константе истог назива из различитих типова су различите константе.
Физичке величине • Користи се за опис реалних физичких величина • За нас од интереса само време:type time israngeimplementation definedunitsfs;ps = 1000 fs;ns = 1000 ps;us = 1000 ns;ms = 1000 us;sec = 1000 ms;min = 60 sec;hr = 60 min;endunits;
Битови • Предефинисани набројиви тип са могућим вредностима: • '0' • '1' • Дефинисане су стандардне логичке операције: • and • or • not • xor • ...
std_logic • Скуп могућих вредности: • 'U' – неиницијализовано • 'X' – строго непознато • '0' – строго 0 • '1' – строго 1 • 'Z' – стање високе импедансе • 'W' – слабо непознато • 'L' – слабо 0 • 'H' – слабо 1 • '-' – није битно • Ретко се користе све вредности • Велики скуп различитих вредности боље моделује понашање реалног система • олакшава детектовање и уклањање грешака • За проверу поклапања нивоа испред релационих оператора додати упитник. • Тачно је: '0' /= 'L' , али и '0' ?= 'L' • На почетку сваког фајла неопходно укључити IEEE библиотеку: library ieee; use ieee.std_logic_1164.all;
Низови • Дефинисање: TYPE naziv_tipa IS ARRAY(granica[TO|DOWNTO] granica {,...}) OFtip_pojedinačnog_elementa; • Групишу више елемената истог типа заједно • Погодни за опис магистрала: TYPE address_buss IS ARRAY (63 DOWNTO 0) OF std_logic; • Постоје предефинисани типови: • std_logic_vector • bit_vector
std_logic_vector • Не постоји нумеричка интерпретација std_logic_vector типа • Аритметичке операције не постоје • Сигнали std_logic_vector типа не могу да се користе као идекси низова • Решење: • Користити пакете из библиотека ieee.numeric_std и ieee.numeric_bit • Користити пакете из библиотека ieee. std_logic_arith и ieee. std_logic_unsigned и ieee. std_logic_signed • Препоручује се прва варијанта • Не препотставља ништа о представи броја (све мора експлицитно) • Друга је наметнута од стране једне компаније
numeric_std type UNSIGNED is array ( NATURAL range <> ) of STD_LOGIC; type SIGNED is array ( NATURAL range <> ) of STD_LOGIC; ... -- Id: A.3 function "+" (L,R: UNSIGNED ) return UNSIGNED; -- Result subtype: UNSIGNED(MAX(L'LENGTH, R'LENGTH)-1 downto 0). -- Result: Adds two UNSIGNED vectors that may be of different lengths. ...
numeric_std -- Id: D.1 function TO_INTEGER ( ARG: UNSIGNED) return NATURAL; -- Result subtype: NATURAL. Value cannot be negative since parameter is an -- UNSIGNED vector. -- Result: Converts the UNSIGNED vector to an INTEGER.
numeric_std signal reg : std_logic_vector(7 downto 0); signal reg_unsigned:unsigned(7 downto 0); • Конверзија UNSIGNED STD_LOGIC_VECTOR • reg_unsigned <= unsigned(reg); • reg <= std_logic_vector(reg_unsigned);
Подаци у VHDL • Постоје 3 класе објеката за чување података: • константе • променљиве • сигнали
Константе • Дефинисање:CONSTANTidentifier { , … } : subtype_indication [ := expression ] ; • За сада, израз за почетну вредност сматрамо обавезним. • Примери дефинисања: • constant number_of_bytes : integer := 4; • constant number_of_bits : integer := 8 * number_of_bytes; • constant e : real := 2.718281828; • constant prop_delay : time := 3 ns; • constant size_limit, count_limit : integer := 255;
Променљиве • Декларисање:VARIABLEidentifier { , … } : subtype_indication [ := expression ] ; • Користе се у процесима, потпрограмима и функцијама • свака променљива сме бити видљива и коришћена у само једном процесу (осим дељених). • Пример: • variable index : integer := 0; • variable sum, average, largest : real; • variable start, finish : time := 0 ns; • Последња линија је еквивалентна са: • variable start : time := 0 ns; • variable finish : time := 0 ns;
Додела вредности променљивој • promenljiva := izraz; • Увек секвенцијални исказ • Израз мора бити истог типа као и променљива • Променљиве тренутно добијају нову вриједност • променљива може и у истом симулационом циклусу да промени вриедност више пута, • све промене су видљиве и у текућем симулационом циклусу.
Сигнали • Концепт који је осмишљен да би се описале везе које постоје у реалним системима. • Битно се разликују од променљивих. • Дефинисање сигнала: • SIGNAL identifikator {,...}: tip [register|bus] [:=izraz]; • Израз за почетну вредност битан само при симулацији; при синтези се одбацује
Додела вредности сигналу • Битно се разликује од доделе вредности променљивој: • Додела вредности није тренутна – у току симулационог циклуса вредност сигнала се не мења. • Дифинише се трансакција: • вредност и • тренутак када сигнал треба да добије задату вредност. • Више сигнала може у истом тренутку променити вредност. • Свака нова трансакција брише све трансакције заказане за исти или наредни тренутак за дати сигнал • Врсте исказа за доделу вредности сигналу: • секвенцијална, • конкурентна.
Ентитет • entity identifier is [ generic ( generic_list ) ;] [ port (port_interface_list ) ; ] { entity_declarative_item }end [ entity ] [ identifier ] ; • interface_list ⇐ ( identifier { , … } : [ mode ] subtype_indication [ := expression ] ) { ; … } • mode ⇐ in I out I buffer I inout • Декларативни део ентитета је заједнички за све имплементације (архитектуре).
Архитектура • architecture identifier of entity_name is { block_declarative_item }begin { concurrent_statement }end [ architecture ] [ identifier ] ; • concurrent_statement <= concurrent_signal_assignment_statement | process_statement | block_statement | concurrent_procedure_call_statement | concurrent_assertion_statement | component_instantiation_statement | generate_statement
Конкурентна додела вредности сигналу • Постоје 3 врсте: • Додела једног фиксног израза • Додела једног од више израза: • Селекциона додела вредности • Условна додела вредности
Конкурентна додела фиксног израза • Додела вредности сигналу као исказ у телу архитектуре. • Синтакса: [label:] (name|aggregate) <= [delay_mechanism] waveform delay_mechanism <= transport |[reject time_expression] inertial waveform <= (value_expression [after time_expression] | null [after time_expression]) {,...} |unaffected • Извршава се увек када дође до догађаја на неком од сигнала који учествују у изразу за израчунавање нове вриједности. • Генерише се комбинациона логика.
Пример • entity mux isport(d0, d1, d2, d3, sel0, sel1:in bit; z:out bit);end entity; • architecture dataflow of mux isbeginzmux: z <= (d0 and not sel1 andnotsel0)or(d1 and not sel1 and sel0) or(d2 and sel1 and not sel0)or(d3 and sel1 and sel0);end architecture;
Селекциона додела вредности • with expression select[?] name <= [delay_mechanism] {waveform when choices, } waveform when choices; • Погодно када нова вредност зависи од вредности неког конкретног израза. • Опциони упитник има исту улогу као испред релационих оператора. • Примерalu: with alu_function selectresult <= a + b after Tpd when alu_add | alu_add_unsigned,a - b after Tpd when alu_sub | alu_sub_unsigned,a and b after Tpd when alu_and,a or b after Tpd when alu_or,a after Tpd when alu_pass_a;
Пример • entity mux isport(d0, d1, d2, d3:in bit;sel:in bit_vector(1 downto 0);z:out bit);end entity; • architecture dataflow of mux isbeginwith sel selectz <= d0 when "00",d1 when "01",d2 when "10",d3 when "11";end architecture;
Условна додела вредности • name <= [delay_mechanism] {waveform whenboolean_expression else } waveform [whenboolean_expression]; • Погодно када се услов не може за сваки случај добити поређењем вредности једног израза са неком вредношћу. • Приоритетно испитивање услова; додељује се прва вредност код које је услов тачан и прекида се даље испитивање преосталих услова.Примјерzmux: z <= d0 when sel1 = '0'and sel0 = '0'else d1 when sel1 = '0'and sel0 = '1'else d2 when sel1 = '1'and sel0 = '0'else d3 when sel1 = '1'and sel0 = '1';
Упоредни приказ претходна 3 синтетизована модела
Конкурентна додела вредности и секвенцијална логичка кола? • Претходни примери:Условна и селекциона додела вредности се синтетизују као комбинациона логичка кола • У свим условима генерисана нова вриједност за сигнал Z. • Уколико се догоди да при се промени неког улазног сигнала не дефинише нова вриједност сигнала Z, алати ће претпоставити да вриједност треба да остане неизмењена; • Пошто се може догодити да то није била жеља дизајнера, алат ће дизајнера информисати о томе • Вероватно ће бити генерисано упозорење да меморијски елементи можда неће радити како треба, зашто?
Пример – секвенцијално коло • entity mux isport(d0, d1, d3:in bit; sel0, sel1:in bit; z:out bit);end entity; • architecture dataflow of mux isbeginz <= d0 when sel1 = '0' and sel0 = '0' else d1 when sel1 = '0' and sel0 = '1' else--d2 when sel1 = '1' and sel0 = '0' else d3 when sel1 = '1' and sel0 = '1';end architecture;
Синтетизовани модел – технолошки поглед