Mudanças entre as edições de "ELD129003-Engtelecom (Diário) - Prof. Marcos Moecke"
(→ATUAL) |
|||
Linha 450: | Linha 450: | ||
====ATUAL==== | ====ATUAL==== | ||
;Encontro 8 (12 mar): | ;Encontro 8 (12 mar): | ||
+ | *Flip-Flop e circuitos sequenciais. | ||
+ | :*Diferenças entre código concorrente e sequencial <=> circuitos combinacional e sequencial | ||
+ | :*Diferenças entre os objetos SIGNAL e VARIABLE | ||
+ | :*Tipos de elementos de memória: Latch x Flip-flop | ||
+ | ::* Latch D | ||
+ | ::* Flip-flop tipo D com reset assíncrono e com reset (clear) síncrono | ||
+ | :*Seção de código sequencial '''PROCESS''': lista de sensibilidade | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | [rótulo:] PROCESS [(lista_de_sensibilidade)] [IS] | ||
+ | [parte_declarativa] | ||
+ | BEGIN | ||
+ | afirmação_sequencial; | ||
+ | afirmação_sequencial; | ||
+ | ... | ||
+ | END PROCESS [rótulo]; | ||
+ | </syntaxhighlight> | ||
+ | :*Instrução '''IF''' | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | [rótulo:] IF condição THEN | ||
+ | afirmação_sequencial; | ||
+ | afirmação_sequencial; | ||
+ | ... | ||
+ | ELSIF condição THEN | ||
+ | afirmação_sequencial; | ||
+ | afirmação_sequencial; | ||
+ | ... | ||
+ | ELSE | ||
+ | afirmação_sequencial; | ||
+ | afirmação_sequencial; | ||
+ | ... | ||
+ | END IF [rótulo]; | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | :*Exemplos: | ||
+ | ::* DFFs com Reset Assincrono e Reset Sincrono, com Enable, com Preset (Variação Ex 6.1). | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | --Flip Flop tipo D com reset assincrono, sensivel a borda de subida. | ||
+ | process (clock,reset) | ||
+ | begin | ||
+ | if (reset = '1') then | ||
+ | q <= '0'; | ||
+ | -- elsif (clock'event and clock = '1') then or | ||
+ | elsif (rising_edge(clock)) then | ||
+ | q <= d; | ||
+ | end if; | ||
+ | end process; | ||
+ | </syntaxhighlight> | ||
+ | {{fig|5.1|RTL de Flip-flop D de borda de subida, com reset assíncrono| FF_D_RST.png| 400 px | }} | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | --Flip Flop tipo D com preset assincrono e sinal de enable, sensivel a borda de descida. | ||
+ | process (clock, preset) | ||
+ | begin | ||
+ | if (preset = '1') then | ||
+ | q <= '1'; | ||
+ | elsif (falling_edge(clock)) then | ||
+ | if (enable = '1') then | ||
+ | q <= d; | ||
+ | end if; | ||
+ | end if; | ||
+ | end process; | ||
+ | </syntaxhighlight> | ||
+ | {{fig|5.2|RTL de Flip-flop D de borda de descida, com preset assíncrono e enable| FF_D_PRST.png| 400 px | }} | ||
+ | ::* Comparar com Latch (sem clk'event). | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | --Latch tipo D com reset assincrono. | ||
+ | process (enable, reset, d) | ||
+ | begin | ||
+ | if (reset = '1') then | ||
+ | q <= '0'; | ||
+ | elsif (enable='1')) then | ||
+ | q <= d; | ||
+ | end if; | ||
+ | end process; | ||
+ | </syntaxhighlight> | ||
+ | {{fig|5.3|RTL de Latch D de com reset assíncrono e enable ativo alto| LATCH_D_RST.png| 400 px | }} | ||
+ | * Na figura abaixo, note que o Latch é implementado utilizando a LUT do elemento lógico do FPGA, enquanto que o Flip-flop utiliza o componente já disponível neste elemento lógico. | ||
+ | *[[Evite os latches no projeto]] | ||
+ | |||
+ | {{fig|5.4|Comparação do ''Technology Map'' de um Latch_D (esquerda) com FF_D (direita)| FF_D_LATCH_D.png| 800 px | }} | ||
+ | |||
+ | :*Ver pag. 151 a 156 de <ref name="PEDRONI2010b"/> | ||
+ | :*[[Especificando o valor de Power-Up do flip-flop D]] | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | -- Flip Flop tipo D com reset síncrono sensível a borda de subida. | ||
+ | -- Modifique a descrição para que o reset_ass seja assíncrono e reset_sinc seja síncrono. | ||
+ | -- Note que a função rising_edge(clock) é equivalente a (clock'event and clock'last_value = '0' and clock = '1')) | ||
+ | |||
+ | process (clock, reset) | ||
+ | begin | ||
+ | if (reset = '1') then | ||
+ | q <= '0'; | ||
+ | elsif (clock'event and clock'last_value = '0' and clock = '1')) then | ||
+ | q <= d; | ||
+ | end if; | ||
+ | end process; | ||
+ | </syntaxhighlight> | ||
+ | {{fig|5.5|RTL do Flip-flop D com reset assíncrono e reset síncrono| FF_D_RST_SINC_ASINC.png| 400 px | }} | ||
+ | *[[Como evitar o uso da lógica combinacional no reset síncrono]] | ||
+ | |||
+ | *Exercício: Implemente um registrador com N FF_D no lugar de um único FF_D. | ||
+ | {{fig|5.6|RTL do Registrador (de 4 bits) com reset assíncrono| REG_RST.png| 400 px | }} | ||
+ | {{fig|5.7|Techonogy Map do Registrador (de 4 bits) com reset assíncrono| TM_REG_RST.png| 400 px | }} | ||
+ | * Faça a simulação funcional do DFFs e do Latch | ||
{{collapse bottom}} | {{collapse bottom}} |
Edição das 22h21min de 11 de março de 2024
Registro on-line das aulas
Unidade 1 - Aula inicial, Introdução a disciplina
- 1 ENCONTRO
Unidade 1 - Aula inicial, Introdução a disciplina |
---|
|
Unidade REV - PRIMEIRO CONTATO COM VHDL
- 3 ENCONTROS
Unidade REV - PRIMEIRO CONTATO COM VHDL | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
library library_name;
use library_name.package_name.all;
entity entity_name is
[generic (
cons_name1: const_type const_value;
cons_name2: const_type const_value;
...
cons_nameN: const_type const_value);]
[port (
signal_name1: mode signal_type;
signal_name2: mode signal_type;
...
signal_nameN: mode signal_type);]
[declarative_part]
[begin
statement_part]
end [entity] [entity_name];
architecture arch_name of entity_name is
[declarative_part]
begin
statement_part
end [architecture] [arch_name];
Para ilustrar essas instruções utilizaremos o exemplo de um Mux4x1. Um multiplexador digital de N entradas e 1 saída, frequentemente abreviado como MUX N:1, é um circuito digital muito utilizado para rotear sinais digitais. Ele desempenha a função de selecionar uma das entradas para ser encaminhada para a saída com base em um sinal de seleção (ou controle).
Dada a função booleana do MUX4:1 é simples para descreve-lo em VHDL utilizando apenas operadores lógicos. entity mux4x1 is
port
(
-- Input ports
X: in bit_vector (3 downto 0);
Sel : in bit_vector (1 downto 0);
-- Output ports
Y : out bit
);
end entity;
-- Implementação com lógica pura
architecture v_logica_pura of mux4x1 is
begin
Y <= (X(0) and (not Sel(1)) and (not Sel(0))) or
...
end architecture;
No entanto, o MUX4:1 também pode ser descrito utilizando a instrução WHEN-ELSE <optional_label>: <target> <=
<value> when <condition> else
<value> when <condition> else
...
<value> else
<value>;
Warning (13012): Latch ... has unsafe behavior
No caso do MUX4:1 ele poderia ser descrito como: -- Implementação com WHEN ELSE
architecture v_WHEN_ELSE of mux4x1 is
begin
Y <= X(0) when Sel = "00" else
X(1) when Sel = "01" else
X(2) when Sel = "10" else
X(3);
end architecture;
Outra forma de descrever o MUX4:1 seria utilizando a instrução WITH-SELECT <optional_label>: with <expression> select
<target> <=
<value> when <choices>,
<value> when <choices>,
...
<value> when others;
Error (10313): VHDL Case Statement error ...: Case Statement choices must cover all possible values of expression
-- Implementação com WITH SELECT
architecture v_WITH_SELECT of mux4x1 is
begin
with Sel select
Y <= X(0) when "00", -- note o uso da ,
X(1) when "01",
X(2) when "10",
X(3) when others; -- note o uso de others, para todos os demais valores.
-- Não pode ser substituido por "11" mesmo que o signal seja bit_vector.
end architecture;
CONFIGURATION <configuration_name> OF <entity_name> IS
FOR <architecture_name> END FOR;
END CONFIGURATION;
-- Design Unit que associa a architecture com a entity
CONFIGURATION cfg_ifsc OF mux4x1 IS
FOR v_logica_pura END FOR;
-- FOR v_WHEN_ELSE END FOR;
-- FOR v_WITH_SELECT END FOR;
END CONFIGURATION;
Figura 2.1 - Código RTL do mux4x1 v_logica_pura Figura 2.2 - Código RTL do mux4x1 v_WHEN_ELSE Figura 2.3 - Código RTL do mux4x1 v_WITH_SELECT
|
Unidade 2 - Dispositivos Lógicos Programáveis
- 3 ENCONTROS
Unidade 2 - Dispositivos Lógicos Programáveis | ||||
---|---|---|---|---|
Unidade 3 - Circuitos sequenciais (Implementação com HDL)
AvaliaçõesDurante o semestre serão realizadas 4 avaliações. As avaliações devem ser enviadas pela plataforma Moodle com os arquivos solicitados.
Atividade relâmpago (AR)As atividades relâmpago devem ser entregues no Moodle da disciplina. A não entrega dessas atividades não gera nenhum desconto, apenas geram pontos de BÔNUS que são adicionados aos conceitos das avaliações A1 a AN. Atividade extra-classe (AE)A média ponderada das atividades extra-classe será considerada no cálculo do conceito final da UC. A entrega das mesmas será feita pelo Moodle, e cada dia de atraso irá descontar 0,2 na nota da atividade. Muitas dessas atividades também geram pontos de BÔNUS que são adicionados aos conceitos das avaliações A1 a AN. Para os BÔNUS só serão considerados projetos entregues no prazo. AE1 - Conhecendo os dispositivos lógicos programáveis
Referências Bibliográficas:
|