Download presentation
Presentation is loading. Please wait.
Published byColin Ferguson Modified over 6 years ago
1
Компонента Декларација vs дефиниција. Могу се декларисати у:
component_declaration ⇐ component identifier ⟦ is ⟧ ⟦ generic (generic_interface_list); ⟧ ⟦ port (port_interface_list); ⟧ end component ⟦ identifier ⟧; Декларација vs дефиниција. Могу се декларисати у: декларативном делу архитектуре, декларативном делу generate исказа, пакетима (у овом случају у декларативном делу архитектуре треба увести назив компоненте користећи use исказ).
2
Пример component flipflop is generic( Tprop : delay_length; Tsetup : delay_length; Thold : delay_length ); port( clk : in bit; clr : in bit; d : in bit; q : out bit ); end component flipflop;
3
Инстанцирање компонената
component_instantiation_statement ⇐ instantiation_label: ⟦ component ⟧ component_name ⟦ generic map (generic_association_list) ⟧ ⟦ port map (port_association_list) ⟧;
4
Пример (1/3) entity reg4 is port( clk : in bit; clr : in bit; d : in bit_vector(0 to 3); q : out bit_vector(0 to 3) ); end entity reg4;
5
Пример (2/3) architecture struct of reg4 is component flipflop is generic( Tprop : delay_length; Tsetup : delay_length; Thold : delay_length ); port( clk : in bit; clr : in bit; d : in bit; q : out bit ); end component flipflop; ...
6
Пример (3/3) ... begin --architecture bit0: component flipflop
generic map( Tprop => 2ns, Tsetup => 2ns, Thold => 1ns ) port map( clk => clk, clr => clr, d => d(0), q => q(0) ); bit1: component flipflop clk => clk, clr => clr, d => d(1), q => q(1) end architecture struct;
7
Конфигурисање компонената
Свака компонента може имати више реализација. Инстанциране компоненте се помоћу конфигурације везују за жељене ентитете. Конфигурација представља јединицу дизајна (исто као и ентитет, архитектура, пакет или тело пакета), па се стога декларише у глобалном опсегу.
8
Конфигурисање компонената
configuration_declaration ⇐ configuration identifier of entity_name is block_configuration end ⟦ configuration ⟧ ⟦ identifier ⟧; block_configuration(*) ⇐ for architecture_name ⦃ for component_specification binding_indication; end for; ⦄ end for; component_specification ⇐ ⦅ instantiation_label ⦃,...⦄ | others | all ⦆ : component_name binding_indication(*) ⇐ use entity entity_name ⟦ (architecture_identifier) ⟧ Називи портова компоненте и ентитета за који се везује се морају поклапати. (*) – упрошћен облик синтаксе
9
Пример configuration reg4_gate_level of reg4 is for struct -- architecture struct for bit0 : flipflop use entity edge_triggered_Dff(hi_fanout); end for; for others : flipflop use entity edge_trigerd_Dff(basic); end for; end for; -- end architecture struct end configuration reg4_gate_level;
10
Конфигурисање компонената
Ако се компонента везује са ентитетом за који је такође потребна конфигурација, тада се при везивању уместо: use entity naziv_entiteta користи: use configuration naziv_konfiguracije Могуће је угнездити конфигурације: не препоручује се јер није прегледно. Могуће је директно инстанцирати конфигурацију: instantiation_label : configuration configuration_name ⟦ generic map (generic_association_list) ⟧ ⟦ port map (port_association_list) ⟧;
11
Пример configuration counter_down_to_gate_level of counter is for registered -- architecture registered for all : digit_register use configuration work.reg4_gate_level; end for; bindings for other component instances end for; -- end architecture registered end configuration counter_down_to_gate_level;
12
Конфигурисање Омогућава ремапирање портова и генеричких константи, као и прилагођавање ентитета компонентама binding_indication(*) ⇐ use ⦅ entity entity_name ⟦ (architecture_identifier) ⟧ | configuration configuration_name | open ⦆ ⟦ generic map (generic_association_list) ⟧ ⟦ port map (port_association_list) ⟧
13
Пример (1/3) architecture structure of computer_system is component decoder_2_to_4 is generic( prop_delay : delay_length ); port( in0, in1 : in bit; out0, out1, out2, out3 : out bit ); end component decoder_2_to_4; begin interface_decoder : component decoder_2_to_4 generic map( prop_delay => 4 ns ) port map( in0 => addr(4), in1 => addr(5), out0 => interface_a_select, out1 => interface_b_select, out2 => interface_c_select, out3 => interface_d_select end architecture structure;
14
Пример (2/3) Потребан нам је декодер 2 на 4, а на располагању имамо декодер 3 на 8: entity decoder_3_to_8 is generic( Tpd_01, Tpd_10 : delay_length ); port( s0, s1, s2 : in bit; enable : in bit; y0, y1, y2, y3, y4, y5, y6, y7 : out bit ); end entity decoder_3_to_8;
15
Пример (3/3) configuration computer_structure of computer_system is for structure -- architecture structure for interface_decoder : decoder_2_to_4 use entity work.decoder_3_to_8(basic) generic map( Tpd_01 => prop_delay, Tpd_10 => prop_delay ) port map( s0 => in0, s1 => in1, s2 => '0', enable => '1', y0 => out0, y1 => out1, y2 => out2, y3 => out3, y4 => open, y5 => open, y6 => open, y7 => open ); end for; end for; -- end architecture structure end configuration computer_structure;
16
Одложено везивање binding_indication(*) ⇐ use open Користи се у сложеном дизајну када је потребно тестирати само један део система који је тренутно завршен.
17
Генерисање структура Конкурентан исказ.
for_generate_statement ⇐ generate_label: for identifier in discrete_range generate generate_statement_body end generate ⟦ generate_label ⟧; generate_statement_body ⇐ ⟦ ⦃ block_declarative_item ⦄ begin ⟧ ⦃ concurrent_statement ⦄ ⟦ end; ⟧ Конкурентан исказ. Користи се у случају репликације компонената.
18
Пример (1/3) Опис регистра генеричке ширине.
entity register_tristate is generic( width : positive ); port( clock : in std_logic; out_enable : in std_logic; data_in : in std_logic_vector(0 to width-1); data_out : out std_logic_vector(0 to width-1) ); end entity register_tristate;
19
Пример (2/3) architecture cell_level of register_tristate is component D_flipflop is port( clk, d : in std_logic; q : out std_logic ); end component D_flipflop; component tristate_buffer is a, en : in std_logic; y : out std_logic end component tristate_buffer;
20
Пример (3/3) begin cell_array: for bit_index in 0 to width-1 generate signal data_unbuffered : std_logic; cell_storage: component D_flipflop port map( clk => clock, d => data_in(bit_index), q => data_unbuffered ); tristate_log: component tristate_buffer a => data_unbuffered, en => out_enable, y => data_out(bit_index) end generate cell_array; end architecture cell_level;
21
Условно генерисање структура
if_generate_statement ⇐ generate_label: if ⟦ alternative_label: ⟧ condition generate generate_statement_body ⦃ elsif ⟦ alternative_label: ⟧ condition generate generate_statement_body ⦄ ⟦ else ⟦ alternative_label: ⟧ generate generate_statement_body ⟧ end generate ⟦ generate_label ⟧; elsif и else су присутни тек од VHDL-2008.
22
Конфигурисање генерисаних компоненти
block_configuration(*) ⇐ for ⦅ architecture_name | block_statement_label | generate_statement_label ⟦ ( ⦅ static_discrete_range | static_expression | alternative_label ⦆ ) ⟧ ⦆ ⦃ block_configuration | ⦅ for component_specification ⟦ binding_indication; ⟧ ⟦ block_configuration ⟧ end for; ⦆ ⦄ end for;
23
Пример (1/2) generate statement label (for)
adder: for i in width-1 downto 0 generate signal carry_chain : unsigned(width-1 downto 1); begin adder_cell: if most_significant: i = width-1 generate add_bit: component full_adder port map (...); elsif least_significant: i = 0 generate add_bit: component half_adder else middle: generate end generate adder_cell; end generate adder; generate statement label (if) alternative label instantiation label component name
24
Пример (2/2) configuration widget_cfg of arith_unit is for ripple_adder -- architecture ripple_adder for adder -- for generate statement adder for adder_cell(most_significant) -- if generate statement adder_cell for add_bit: full_adder -- component specification use entity widget_lib.full_adder(asic_cell); end for; for adder_cell(middle) -- if generate statement adder_cell for adder_cell(least_significant) -- if generate statement adder_cell for add_bit: half_adder -- component specification use entity widget_lib.half_adder(asic_cell); end for; -- end if generate statement adder_cell end for; -- end for generate statement adder end for; -- end architecture ripple_adder end configuration widget_cfg;
25
Ентитет и конкурентни искази
entity identifier is ⟦ generic (generic_interface_list); ⟧ ⟦ port (port_interface_list); ⟧ ⦃ entity_declarative_item ⦄ ⟦ begin ⦃ concurrent_assertion_statement | passive_concurrent_procedure_call_statement | passive_process_statement ⦄ ⟧ end ⟦ entity ⟧ ⟦ identifier ⟧;
26
Пример Опис RS леч кола: entity RS_latch is port( r, s: in;
q, q_n: out bit ); begin check: assert not (r = ‘1’ and s = ‘1’) report “Incorrect use: r and s both ‘1’”; end entity RS_latch;
27
register | bus Морају бити разрешени сигнали.
signal_declaration ⇐ signal identifier ⦃,...⦄ : subtype_indication ⟦ register | bus ⟧ ⟦ := expression ⟧; Морају бити разрешени сигнали. Када су дисконектовани сви драјвери сигнала: register (памти се последња вредност сигнала) bus (позива се функција за разрешавање са празним низом драјвера како би се одредила нова вредност сигнала)
28
Разрешени сигнали Користе се када за један сигнал има више драјвера који генеришу његову вредност. Служе искључиво за потребе симулације за моделовње ситуација које није могуће моделовати са две вредности. Пример (моделовање стања високе импедансе): type tri_state_logic is (‘0’, ‘1’, ‘Z’); type tri_state_logic_array is array (integer range <>) of tri_state; signal s : resolve_tri_state_logic tri_state_logic; Испред идентификатора типа сигнала наводи се идентификатор функције за разрешавање. Приликом доделе нове вредности сигналу, позива се функција којој се као параметар прослеђује низ драјвера. Резултат позване функције се додељује сигналу.
29
Пример функције за разрешавање
function resolve_tri_state_logic (values : in tri_state_array) return tri_state_logic is variable result : tri_state_logic := ‘Z’; begin for index in values’range loop if values(index) /= ‘Z’ then result := values(index); end if; end loop; return result; end function resolve_tri_state_logic; Која претпоставка мора важити да би функција вратила очекивани резултат?
30
Пример разрешеног подтипа (1/2)
type MVL4_ulogic is (‘X’, ‘0’, ‘1’, ‘Z’); type MVL4_ulogic_vector is array (natural range <>) of MVL4_ulogic; type table is array (MVL4_ulogic, MVL4_ulogic) of MVL4_ulogic; constant resolution_table : table := -- ‘X’ ‘0’ ‘1’ ‘Z’ (( ‘X’, ‘X’, ‘X’, ‘X’), -- ‘X’ ( ‘X’, ‘0’, ‘X’, ‘0’), -- ‘0’ ( ‘X’, ‘X’, ‘1’, ‘1’), -- ‘1’ ( ‘X’, ‘0’, ‘1’, ‘Z’)) -- ‘Z’
31
Пример разрешеног подтипа (2/2)
function resolve_MVL4 (contribution : MVL4_ulogic_vector) return MVL4_ulogic is variable result : MVL4_ulogic := 'Z' begin for index in contribution’range loop result:=resolution_table(result, contribution(index)); end loop; return result; end function resolve_MVL4; subtype MVL4_logic is resolve_MVL4 MVL4_ulogic;
32
Разрешавање вектора subtype MVL4_logic_vector is (resolve_MVL4) MVL4_ulogic_vector; Заграде око функције за разрешавање говоре да се она примењује на елементе вектора, а не на читав вектор. Могуће је имати и већи број заграда: на пример, ако се разрешавају елементи матрице, користе се две заграде.
33
Разрешавање std_ulogic
34
Фајл као тип података Дефиниција типа фајла. Пример:
file_type_definition ⇐ file of type_mark Дефиниција типа фајла. Пример: type integer_file is file of integer;
35
Декларација објекта класе фајл
file_declaration ⇐ file identifier ⦃,...⦄ : subtype_indication ⟦ ⟦ open file_open_kind_expr ⟧ is "naziv_fajla" ⟧; type file_open_kind is (read_mode, write_mode, append_mode); Подразумевано за фајлове на диску: read_mode.
36
Отварање фајла Ако у декларацији фајла јесте наведено open:
фајл декларисан у пакету, архитектури или процесу: отвара се имплицитно на почетку симулације, затвара се имплицитно на крају симулације. фајл декларисан у потпрограму: отвара се приликом позива потпрограма, затвара се приликом повратка из потпрограма.
37
Отварање фајла Ако у декларацији фајла није наведено open:
фајл се отвара и затвара експлицитно: отварање: procedure file_open( file f : file_type; external_name : in string; open_kind : in file_open_kind := read_mode ); затварање: procedure file_close( file f : file_type
38
Читање из фајла Имплицитно дефинисани потпрограми:
procedure read( file f : file_type; value : out element_type ); function endfile( file f : file_type ) return boolean; Читање почиње од почетка фајла. Текућа позиција унутар фајла се помера након читања.
39
Пример (1/3) library ieee; use ieee.std_logic_1164.all; entity ROM is generic( load_file_name : string ); port( sel : in std_ulogic; address : in std_ulogic_vector; data : inout std_ulogic_vector end entity ROM; Иницијализовање ром меморије.
40
Пример (2/3) architecture behavioral of ROM is begin behavior : process is subtype word is std_ulogic_vector(0 to data'length - 1); type storage_array is array (natural range 0 to 2**address'length - 1) of word; variable storage : storage_array; variable index : natural; other declarations type load_file_type is file of word; file load_file : load_file_type open read_mode is load_file_name;
41
Пример (3/3) begin -- process -- load ROM contents from load_file
index := 0; while not endfile(load_file) loop read(load_file, storage(index)); index := index + 1; end loop; -- respond to ROM accesses loop ... end process behavior; end architecture behavioral;
42
Упис у фајл Имплицитно дефинисан потпрограм:
procedure write( file f : file_type; value : in element_type ); Услед отварања фајла за упис, креира се нови фајл; ако је већ постојао истоимени фајл, биће обрисан. Ако је фајл отворен у моду append_mode, дописује се на крај фајла. ако фајл не постоји, биће креиран нови, омогућава акумулацију резултата низа симулација. Користи се да се резултати симулације сачувају у фајл: мерење фреквенције појединих инструкција, утицај параметара дизајна на перформансе, итд.
43
Преносивост Претходно описани фајлови су бинарни фајлови.
Начин кодирања података у бинарном фајлу зависи од алата и система. Решење којим се постиже преносивост јесте употреба текстуалних фајлова.
44
Пакет textio Користи се показивач на стринг:
type line is access string; Дефинисан је тип текстуалног фајла: type text is file of string; Тип за дефинисање поравнања: type side is (right, left); Тип за ширину поља приликом исписа: subtype width is natural; Предефинисани су фајлови за стандардни улаз и излаз: file input : text open read_mode is "STD_INPUT"; file output : text open write_mode is "STD_OUTPUT"; access – показивач
45
Читање из текстуалног фајла
Имплицитно дефинисан потпрограм: procedure readline( file F : text; L : inout line ); Чита једну линију текста из улазног фајла: алоцира динамички стринг, учита једну линију текста из улазног фајла у тај стринг, враћа показивач на тај стринг кроз параметар L Тај показивач на стринг се користи као аргумент једног од преклопљених потпрограма read (функција за конверзију) како би се из тог стринга извадила вредност жељеног типа.
46
Читање из текстуалног фајла
За сваки од преклопљених потпрограма read важи следеће: ако је читање успешно, из стринга се брише прочитано, варијанте са 2 и 3 параметра се разликују у случају неуспеха, верзија са два параметра пријављује грешку ако читање није успело; сви подаци остају неизмењени, верзија са три параметра поставља трећи параметар на нетачно ако читање није успело; сви подаци остају неизмењени.
47
Читање знакова procedure read( L : inout line; value: out character ); value: out character; good : out boolean
48
Читање стрингова procedure read( L : inout line; value: out string ); Чита тачно онолико знакова колики је одредишни стринг; Ако нема довољно знакова, читање је неуспешно.
49
Читање стрингова Прескаче бланко знакове на почетку.
procedure sread( L: inout line; value : out string; strlen: out natural ); Прескаче бланко знакове на почетку. Чита највише онолико континуалних небланко знакова колико стаје у стринг; У оквиру параметра strlen враћа број учитаних знакова. Пример за стринг величине 4 знака: ако је садржај линије " st ring ", биће учитано "st"
50
Читање битова procedure read( L : inout line; value : out bit );
51
Читање битвектора Ако стринг садржи бинарно записане векторе:
procedure read( L : inout line; value : out bit_vector ); alias bread is read [line, bit_vector]; Ако стринг садржи хексадецимално записане векторе: procedure hread( У оба случаја у фајлу је константа без ознаке основе. За std_logic постоје одговарајуће функције у пакету ieee.std_logic_textio. При читању хексадецимално записаног вектора, највиши бити се одбацују и морају бити 0. Као део вектора може да се нађе и доња црта.
52
Читање времена и бројева
Читање времена: procedure read( L : inout line; value : out time ); време мора бити записано са размаком између броја и јединице времена Читање целих бројева: value: out integer
53
“Универзални тест” Процес који улазне тест векторе чита из фајла.
Могуће је извршити низ различитих симулација користећи један исти testbench мењајући само улазни фајл (без потребе за рекомпилацијом). Пример улазног фајла: 0 ms on 2 ms fail 0 15 ms temp 56 100 ms set 70 1.5 sec on
54
Пример – “универзални тест” (1)
stimulus_interpreter : process is use std.textio.all; file control : text open read_mode is "control"; variable command : line; variable read_ok : boolean; variable next_time : time; variable whitespace : character; variable signal_id : string(1 to 4); variable temp_value, set_value : integer; variable on_value, fail_value : bit; begin
55
Пример – “универзални тест” (2)
command_loop : while not endfile(control) loop -- čitanje jedne linije iz fajla readline( control, command ); -- čitanje trenutka kada treba da se izvrši promena read( command, next_time, read_ok ); if not read_ok then report "error reading time from line: " & command.all severity warning; next command_loop; end if; wait for next_time - now;
56
Пример – “универзални тест” (3)
-- preskakanje blanko znakova while command'length > 0 and ( command(command'left) = ' ' -- obican space or command(command'left) = ' ' -- non breaking or command(command'left) = HT ) loop read( command, whitespace ); end loop;
57
Пример – “универзални тест” (4)
-- čitanje naziva signala read( command, signal_id, read_ok ); if not read_ok then report "error reading signal id from line: “ & command.all severity warning; next command_loop; end if;
58
Пример – “универзални тест” (5)
-- dispatch based on signal id case signal_id is when "temp" => read( command, temp_value, read_ok ); if not read_ok then report "error reading temperature value from line: " & command.all severity warning; next command_loop; end if; temperature <= temp_value; when "set " => ... -– slično prethodnom
59
Пример – “универзални тест” (6)
when "on " => read( command, on_value, read_ok ); if not read_ok then report "error reading on value from line: " & command.all severity warning; next command_loop; end if; enable <= on_value; when "fail" => ... -– slično prethodnom
60
Пример – “универзални тест” (7)
when others => report "invalid signal id in line: " & signal_id severity warning; next command_loop; end case; end loop command_loop; wait; end process stimulus_interpreter;
61
Упис у текстуални фајл Прво се изврши конверзија из задатог типа у линију (тип података line), па се потом линија упише у фајл. Упис само у задати фајл: procedure writeline ( file F : text; L : inout line ); Упис и у задати фајл и на стандардни излаз: procedure tee ( file F : text; L : inout line ); Ако је L = null, на излаз се исписује празна линија.
62
Упис у текстуални фајл function justify ( value : string; justified : side := right; field : width := 0 ) return string; Стринг value се у новом стрингу ширине field поравнава уз задату ивицу justified; Остатак резултујућег стринга се попуњава бланко знацима Аналогно важи и за остале процедуре, с тим што се резултујући стринг надовезује на крај линије.
63
Упис стрингова procedure write( L : inout line; value : in string; justified : in side := right; field : in width := 0 ); alias swrite is write [line, string, side, width];
64
Упис битова procedure write( L : inout line; value : in bit; justified : in side := right; field : in width := 0 );
65
Упис битвектора procedure write( L : inout line; value : in bit_vector; justified : in side := right; field : in width := 0 ); alias bwrite is write [line, bit_vector, side, width]; procedure hwrite(
66
Упис времена и бројева procedure write( L : inout line; value : in time; justified : in side := right; field : in width := 0; unit : in time := ns ); value : in integer; field : in width := 0
67
Упис у текстуални фајл Приликом уписа константи типа string или bit_vector неопходно је навести тип константе. Пример: write( L, string'( "fred" ) ); write( L, ' ' ); write( L, bit_vector'( X"3A" ) ); Садржај резултујуће линије ако је линија на почетку била празна: fred
68
VHDL RTL синтеза
69
Увод Постоји већи број алата за синтезу које праве различити произвођачи. Алати се међусобно разликују у скуповима команди и начину на који задајемо ограничења у синтези. Већина алата прихвата једино дизајн описан на нивоу трансфера међу регистрима (RTL) и синтетише мреже састављене од логичких кола и флип-флопова. Разлике између алата за синтезу представљају мотив за формирање стандарда IEEE (IEEE Standard for VHDL Register Transfer Level (RTL) Synthesis).
70
IEEE Стандард дефинише подскуп VHDL језика који је „најмањи заједнички садржалац” и који би требало да је прихватљив већини алата за синтезу. Стандард из године => користити VHDL-87. Стандард из године => користити VHDL-2002.
71
Типови података Стандард за синтезу дозвољава употребу следећих типова: типови набрајања, укључујући предефинисане типове boolean, bit и character целобројни типови, укључујући предефинисане типове integer, natural и 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
72
Скаларни типови Предефинисани набројиви типови boolean и bit, као и стандардни логички типови std_logic и std_ulogic имплементирани су у хардверу као појединачни битови.
73
Скаларни типови Кориснички дефинисани набројиви типови могу да се имплементирају кодирањем које зависи од алата. Могуће је и задавање начина кодирања описујући дати набројиви тип помоћу стринг атрибута enum_encoding Пример: type state is (idle, preamble, data, crc, ok, error); attribute enum_encoding of state : type is " ";
74
Скаларни типови Целобројни типови се имплементирају као вектор битова.
Ако тип обухвата негативне вредности, користи се означено кодирање у комплементу двојке: -- kodiranje u komplementu dvojke na sirini od 7 bita type sample is range –64 to 63 -- neoznaceno kodiranje na sirini od 10 bita subtype table_index is natural range 0 to 1023; Алати који се придржавају стандарда треба да подржавају целе бројеве у опсегу –231 до +231 – 1
75
Низовни типови Морају бити једнодимензионални.
Морају бити индексирани целобројним опсегом. Границе индекса морају бити статичке. Тип елемента низа може бити само: неки од дозвољених скаларних типова, једнодимензионалан низ чији су елементи набројивог типа који представља појединачне битове.
76
Низовни типови Следеће јесте дозвољено:
type coeffs is array (3 downto 0) of integer; -- state je nabrojivi tip type channel_states is array (0 to 7) of state; subtype word is bit_vector(31 downto 0); type reg_file is array (0 to 15) of word;
77
Низовни типови Следеће није дозвољено:
-- nabrojivi tip color jeste dozvoljen type color is (red, green, blue); -- indeks niza nije celobrojnog tipa type plane_status is array (color) of boolean; -- dvodimenzionalni niz i elementi niza tipa real type matrix is array (1 to 3, 1 to 3) of real; -- elementi niza nisu vektori bitova type reg_file_set is array (0 to 3) of reg_file;
78
Интерпретација стандардних логичких вредности
Интерпретација стандардних логичких вредности Синтетизован хардвер ради само са вредностима логичка 0 и логичка 1. У моделу могу да се користе и металогичке вредности, али у већини случајева употреба металогичких вредности се игнорише или не прихвата од стране алата за синтезу, зависно од контекста употребе. Употребу металогичких вредности је пожељно свести на моделовање тростатичких бафера.
79
Интерпретација стандардних логичких вредности
Имајући у виду да синтетизовани хардвер ради само са вредностима логичка 0 и логичка 1: поређење вредности, у хардверу, на једнакост са металогичком вредношћу је увек нетачно, поређење вредности, у хардверу, на неједнакост са металогичком вредношћу је увек тачно, употребу металогичких вредности у осталим релационим операторима, аритметичким, логичким и операторима померања, алат за синтезу не би требало да прихвати.
80
Интерпретација стандардних логичких вредности
Користити функцију std_match за поређење стандардних логичких вредности и вектора на једнакост. Предност је што даје исте резултате и у симулацији и у синтези, што није случај са оператором "=" Алати за синтезу представљају употребу функције std_match тестом еквиваленције. Синтеза поређења коришћењем std_match са вектором који садржи don't care ('–') елементе производи хардвер за поређење који изоставља don't care битове из поређења. Функција std_match је дефинисана у пакету numeric_std
81
Интерпретација стандардних логичких вредности
Када се у оквиру модела неком сигналу додељује стандардна логичка вредност 'Z', алат за синтезу генерише тростатички бафер за тај сигнал. Пример: if request_enable = '1' then request <= ready; else request <= 'Z'; end if;
82
Моделовање комбинационих мрежа
Додела вредности сигналу. status <= ready and not limit_exceeded; status <= ready and (sample < limit);
83
Моделовање комбинационих мрежа
Селекциона додела вредности сигналу. Опис мултиплексера: with addr(1 downto 0) select request <= request_a when "00", request_b when "01", request_c when "10", request_d when "11";
84
Моделовање комбинационих мрежа
Условна додела вредности сигналу: 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"; Овде услови не морају бити узајамно искључиви, па би алат за синтезу направио приоритетно кодован ланац мултиплексера. Спорије од простог мултиплексера, па је зато боље користити селекциону доделу вредности сигналу.
85
Моделовање комбинационих мрежа
Условна додела вредности сигналу може бити корисна код мреже са тростатичким баферима на излазу. data_bus <= resize(sample_byte, 16) when std_match(sample_enable, '1') else "ZZZZZZZZZZZZZZZZ"; (others => 'Z');
86
Моделовање комбинационих мрежа
Процес мора бити осетљив на све улазне сигнале тј. сигнале чија се вредност чита у оквиру процеса. У оквиру процеса излазним сигналима се мора доделити вредност у свим могућим гранама извршавања процеса. read_sample : process(read_enable, sample, ready, limit_exceeded) is begin if std_match(read_enable, '1') then data <= sample; parity <= calc_parity(sample); status <= ready and not limit_exceeded; else data <= "ZZZZZZZZ"; parity <= 'Z'; status <= 'Z'; end if; end process read_sample;
87
Моделовање секвенцијалних мрежа
Стандард за синтезу подржава описивање синхроних секвенцијалних мрежа. Већина алата за синтезу, као и сам стандард, не подржавају синтезу асинхроних секвенцијалних мрежа. Сигнали такта морају бити типа bit, std_ulogic или подтипа као што је std_logic. Није обавезно да буду скалари, могу бити и елементи низова bit или std_ulogic вредности.
88
Моделовање мрежа са ивичним окидањем
process_statement ⇐ ⟦ process_label : ⟧ process ( clock_signal_name ) ⦃ process_declarative_item ⦄ begin if clock_edge then ⦃ sequential_statement ⦄ end if ; end process ⟦ process_label ⟧ ;
89
Моделовање мрежа са ивичним окидањем
Додела вредности сигналу или променљивој условљена ивицом сигнала такта подразумева синтезу елемената који памте стање и осетљивих на ивицу сигнала такта. Секвенцијалне наредбе условљене ивицом сигнала такта (синхроне наредбе) треба да опишу комбинациону мрежу која генерише ново стање елемената који памте стање и осетљивих на ивицу сигнала такта. У оквиру синхроних наредби не сме се користити wait наредба нити референцирати clock-edge изрази.
90
Моделовање мрежа са ивичним окидањем
Израз clock_edge је израз догађаја, који за растућу ивицу такта мора имати једну од следећих форми: rising_edge( clock_signal_name ) clock_signal_name'event and clock_signal_name = '1’ clock_signal_name = '1' and clock_signal_name'event not clock_signal_name'stable and clock_signal_name = '1’ clock_signal_name = '1' and not clock_signal_name'stable
91
Моделовање мрежа са ивичним окидањем
Израз clock_edge је израз догађаја, који за опадајућу ивицу такта мора имати једну од следећих форми: falling_edge( clock_signal_name ) clock_signal_name'event and clock_signal_name = ‘0’ clock_signal_name = ‘0' and clock_signal_name'event not clock_signal_name'stable and clock_signal_name = ‘0’ clock_signal_name = ‘0' and not clock_signal_name'stable
92
Моделовање мрежа са ивичним окидањем
Пример (ивично окидан регистар): simple_reg : process ( clk ) is begin if clk'event and clk = '1' then reg_out <= data_in; end if; end process simple_reg;
93
Моделовање мрежа са ивичним окидањем
Претходни шаблон са додатим асинхроним улазима осетљивим на ниво: process_statement ⇐ ⟦ process_label : ⟧ process ( clock_signal_name, asynchronous_signal_name ⦃,...⦄ ) is ⦃ process_declarative_item ⦄ begin if boolean_expression then ⦃ sequential_statement ⦄ ⦃ elsif boolean_expression then ⦃ sequential_statement ⦄ ⦄ elsif clock_edge then end if; end process ⟦ process_label ⟧ ;
94
Моделовање мрежа са ивичним окидањем
Сви контролни сигнали (коришћени у условима) морају бити у листи сигнала на које је процес осетљив; исто важи и за сигнале који се користе у then гранама које представљају асинхрони дeо мреже Асинхроно се најчешће додељује константна вредност сигналима (у листи осетљивости се појављују само контролни сигнали). Секвенцијални искази: не садрже wait исказе, не референцирају clock-edge изразе (који се користе само за рачунање услова).
95
Моделовање мрежа са ивичним окидањем
Пример (бројач са асинхроним ресетом и уписом): count_byte : process ( clk, rst_n, load, load_data ) is variable count : unsigned(7 downto 0); begin if std_match(rst_n, '0') then count := " "; q <= count; elsif std_match(load, '1') then count := load_data; elsif rising_edge(clk) then count := count + 1; end If; end process count_byte;
96
Моделовање мрежа са ивичним окидањем
Треба приметити да редослед испитивања услова одређује приоритет асинхроног контролног сигнала! У претходном примеру, ресет сигнал има већи приоритет од сигнала за упис (ако се оба асинхрона сигнала истовремено поставе на активан ниво, бројач ће се ресетовати јер се прво испитује услов за ресет сигнал).
97
Моделовање мрежа са ивичним окидањем
Шаблон код кога се користи једна wait наредба за имплементирање осетљивости на ивицу такта: process_statement ⇐ ⟦ process_label : ⟧ process is ⦃ process_declarative_item ⦄ begin wait on sensitivity_list; if condition then ⦃ sequential_statement ⦄ end if; end process ⟦ process_label ⟧ ; Могуће је и коришћење више wait исказа (тако да сви имају исту ивицу такта у услову), али то алати често не дозвољавају.
98
Моделовање мрежа са ивичним окидањем
У претходном шаблону се може користити и одговарајући облик wait until condition исказа Тада је за clock-edge изразe могуће користити и један од следећих: clock_signal_name = '1' clock_signal_name = '0‘ Уколико у једном wait исказу постоји и асинхрони услов, онда треба да постоји исти такав услов у свим wait исказима посматраног процеса. Ако услов испитује и асинхрони улаз, после wait следи испитивање који део услова је постао тачан.
99
Пример reg : process is begin wait until reset = '1' or rising_edge(clk); if reset = '1' then q <= X"00"; elsif rising_edge(clk) then if en = '1' then q <= d; end if; end process reg;
100
Моделовање мрежа са ивичним окидањем
Пример (померачки регистар са синхроним уписом): shift_reg: process is variable stored_value : bit_vector(7 downto 0); begin wait until 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; end if; end process shift_reg;
101
Мреже осетљиве на ниво и последично памћење
У неким моделима, памћење стања се не задаје експлицитно. Алат за синтезу, на основу понашања модела, закључује да је потребно памћење стања. Ово се зове последично памћење (inferred storage). Пример (транспарентно леч коло): latch : process ( enable, d ) begin if enable = '1' then q <= d; end if; end process latch;
102
Мреже осетљиве на ниво и последично памћење
Понашање овог модела је имплицирано VHDL семантиком сигнала и доделе вредности сигналима. Када алат за синтезу имплементира овај модел као хардверско коло, он мора да обезбеди памћење тренутне вредности за излаз; потреба за памћењем је последица семантике модела.
103
Ограничења у VHDL моделовању: јединице дизајна
Све генеричке константе декларисане у заглављу ентитета морају бити целобројног типа. Портови ентитета морају да задовољавају рестрикције типа описане раније. Све подразумеване вредности се игноришу приликом синтезе.
104
Ограничења у VHDL моделовању: процеси и потпрограми
Механизми кашњења (inertial или transport) као и after клаузула се игноришу приликом синтезе. Конкурентне наредбе доделе вредности сигналу могу да реферишу на ивичне (clock-edge) или изразе нивоа, али само у својим условима.
105
Ограничења у VHDL моделовању: конкурентне наредбе
Наредбе за генерисање су дозвољене, само што код итеративног генерисања границе морају бити специфициране у форми статичког опсега.
106
Ограничења у VHDL моделовању: имена и изрази
Већина имена атрибута не сме да се користи. Дозвољени су једино 'base, 'left, 'right, 'high, 'low, 'range, 'reverse_range и 'length. Није дозвољено наводити која димензија низа треба да се користи. На пример, A'left(1) није прихватљиво. Атрибути 'event и 'stable могу да се користе једино у clock-edge изразима.
107
Ограничења у VHDL моделовању: имена и изрази
Уместо оператора померања, могу се користити shift_left и shift_right функције дефинисане у пакетима numeric_bit и numeric_std. Оператори /, mod и rem се могу користити само у случају да су оба операнда статичка, или у случајевима када је десни операнд статички степен двојке. Оператор ** такође може да се користи само у случају када су оба операнда статичка, или у случајевима када је леви операнд статички познат као 2.
108
Ограничења у VHDL моделовању: метакоментари
Стандард за синтезу дефинише два метакоментара тј. два коментара које треба да интерпретира алат за синтезу: -- rtl_synthesis off -- rtl_synthesis on Није битно да ли су написани малим или великим словима или њиховом комбинацијом. Алат за синтезу ингнорише сав VHDL код који се налази иза -- rtl_synthesis off метакоментара и пре следећег -- rtl_synthesis on метакоментара.
109
10 заповести за VHDL
110
1. заповест Познавати структуру система који се дизајнира
Нацртати дијаграм тока података Разумети временске зависности Нацртати дијаграме коначних аутомата Тек када је дизајн у потпуности осмишљен треба прећи на кодирање датог дизајна у језику VHDL VHDL представља начин да се поставе компоненте
111
2. заповест ЈЕДАН ГЛОБАЛАН КЛОК
Флип-флопови генеришу улаз за комбинационе мреже Комбинационе мреже генеришу улаз флип-флопова Једна и само једна вредност сигнала у току једног циклуса сигнала такта Екстерни асинхрони ресет може да се користи Флип-флопови само осетљиви на ивицу
112
2. заповест СТРОГО ЗАБРАЊЕНО: генерисање асинхроног сигнала ресета
логика осетљива на ниво сигнала блокирање сигнала такта (за имплементацију enable сигнала може се користити мултиплексер)
113
3. заповест Осетљивост процеса којим се моделује: комбинациона мрежа
осетљив на све сигнале који се читају секвенцијална мрежа осетљив само на сигнал такта, (евентуално на асинхрони ресет)
114
4. заповест Генерисање сигнала: process (state, input) is 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) is begin case state is when S1 => if input = ’1’ then output <= ’0’; else output <= ’1’; end if; when S2 => end case; end process;
115
Алати за синтезу генеришу лечеве!
4. заповест Алати за синтезу генеришу лечеве! Генерисање сигнала: process (state, input) is 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) is begin case state is when S1 => if input = ’1’ then output <= ’0’; else output <= ’1’; end if; when S2 => end case; end process;
116
5. заповест Вршити енумерацију стања:
type states is (START, RUN, IDLE, ZAPHOD); signal state_current, state_next : states; process (state_current) is begin case state_current is when START => ... when RUN => ... when IDLE => ... when ZAPHOD => ... end case; end process;
117
6. заповест Има заправо 9 заповести
118
7. заповест Као асинхрони ресет користити само спољашњи сигнал.
Као синхрони ресет може се користити и унутрашњи сигнал. process (clk, asynch_rst) is begin if asynch_rst = ’1’ then q <= ’0’; else if rising_edge(clk) then q <= d; end if; end process; process (clk) is begin if rising_edge(clk) then if synch_rst= ’1’ then Q <= ’0’; else Q <= D; end if; end process;
119
8. заповест За тестирање користити само оне сигнале који стварно постоје у дизајну Прилагодити симулацију стварности је већ ионако тежак посао
120
Тестирање на Z и X вредности:
9. заповест Тестирање на Z и X вредности: process (A, B, Sel) is begin case Sel is when "00" => Res <= A + B; when "01" => Res <= A + (not B) + 1; when "1X" => Res <= A and B; when "1Z" => Res <= A or B; when others => Res <= "XX"; end case; end process; process(A, B, Sel) is begin case Sel is when "00" => Res <= A + B; when "01" => Res <= A + (not B) + 1; when "10" => Res <= A and B; when "11" => Res <= A or B; when others => Res <= "XX"; end case; end process;
121
Не тестирати на Z и X вредности!
9. заповест Не тестирати на Z и X вредности! Тестирање на Z и X вредности: process (A, B, Sel) is begin case Sel is when "00" => Res <= A + B; when "01" => Res <= A + (not B) + 1; when "1X" => Res <= A and B; when "1Z" => Res <= A or B; when others => Res <= "XX"; end case; end process; process(A, B, Sel) is begin case Sel is when "00" => Res <= A + B; when "01" => Res <= A + (not B) + 1; when "10" => Res <= A and B; when "11" => Res <= A or B; when others => Res <= "XX"; end case; end process;
122
10. заповест Исказ wait са клаузулом за истек времена може да закасни сигнал за одређено време: wait for 20 ns Исказ wait са клаузулом за истек времена (wait for time_expression) је: дозвољено користити само за потребе симулације тј. приликом тестирања (у оквиру дела VHDL кода који се неће синтетизовати) СТРОГО ЗАБРАЊЕНО користити за синтезу (у оквиру дела VHDL кода који се синтетише)
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.