Baixe o app para aproveitar ainda mais
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.
Compartilhar