View
9
Download
0
Category
Preview:
Citation preview
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
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
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
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'
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
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
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
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
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
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;
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)
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
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
VHDL - Circuitos Combinacionais
Simulando o Codificador de Prioridade
Notar que, quando vários sinais estão ativos, o de maior índice é indicado na
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
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;
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
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 => ...
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;
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
VHDL - Circuitos Combinacionais
Meio-somador
O meio-somador executa a soma de dois bits fornecendo ainda o vai-um
tabela verdade do meio-somador:
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;
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;
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);
Recommended