Арбитратор Један ресурс Два корисника
Арбитратор
DRAM контролер Генерисање синхронизационих сигнала Адреса се дели на два дела: прво се поставља адреса реда након тога адреса колоне Временски параметри: дужина трајања адресе реда Tras дужина трајања адресе колоне Tcas дужина трајања освежавања Tpr
DRAM контролер
DRAM контролер Пример: Tras = 75 ns Tcas = 15 ns Tpr = 35 ns Минимална периода сигнала такта? Како реализовати коло ако је потребна периода сигнала такта од 5 ns?
DRAM контролер Излаз може имати шум Асинхрони DRAM је осетљив на шум Направити синхрони излаз look-ahead output buffer
Видљивост декларација Свака декларативна секција има себи одговарајућу секцију за исказе. Свака декларација се види од места декларисања до краја одговарајуће секције за исказе.
Пакети Обједињују заједничке: типове, константе, сигнале, потпрограме. package_declaration ⇐ package identifier is ⦃ package_declarative_item ⦄ end ⟦ package ⟧ ⟦ identifier ⟧; package_body ⇐ package body identifier is ⦃ package_body_declarative_item ⦄ end ⟦ package body ⟧ ⟦ identifier ⟧; Обједињују заједничке: типове, константе, сигнале, потпрограме.
Пример декларације пакета package cpu_types is constant word_size : positive := 16; constant addr_size : positive := 24; subtype word_t is bit_vector(word_size-1 downto 0); subtype addr_t is bit_vector(addr_size-1 downto 0); type status_value_t is (halted, idle, fetch, mem_read, mem_write, io_read, io_write, int_ack); end package cpu_types;
Пример коришћења пакета Пакет се одвојено анализира и након тога смешта у радну библиотеку (work). Може се сместити и у неку другу библиотеку (зависи од алата, а не од VHDL кода). Пример коришћења: entity address_decoder is port( addr : in work.cpu_types.addr_t; status : in work.cpu_types.status_value_t; mem_sel, int_sel, io_sel : out bit ); end entity address_decoder;
use use_clause ⇐ use selected_name ⦃,...⦄; selected_name ⇐ library_identifier. package_identifier. ⦅ identifier | character_literal | operator_symbol | all ⦆ Пример (појединачна имена из пакета постају видљива): use work.cpu_types.word_t, work.cpu_types.addr_t; variable data_word : word_t; variable next_addr : addr_t; Пример (сва имена из пакета постају видљива): use work.cpu_types.all;
Видљивост увезених идентификатора У општем случају увезени идентификатори се виде у декларативној секцији у којој су увезени и одговарајућој секцији за исказе. Увезени на почетку фајла: виде се до краја фајла. Увезени испред ентитета односно пакета: виде се и у одговарајућој архитектури односно телу пакета. Конфликт са локалним идентификатором: директно видљив само локални, глобалном се приступа преко пуног назива. Конфликт два увезена идентификатора: имплицитни и експлицитни оператор => види се експлицитни у супротном ништа није директно видљиво. Функције које могу да се преклопе => нема конфликта.
alias Пример: Могуће је дефинисати алијасе и за типове: alias_declaration ⇐ alias identifier ⟦ : subtype_indication ⟧ is name ⟦ signature ⟧; signature ⇐ [⟦ type_mark ⦃,...⦄ ⟧ ⟦ return type_mark ⟧] Пример: alias alu_data_width is work.alu_types.data_width; Могуће је дефинисати алијасе и за типове: alias binary_string is bit_vector; Могуће је дефинисати алијасе и за потпрограме: procedure increment(bv : inout bit_vector, by : in integer := 1) alias bv_increment is work.ops.increment[bit_vector, integer]
Пример type register_array is array (0 to 15) of bit_vector(31 downto 0); type register_set is record general_purpose_registers : register_array; program_counter : bit_vector(31 downto 0); program_status : bit_vector(31 downto 0); end record; variable CPU_registers : register_set; alias PSW is CPU_registers.program_status; alias PC is CPU_registers.program_counter; alias GPR is CPU_registers.general_purpose_registers;
Инстанцирање ентитета entity_instantiation_statement ⇐ instantiation_label: entity entity_name ⟦ (architecture_identifier) ⟧ ⟦ generic map (generic_association_list) ⟧ ⟦ port map (port_association_list) ⟧; port_association_list ⇐ ⦅ ⟦ port_name => ⟧ ⦅ signal_name | expression | open ⦆ ⦆ ⦃,...⦄ open – означава да порту није придружен сигнал. Уколико се наведу називи портова, редослед није битан. Пре VHDL-2008 израз је морао бити статички => израчунати одговарајући израз као конкурентни исказ доделе вредности сигналу и тај сигнал мапирати на порт.
Пример entity DRAM_controller is port( rd, wr, mem : in bit; ras, cas, we, ready : out bit ); end entity DRAM_controller; mem_controller1: entity work.DRAM_controler(fpld) port map( cpu_rd, cpu_wr, cpu_mem, mem_ras, mem_cas, mem_we, cpu_rdy ); mem_controller2: entity work.DRAM_controler(fpld) port map( wr => cpu_wr, rd => cpu_rd, mem => cpu_mem, cas => mem_cas, ras => mem_ras, we => mem_we, ready => cpu_rdy
Потенцијални проблем У случају великог броја веза између ентитета: постоји велики број конектујућих сингнала, промена интерфејса ентитета захтева промене у повезивању Тип record представља решење за наведене проблеме