530 likes | 677 Views
VHDL RTL Ñинтеза. Увод. ПоÑтоји неколико алата за Ñинтезу које праве различити произвођачи. Они Ñе разликују у Ñкуповима команди и начину на који задајемо ограничења у Ñинтези.
E N D
Увод • Постоји неколико алата за синтезу које праве различити произвођачи. • Они се разликују у скуповима команди и начину на који задајемо ограничења у синтези. • Већина прихвата једино дизајн описан на нивоу трансфера међу регистрима (RTL) и генерише кола састављена од логичких гејтова и флип-флопова. • Ове разлике су мотивисале састављање IEEE стандарда 1076.6, Стандард за VHDL Register Transfer Level синтезу.
IEEE 1076.6 • Стандард дефинише подскуп VHDL језика који је „најмањи заједнички садржалац” и који би требало да је прихватљив већини алата за синтезу. • Стандард из 1999. године => користити VHDL-87. • Стандард из 2004. године =>користити VHDL-2002.
Типови података • Стандардом су дозвољени само следећи типови: • Типови набрајања, укључујући предефинисане типове boolean, bit и character. • Целобројни типови, укључујући предефинисане типове integer, natural i positive. • Једнодимензионални низови скалара и предефинисаних типовова bit_vector и string • std_ulogic, std_ulogic_vector, std_logic и std_logic_vector, дефинисани у пакету std_logic_1164 • unsigned и signed, дефинисани у пакету numeric_bit • unsigned и signed, дефинисани у пакету numeric_std
Имплементација скаларних типова • Предефинисани типови boolean и bit, као и стандардни логички типови std_logic и std_ulogic имплементирају се у хардверу као појединачни битови.
Имплементација скаларних типова • Кориснички дефинисана набрајања могу да се имплементирају кодирањем које зависи од алата. • Могуће је и задавање кодирања описујући тип стринг атрибутом enum_encoding: • attribute enum_encoding : string; Пример: type state is (idle, preamble, data, crc, ok, error); attribute enum_encoding of state : type is "000 001 010 011 100 111";
Имплементација скаларних типова • Целобројни типови се имплементирају као вектор битова. • Ако тип обухвата негативне вредности, користи се означено кодирање у комплементу двојке: type sample is range –64to 63; —7-битно кодирање у комплементу двојке subtype table_index is natural range 0 to 1023; — 10-битно неозначено кодирање • Алати који се придржавају стандарда треба да подржавају целе бројеве у опсегу –231 до +231 – 1
Композитни и остали типови – низови • Морају бити једнодимензионални и морају да се индексирају целобројним опсегом. • Границе морају бити статичке. • Тип елемента може бити неки од дозвољених скаларних типова или једнодимензиони вектор типа набрајања који представља појединачне битове.=> Забрањено је коришћење низова које ми дефинишемо у моделу.
Композитни и остали типови – низови Пример: • Следеће је дозвољено: type coeffs is array (3 downto 0) of integer; type channel_states is array (0 to 7) of state; — state је тип набрајања subtype word is bit_vector(31 downto 0); type reg_file is array (0 to 15) of word; • Следеће није дозвољено: type color is (red, green, blue); type plane_status is array (color) of boolean; —тип индекса није целобројни type matrix is array (1 to 3, 1 to 3) of real; —2D, елементи су floating–point типа type reg_file_set is array (0 to 3) of reg_file; — елементи нису вектори битова
Интерпретација стандардних логичких вредности • Синтетизован хардвер ради само са вредностима логичка 0 и логичка 1. • У моделу могу да се користе и друге стандардне вредности - металогичке вредности. • Употребу металогичких вредности пожељно свести на моделовање тростатичких бафера.
Интерпретација стандардних логичких вредности • Када модел сигналу додели стандардну логичку вредност 'Z', алат за синтезу генерише тростатички бафер за тај сигнал. Пример: if request_enable = '1' then request := ready; else request <= 'Z'; end if;
Интерпретација стандардних логичких вредности • Ако се металогичке вредности појаве као операнди у релационим операторима (осим једнакости), аритметичким, логичким и операторима померања, алат за синтезу не би требало да прихвати модел. • У случају једнакости, користити std_match.
Функција std_match • Дефинисана је у пакету numeric_std • Користи се за поређење стандардних логичких вредности и вектора. • Предност је што даје исте резултате и у симулацији и у синтези. То није случај са оператором "=" • Алати за синтезу представљају употребу функције std_match тестом еквиваленције. • Синтеза поређења коришћењем std_match са вектором који садржи "don't care" ('–') елементе производи хардвер за поређење који изоставља "don't care" битове из поређења.
Моделовање комбинационих мрежа • Коришћење наредби за конкурентну доделу сигналу. status <= ready and not limit_exceeded; status <= ready and (sample < limit);
Моделовање комбинационих мрежа • Наредба селекционе конкурентне доделе сигалу. Опис мултиплексера: with addr(1downto0) select request<=request_a when "00", request_b when "01", request_c when "10", request_dwhen "11";
Моделовање комбинационих мрежа • Опис мултиплексера коришћењем наредбе условне доделе сигналу: request <= request_a when addr(1 downto 0) = "00" else request_b when addr(1 downto 0) = "01" else request_c when addr(1 downto 0) = "10" else request_d when addr(1 downto 0) = "11"; • Овде услови не морају бити узајамно искључиви, па би алат за синтезу направио приоритетно кодован ланац мултиплексера. • Спорије од простог мултиплексера, зато је боље користити наредбу селекционе доделе.
Моделовање комбинационих мрежа • Наредба условне доделе сигналу је корисна код мреже са тростатичким баферима на излазу. data_bus<= resize(sample_byte, 16) when std_match(sample_enable, '1')else "ZZZZZZZZZZZZZZZZ"; или data_bus<= resize(sample_byte, 16) when std_match(sample_enable, '1')else (others => 'Z');
Моделовање комбинационих мрежа • Коришћење наредбе process • Процес мора бити осетљив на све улазе, излазима се мора доделити вредност у свим могућим гранама извршавања. read_sample : process ( read_enable, sample, limit_exceeded, ready )begin if std_match(read_enable, '1') then data <= sample; parity <= calc_parity(sample); status <= ready and not Iimit_exceeded; else data <= "ZZZZZZZZ"; parity <= 'Z'; status <= 'Z'; end if; end process read_sample;
Моделовање секвенцијалних мрежа • Стандард за синтезу порджава описивање синхроних мрежа. • Већина алата за синтезу, као и сам стандард, не подржавају синтезу асинхроних мрежа. • Сигнали такта морају бити типа bit, std_ulogic или подтип као што је std_logic. Није обавезно да буду скалари, могу бити и елементи низова bit или std_ulogic вредности.
Моделовање мрежа са ивичним окидањем process_statement <= [ process_label : ] process (clock_signal_name) { process_declarative_item } begin if clock_edgethen { sequential_statement } end if ; end process [process_label ] ; • Секвенцијалне наредбе треба да опишу комбинациону мрежу за рачунање нових вредности регистара.=> не користити wait наредбу нити референцирати ивичне (clock-edge) изразе.
Моделовање мрежа са ивичним окидањем • Израз clock_edge је израз догађаја. За растућу ивицу такта мора имати једну од следећих форми: rising_edge( clock_signal_name )clock_signal_name'eventandclock_signal_name= '1'clock_signal_name= '1' and clock_signal_name'eventnot clock_signal_name'stableand clock_signal_name= '1'clock_signal_name= '1' and not clock_signal_name'stable
Моделовање мрежа са ивичним окидањем • За опадајућу ивицу такта мора имати једну од следећих форми: falling_edge( clock_signal_name )clock_signal_name'eventandclock_signal_name= ‘0'clock_signal_name= ‘0' and clock_signal_name'eventnot clock_signal_name'stableand clock_signal_name= ‘0'clock_signal_name= ‘0' and not clock_signal_name'stable
Моделовање мрежа са ивичним окидањем • Пример: ивично окидан регистар simple_reg : process ( clk ) begin if clk'event and clk = '1' then reg_out <= data_in; end if; end process simple_reg;
Моделовање мрежа са ивичним окидањем • Претходни шаблон са додатим асинхроним улазима осетљивим на ниво: process_statement <= [ process_label : ] process ( clock_signal_name, asynchronous_signal_name{, ...}) {process_declarative_item } begin if boolean_expression then { sequential_statement } {elsif boolean_expression then { sequential_statement } } elsif clock_edge then { sequential_statement } end if; end process [process_label ] ;
Моделовање мрежа са ивичним окидањем • Сви контролни сигнали (коришћени у условима) морају бити у листи сигнала на које је процес осетљив;Исто важи и за сигнале који се користе у then гранама које представљају асинхрони дио мреже • Асинхроно се најчешће додељује константна вредност сигналима=> у листи осјетљивости се појављују само контролни сигнали. • Секвенцијални искази: • не садрже wait исказе, • користите ивичне изразе само за рачунање услова.
Моделовање мрежа са ивичним окидањем • Пример: бројач са асинхроним ресетом и уписом count_byte : process ( clk, rst_n, load, load_data ) variable count : unsigned(7 downto 0); begin if std_match(rst_n, '0') then count := "00000000"; q <= count; elsif std_match(Ioad, '1') then count := load_data; q <= count; elsif rising_edge(clk) then count := count + 1; q <= count; end If; end process count_byte;
Моделовање мрежа са ивичним окидањем • Треба приметити да редослед испитивања услова одређује приоритет асинхроног контролног сигнала! • У претходном примеру, ресет сигнал има већи приоритет од сигнала за упис.=> Ако се оба сигнала истовремено поставе на активан ниво, бројач ће се ресетовати.
Моделовање мрежа са ивичним окидањем • Шаблон код кога се користи једна wait наредба за имплементирање осетљивости на ивицу такта: process_statement <= [ process_label : ] processis { process_declarative_item } begin wait on <sensitivity_list>; if <condition> then <sequence_of_statements>; end if; end process [ process_label ] ; • Могуће је и коришћење више wait исказа (тако да сви имају исту ивицу такта у услову), али то алати често не дозвољавају.
Моделовање мрежа са ивичним окидањем • У претходном шаблону се може користити иwait until... • Tada je za clock-edge изразeмогуће користити и један од следећих: clock_signal_name= '1'clock_signal_name= '0‘ • Уколико у једном wait исказу постоји и асинхрони услов, онда треба да постоји исти такав услов у свим wait исказима посматраног процеса. • Ако услов испитује и асинхрони улаз, после wait следи испитивање који део услова је постао тачан.
Пример reg : process is begin wait until reset = '1' or rising_edge(clk); if reset = '1' then q <= X"00"; elsifrising_edge(clk) then if en = '1' then q <= d; end if; end if; end process dual_reg;
Моделовање мрежа са ивичним окидањем • Пример: померачки регистар са синхроним уписом shift_reg: process variable stored_value : bit_vector(7 downto 0); begin waituntil clk = '1'; If load = '1' then stored_value := load_data_in; q <= stored_value; else stored_value := stored_value(6 downto 0) & serial_data_in; q <= stored_value; end If; end process shift_reg;
Мреже осетљиве на ниво и последично памћење • У неким моделима, памћење стања се не задаје експлицитно. Алат за синтезу, на основу понашања модела, сам закључује да је потребно памћење стања. Ово се зове inferred storage. • Пример: транспарентно леч коло latch : process ( enable, d ) begin if enable = '1' then q <=d; end if; end process latch;
Мреже осетљиве на ниво и последично памћење • Понашање овог модела је имплицирано семантиком сигнала и доделе сигналима у VHDL-у. • Када алат за синтезу имплементира овај модел као хардверско коло, он мора да обезбеди памћење тренутне вредности за излаз. Значи потреба за памћењем је последица семантике модела.
Ограничења у VHDL моделовању: јединице дизајна • Све генеричке константе декларисане у заглављу ентитета морају бити целобројног типа. • Портови ентитета морају да задовољавају рестрикције типа описане раније. Све подразумеване вредности се игноришу приликом синтезе.
Ограничења у VHDL моделовању: процеси и подпрограми • Механизми за кашњење (inertial или transport) или after клаузула се игноришу. • Конкурентне наредбе доделе вредности сигналу могу да реферишу на ивичне (clock-edge) или изразе нивоа, али само у својим условима.
Ограничења у VHDL моделовању: конкурентне наредбе • Наредбе за генерисање су дозвољене, само што код итеративног генерисања границе морају бити специфициране у форми статичког опсега.
Ограничења у VHDL моделовању: имена и изрази • Већина имена атрибута не сме да се користи. Дозвољени су једино 'base, 'left, 'right, 'high, 'low, 'range, 'reverse_range и 'length. • Није дозвољено наводити која димензија низа треба да се користи. На пример, A'left(1) није прихватљиво. • Атрибути 'event и 'stable могу да се користе једино у clock-edge изразима.
Ограничења у VHDL моделовању: имена и изрази • Уместо оператора померања, могу се користити shift_left и shift_right функције дефинисане у пакетима numeric_bit и numeric_std. • Оператори "/", mod и rem се могу користити само у случају да су оба операнда статичка, или у случајевима када је десни операнд статички степен двојке. • Оператор "**" такође може да се користи само у случају када су оба операнда статичка, или у случајевима када је леви операнд статички познат као 2.
Ограничења у VHDL моделовању: метакоментари • Стандард за синтезу дефинише два метакоментара, тј. коментара које треба да интерпретира алат за синтезу. То су: rtl_synthesis off и rtl_synthesis on • Није битно да ли су написани малим или великим словима или њиховом комбинацијом. • Алат за синтезу ингнорише сав VHDL код који се налази иза rtl_synthesis off метакоментара и пре следећег rtl_synthesis on метакоментара.
1. заповест • Познавати структуру система који се дизајнира • Нацртати дијаграм протока података • Разумети временске зависности • Нацртати дијаграме КА • Тек када је осмишљен дизајн треба прећи на кодирање у VHDL-у • VHDL је начин да се поставе компоненте
2. заповест • ЈЕДАН ГЛОБАЛАН КЛОК • FF генеришу улаз за комбинациона кола • Комбинациона кола генеришу улаз FF • Једна и само једна вредност сигналау току једног циклуса сигнала такта • Екстерни асинхрони ресет може да се користи • FF само осетљиви на ивицу
2. заповест • СТРОГО ЗАБРАЊЕНО • Генерисање асинхроног сигнала ресета • Логика осетљива на ниво сигнала • Генерисање сигнала такта(Користити мултиплексер за Enable сигнал)
3. заповест Осетљивост процеса • Комбинациона мрежа • Осетљивост на све сигнале • Секвенцијална мрежа • Осетљивост само на клок,евентуално на асинхрони ресет
4. заповест Генерисање сигнала process (state, input) begin case state is when S1 => if input = ’1’ then output <= ’0’; end if; when S2 => output <= ’1’; end case; end process; process (state, input) begin case state is when S1 => if input = ’1’ then output <= ’0’; else output <= ’1’; end if; when S2 => output <= ’1’; end case; end process;
4. заповест Генерисање сигнала Алати за синтезу генеришу лечеве process (state, input) begin case state is when S1 => if input = ’1’ then output <= ’0’; end if; when S2 => output <= ’1’; end case; end process; process (state, input) begin case state is when S1 => if input = ’1’ then output <= ’0’; else output <= ’1’; end if; when S2 => output <= ’1’; end case; end process;
5. заповест Стања енумерисати type states is (START, RUN, IDLE, ZAPHOD); signal current, next : states; process (current) begin case current is when START => ... when RUN => ... when IDLE => ... end case; end process;
6. заповест Има заправо 9 заповести
7. заповест process (Clk, Reset) begin if Reset = ’1’ then Q <= ’0’; else if rising_edge(Clk) then Q <= D; end if; end if; end process; process (Clk) begin if rising_edge(Clk) then if Reset = ’1’ then Q <= ’0’; else Q <= D; end if; end if; end process; Користити само спољашњи асинхрони ресет Боље синхрони ресет (може и унутрашњи)
8. заповест • Користити само оне сигнале, који стварно постоје у дизајну, за тестирања • Прилагодити симулацију стварности јевећ ионако тежак посао