24
VHDL - Circuitos Combinacionais VHDL – Circuitos Combinacionais Neste módulo será feita uma revisão de circuitos combinacionais introduzindo- se alternativas representações em VHDL Uma descrição VHDL, de forma geral, pode seguir uma das seguintes Comportamental : o circuito é definido na forma de um algoritmo, utilizando construções similares àquelas de linguagens de programação Estrutural : o circuito é especificado por uma rede de componentes Data Flow : especifica o fluxo de dados entre entradas e saídas, sem lançar mão de comandos sequenciais Nos próximos slides os três tipos de descrições serão ilustradas

VHDL – Circuitos Combinacionais

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

VHDL – Circuitos Combinacionais

Neste módulo será feita uma revisão de circuitos combinacionais introduzindo-se alternativas representações em VHDL

Uma descrição VHDL, de forma geral, pode seguir uma das seguintes

Comportamental: o circuito é definido na forma de um algoritmo, utilizando construções similares àquelas de linguagens de programação

Estrutural: o circuito é especificado por uma rede de componentes

Data Flow: especifica o fluxo de dados entre entradas e saídas, sem lançar mão de comandos sequenciais

Nos próximos slides os três tipos de descrições serão ilustradas

Page 2: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Comparador de 4 bits

Um circuito comparador de 4 bits:

X = (x3, x

2, x

1, x

0)

Y = (y3, y

2, y

1, y

0)

produz o valor lógico '1' na saída quando:

(x3 = y3) e (x2 = y2) e (x1 = y1) e (x0 = y0)

Descrição da interface:

entity comp4bits is

( x, y: in std_logic_vector(3 downto 0);

out std_logic);

end comp4bits

Page 3: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Comportamental

architecture comportamental of comp4bits is

begin

process (x, y) -- x e y estão na lista de sensitividade do processo

begin -- início do corpo do processo

if x = y then -- if é um comando sequencial, só aparece dentro de

else

iguais <= '0';

end if;

end process;

end comportamental;

A lista de sensitividade indica que sinais são monitorados para o disparo do processo. Este processo será ativado quando x ou y mudarem de valor

Page 4: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Comportamental

Um processo é composto por uma sequência de comandos, avaliados em

Por exemplo:...

iguais = '0';

if x = y then -- if é um comando sequencial, só aparece dentro de

Neste caso, iguais recebe primeiro o valor '0'. Se x e y forem iguais, então iguais recebe '1'

Page 5: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS ...

Exemplo de erro:

begin -- início do corpo do processo

if x = y then -- if é um comando sequencial, só aparece dentro de

end if;

iguais <= '0';

...

A segunda atribuição impõe o valor '0' ao sinal de saída independente do resultado da comparação

Page 6: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Dataflow

Descrições tipo dataflow indicam apenas o fluxo de dados podem ser tipicamente realizadas utilizando-se equações lógicas e atribuições condicionais

when-else ou with-select-when

Comparador com when-else:

architecture dataflow of comp4bits is

begin

igual <= '1' when (x = y) else '0';

end dataflow;

When-else é um comando concorrente

O operador “=” se encarrega de comparar os 4 bits

Page 7: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Dataflow ...

Alternativa: equações Booleanas

architecture Booleanas of comp4bits is

begin

not ( (x(0) xor y(0)) or

(x(1) xor y(1)) or

(x(2) xor y(2)) or

(x(3) xor y(3)) );

end Booleanas;

Limitação: não é uma descrição escalável

Page 8: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Estrutural

Uma descrição estrutural é definida pela instanciação de componentes

O comparador de 4 bits pode ser implementado pela seguite rede de

4

XNOR

3

2

5

1

Page 9: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Estrutural ...

Uma descrição estrutural é feita em termos de componentes pré-definidos

Ex:

entity xnor_2 is port (x, y: in std_logic;z: out std_logic);

end xnor_2;

architecture circuito of xnor_2 isbegin

z <= not (x xor y);

entity and_4 is portin std_logic;

z: out std_logic);end and_4;

architecture circuito of and_4 is

begin

Page 10: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

COMP4BITS Estrutural ...

use work.com4pck.all; -- library com os componentes a serem instanciados

architecture estrutura of comp4bitsSTR is

signal temp : std_logic_vector (3 downto 0);

begin

p0: xnor_2 port map (x(0), y(0), temp(0));

p1: xnor_2 port map (x(1), y(1), temp(1));

p2: xnor_2 port map (x(2), y(2), temp(2));

p3: xnor_2 port map (x(3), y(3), temp(3));

p4: and_4 port map (temp(0),temp(1),temp(2),temp(3), iguais);

end estrutura;

Page 11: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Instanciação de Componente

O comando básico tem a seguinte sintaxe:

: <lista de sinais>);

O label identifica o elemento

O nome da entidade refere-se a um elemento previamente compilado e armazenado em uma biblioteca

A lista de sinais estabelece a associação entre os sinais locais e os sinais definidos pela entidade (similar a definição de uma função em C com seus parâmetros formais e sua chamada, onde os parâmetros locais são especificados e associados com os formais)

Page 12: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Codificador de Prioridade de 8 Níveis–– modelo VHDL de um codificador de prioridades de 8 niveis entity prioridade8 is port ( signal y1, y2, y3, y4, y5, y6, y7: in std_logic; signal sai: out std_logic_vector(2 downto 0));end prioridade8;architecture comportamento of prioridade8 isbegin process (y1,y2,y3,y4,y5,y6,y7) begin

