Buscar

Teoria de Atribuições condicionais e atribuições seletivas (em VHDL)

Prévia do material em texto

Laboratório de Sistemas Digitais 1 – 1/2017 
 
 
1 
 
Experimento 3: 
ATRIBUIÇÕES CONDICIONAIS E ATRIBUIÇÕES SELETIVAS 
 
Considere um circuito com três bits de entrada — A, B e C — e dois bits de saída — X e Y. Cada entrada e 
saída será representada por um variável do tipo STD_LOGIC. A declaração da entidade fica assim: 
 
library ieee; 
use ieee.std_logic_1164.all; 
 
entity meucircuito is 
 port(A,B,C: in STD_LOGIC; 
 X,Y: out STD_LOGIC); 
end meucircuito; 
 
Para exemplificar, vamos supor a seguinte relação entre as entradas e as saídas do circuito: 
 
� � �̅ ∙ � � � ∙ � 
 
	 � �̅ ∙ � � � ∙ �
 
 
Existem inúmeras formas de descrever esse circuito em VHDL. Um exemplo utilizando atribuições 
concorrentes é apresentado a seguir: 
 
architecture meucircuito_arch1 of meucircuito is 
begin 
 X <= (not(A) and C) or (A and B); 
 Y <= (not(A) and C) or not(A and B); 
end meucircuito_arch1; 
 
Note que, fazendo as devidas manipulações Booleanas, encontramos que 	 � �̅ � �
.	Segue então uma 
outra descrição do mesmo circuito, desta vez usando atribuições condicionais: 
 
architecture meucircuito_arch4 of meucircuito is 
begin 
 X <= '1' when (A='0' and C='1') else 
 '1' when (A='1' and B='1') else 
 '0'; 
 Y <= '1' when (A='0' or B='0') else 
 '0'; 
end meucircuito_arch4; 
 
Por fim, podemos usar atribuições seletivas, que descrevem o circuito por meio de sua tabela verdade. Se 
escrevermos a tabela verdade do circuito, teremos: 
 
entradas saídas 
A B C X Y 
0 0 0 0 1 
0 0 1 1 1 
0 1 0 0 1 
0 1 1 1 1 
1 0 0 0 1 
1 0 1 0 1 
1 1 0 1 0 
1 1 1 1 0 
 
Laboratório de Sistemas Digitais 1 – 1/2017 
 
 
2 
 
Assim, segue um exemplo de descrição do mesmo circuito, desta vez usando atribuições seletivas. Note 
que usamos um sinal do tipo STD_LOGIC_VECTOR para descrever um vetor de 3 bits formado pelos três 
sinais de entrada. 
 
architecture meucircuito_arch5 of meucircuito is 
 
signal entradas: STD_LOGIC_VECTOR(2 downto 0); 
 
begin 
 
 entradas <= A & B & C; 
 
 with entradas select 
 X <= '1' when "001"|"011"|"110"|"111", 
 '0' when others; 
 
 with entradas select 
 Y <= '0' when "110"|"111", 
 '1' when others; 
 
end meucircuito_arch5; 
 
Poderíamos ainda descrever o circuito usando uma única estrutura “with-select”, usando a seguinte 
abordagem: 
 
architecture meucircuito_arch6 of meucircuito is 
 
signal entradas: STD_LOGIC_VECTOR(2 downto 0); 
signal saidas: STD_LOGIC_VECTOR(1 downto 0); 
 
begin 
 
 entradas <= A & B & C; 
 
 with entradas select 
 saidas <= "01" when "000"|"010"|"100"|"101", 
 "11" when "001"|"011", 
 "10" when others; 
 
 X <= saidas(1); 
 Y <= saidas(0); 
 
end meucircuito_arch6; 
 
A estrutura “with-select” permite que a um dado sinal seja atribuído uma de várias expressões booleanas 
possíveis, escolhida a partir do valor de um segundo sinal. Sua construção mais básica é apresentada a seguir. 
Nessa construção, o sinal 1 recebe a expressão booleana 1 se o sinal 2 assume o valor 1, mas recebe a 
expressão booleana 2 se o sinal 2 assume o valor 2, e assim por diante. Se o sinal 2 não assume nenhum dos 
valores relacionados entre valor1 e valorn, o sinal 1 recebe a expressão booleana n + 1. 
A última linha da construção não é obrigatória; se todos os valores possíveis do sinal 2 estão relacionados 
entre valor1 e valorn, a última linha é omitida, e a construção se encerra com o sinal “;” colocado após a linha 
“(expressão booleana n+1) when others”. No entanto quando se trabalha com o tipo STD_LOGIC (ao invés do 
tipo BIT), seria necessário cobrir todas as possibilidades possíveis, incluindo o valor indeterminado, irrelevante, 
etc., e não somente os valores 0 e 1. Assim, quase sempre é necessário incluir a opção “when others”. 
 
 
Laboratório de Sistemas Digitais 1 – 1/2017 
 
 
3 
 
with sinal2 select 
 sinal1 <= (expressão booleana 1) when (valor 1), 
 (expressão booleana 2) when (valor 2), 
 (expressão booleana 3) when (valor 3), 
 ... 
 (expressão booleana n) when (valor n), 
 (expressão booleana n+1) when others; 
 
Como um exemplo, considere esta implementação alternativa da função ou-exclusivo. Suponha que os dois 
bits de entrada são representados por uma única palavra de dois bits A. Se s é o sinal de saída, pode-se escrever: 
 
with A select 
 s <= '1' when "10", 
 '1' when "01", 
 '0' when others; 
 
Assim, s recebe 1 se e somente se A(1) = '1' e A(0) = '0', ou se A(1) = '0' e A(0) = '1'. 
Finalmente, observe que se uma mesma expressão booleana deve ser atribuída ao sinal 1 para dois ou mais 
valores diferentes do sinal 2, como no último exemplo. É possível combinar esses valores numa única linha em 
VHDL, por meio do conectivo |, como mostrado a seguir: 
 
with A select 
 s <= '1' when "10" | "01", 
 '0' when others; 
 
A interpretação neste caso é a seguinte: s recebe 1 se A é "10" ou "01", e recebe 0 para todos os outros 
valores possíveis de A. 
Este tipo de estrutura é muito útil na implementação de conversores de código.

Continue navegando

Outros materiais