You are on page 1of 17

Арбитратор

• Један ресурс
• Два корисника

1
Арбитратор

2
DRAM контролер
• Генерисање синхронизационих сигнала
• Адреса се дели на два дела:
– прво се поставља адреса реда
– након тога адреса колоне
• Временски параметри:
– дужина трајања адресе реда Tras
– дужина трајања адресе колоне Tcas
– дужина трајања освежавања Tpr

3
DRAM контролер

4
DRAM контролер
• Пример:
Tras = 75 ns
Tcas = 15 ns
Tpr = 35 ns
• Минимална периода сигнала такта?
• Како реализовати коло ако је потребна периода сигнала
такта од 5 ns?

5
DRAM контролер
• Излаз може имати шум
• Асинхрони DRAM је осетљив на шум
• Направити синхрони излаз
– look-ahead output buffer

6
Видљивост
декларација
• Свака декларативна секција
има себи одговарајућу
секцију за исказе.

• Свака декларација се види од


места декларисања до краја
одговарајуће секције за
исказе.

7
Пакети
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 ⟧;

• Обједињују заједничке:
– типове,
– константе,
– сигнале,
– потпрограме.
8
Пример декларације пакета
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;

9
Пример коришћења пакета
• Пакет се одвојено анализира и након тога смешта у радну
библиотеку (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;

10
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;
11
Видљивост
увезених идентификатора
• У општем случају увезени идентификатори се виде у
декларативној секцији у којој су увезени и одговарајућој
секцији за исказе.
• Увезени на почетку фајла:
– виде се до краја фајла.
• Увезени испред ентитета односно пакета:
– виде се и у одговарајућој архитектури односно телу пакета.
• Конфликт са локалним идентификатором:
– директно видљив само локални,
– глобалном се приступа преко пуног назива.
• Конфликт два увезена идентификатора:
– имплицитни и експлицитни оператор => види се експлицитни
– у супротном ништа није директно видљиво.
• Функције које могу да се преклопе => нема конфликта.
12
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]

13
Пример
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;

14
Инстанцирање ентитета
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 – означава да порту није придружен сигнал.


• Уколико се наведу називи портова, редослед није битан.

15
Пример
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
);

16
Потенцијални проблем
• У случају великог броја веза између ентитета:
– постоји велики број конектујућих сингнала,
– промена интерфејса ентитета захтева промене у повезивању
• Тип record представља решење за наведене проблеме

17

You might also like