if (y7 = ’1’) then sai <= ”111”;elsif (y6 = ’1’) then sai <= ”110”;elsif (y5 = ’1’) then sai <= ”101”;elsif (y4 = ’1’) then sai <= ”100”;elsif (y3 = ’1’) then sai <= ”011”;elsif (y2 = ’1’) then sai <= ”010”;elsif (y1 = ’1’) then sai <= ”001”;else sai <= B”000”;

YYYYYYYY

sa

Page 13: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Codificador de Prioridade de 8 Níveis...

A ordem de avaliação dos testes define a prioridade

Em vez de utilizar elsif poderia se utilizar if na ordem inversa:

sai <= ”000”;if (y1 = ’1’) then sai <= ”001”; end if;if (y2 = ’1’) then sai <= ”010”; end if;if (y3 = ’1’) then sai <= ”011”; end if;if (y4 = ’1’) then sai <= ”100”; end if;if (y5 = ’1’) then sai <= ”101”; end if;if (y6 = ’1’) then sai <= ”110”; end if;if (y7 = ’1’) then sai <= ”111”; end if;

Neste caso, todos os testes são realizados e o último if ativado determinará o resultado

Page 14: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Simulando o Codificador de Prioridade

Notar que, quando vários sinais estão ativos, o de maior índice é indicado na

Page 15: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Decodificador 3x8

entity dec3x8 is port ( signal sel: in std_logic_vector(2 downto 0); –– seletor

signal en: in std_logic; –– enablesignal y: out std_logic_vector(7 downto 0)); –– saída ativa em zero

end dec3x8;

YYYYYYYY

selselsel

en

Page 16: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Arquitetura Decodificado 3x8

architecture comportamento of dec3x8 isbegin process (sel,en) begin y <= ”11111111”;

if (en = ’1’) then case sel is when ”000” => y(0) <= ’0’; when ”001” => y(1) <= ’0’; when ”010” => y(2) <= ’0’; when ”011” => y(3) <= ’0’; when ”100” => y(4) <= ’0’; when ”101” => y(5) <= ’0’; when ”110” => y(6) <= ’0’; when others => y(7) <= ’0’; end case; end if;

Page 17: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Simulação Decodificador

Habilitando-se o circuito, a simulação abaixo indica a resposta do

O sinal sel é exibido em decimal, enquanto que a saída do decodificador é exibida em binário. O valor em 0 corresponde ao código selecionado

Page 18: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Erros Comuns

Não atribuir um valor default a uma das saídas

o sistema de síntese assume que a saída mantém o valor e sintetisa um latch para armazená-lo

ex: eliminando a iniciação y <= “11111111”, quando en = '0' y não recebe nenhum valor. A síntese produz um latch de oito bits!

Não fornecer todos os valores possíveis no case

ex: usando std_logic, temos 9 valores possíveis

a solução é utilizar a cláusula default

when others => ...

Page 19: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Decodificador GenéricoO decoficador apresentado tem um número fixo de bits. Um bloco que poderia ser utilizado com decodificadores de qualquer tamanho poderia ser como

architecture comportamento of dec_generico isbeginprocess (sel, en) begin y <= (others => ’1’) ; for i in y’range loop if ( en = ’1’ and bvtoi(To_Bitvector(sel)) = i ) then y(i) <= ’0’ ; end if ; end loop;end process;end behavior;

Page 20: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Decodificador Genérico ...

Este bloco pode ser utilizado em decodificadores de 2, 4, 8, etc. bits

O for é utilizado para percorrer os elementos do array

y'range é a gama de índices do array. Neste caso, i varia de 7 até 0

A sintaxe <signal>'<propriedade> permite acessar atributos de um sinal.

Algumas propriedades úteis para síntese:

LEFT: índice mais a esquerda

RIGHT: índice mais a direita

HIGH: índice máximo

LOW: índice mínimo

Page 21: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Meio-somador

O meio-somador executa a soma de dois bits fornecendo ainda o vai-um

tabela verdade do meio-somador:

Page 22: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Meio-somador ...

Library IEEE;Use IEEE.std_logic_1164.all;

entity HALFADDER isport (A,B : in bit; SUM, CARRY : out bit);end HALFADDER;

architecture BEHAVE of HALFADDER is begin SUM <= A xor B; CARRY <= A and B;end BEHAVE;

Page 23: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Somador Completo FULLADDER is

port (A, B, CIN : in std_logic; SUM, CARRY : out std_logic);end FULLADDER;architecture STRUCT of FULLADDER is signal I1, I2, I3 : std_logic;component HALFADDERport ( A,B : in std_logic; SUM, CARRY : out std_logic);end component;component ORGATEport ( x, y: in std_logic; z: out std_logic);end component;begin u1:HALFADDER port map(A,B,I1,I2); u2:HALFADDER port map(I1,CIN,SUM,I3); u3:ORGATE port map(I3,I2,CARRY);end STRUCT;

Page 24: VHDL – Circuitos Combinacionais

VHDL - Circuitos Combinacionais

Somador de 4 bits

architecture behavior of adder4 issignal c: std_logic_vector(4 downto 0);beginprocess (a,b,cin,c) begin c(0) <= cin; for i in 0 to 3 loop sum(i) <= a(i) xor b(i) xor c(i); c(i+1) <= (a(i) and b(i)) or (c(i) and (a(i) or b(i))); end loop; cout <= c(4); end process;end behavior;

entity adder4 is port (signal a,b: in std_logic_vector (3 downto 0);signal cin: in std_logic;signal sum: out std_logic_vector(3 downto 0);signal cout: out std_logic);