Baixe o app para aproveitar ainda mais
Prévia do material em texto
VHDL4 Prof. Rangel Arthur FT/UNICAMP 1 Comandos Seqüenciais Básicos em VHDL 1. Introdução ............................................................................................................................. 2 2. Sensibilidade em Processos .................................................................................................. 2 3. Construção IF ELSE ............................................................................................................. 5 4. Construção CASE WHEN (similar à construção WITH SELECT) ...................................... 7 5. Comando WAIT ................................................................................................................. 10 6. Comando NULL ................................................................................................................. 12 7. Cuidados na descrição ........................................................................................................ 13 COMPARAÇÕES ENTRE WHEN ELSE E IF ELSE ........................................................ 13 COMPARAÇÕES ENTRE WITH SELECT E CASE WHEN ............................................ 13 COMPARAÇÕES ENTRE IF ELSE E CASE WHEN........................................................ 14 COMPARAÇÕES ENTRE WITH SELECT E CASE WHEN ............................................ 15 8. Atraso, Variável e Atributos ............................................................................................... 15 ATRASO ............................................................................................................................. 16 SINAL E VARIÁVEL ......................................................................................................... 17 ATRIBUTOS ....................................................................................................................... 19 9. Prática de Laboratório ........................................................................................................ 19 10. Referências ....................................................................................................................... 22 VHDL4 Prof. Rangel Arthur FT/UNICAMP 2 1. Introdução Comandos seqüenciais ficam contidos em regiões específicas de código, como processos e subprogramas. Uma vez iniciada a execução de comandos em região de código seqüencial, os comandos são avaliados na seqüência em que são apresentados no código, independentemente da troca de valor nos sinais ou variáveis aos quais o comando é sensível. 2. Sensibilidade em Processos O comando PROCESS foi apresentado na aula anterior, já que um processo é um comando concorrente. A região delimitada por um processo contém comandos que são executados seqüencialmente, como na maioria das linguagens de programação. Uma descrição pode conter vários processos, e todos esses processos, assim como outros comandos concorrentes, são executados simultaneamente. VHDL4 Prof. Rangel Arthur FT/UNICAMP 3 A figura a seguir ilustra a execução do código de uma descrição contendo dois processos. O código a seguir contém uma descrição que ilustra a operação de uma lista de sensibilidade. No processo abc, os valores das portas de entrada a e b são transferidos para as portas de saída sa e sb, respectivamente. 1 2 3 4 5 6 7 8 9 10 11 12 13 ENTITY sens_tes IS PORT (a, b : IN BIT; sa, sb : OUT BIT); END sens_tes; ARCHITECTURE teste OF sens_tes IS BEGIN abc: PROCESS (a) -- executado na alteracao do valor de "a" BEGIN sa <= a; sb <= b; END PROCESS abc; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 4 Na lista de sensibilidade do processo foi incluído apenas o sinal a. Assim, somente na alteração do valor desse sinal ocorre a execução do processo e, portanto, a atualização dos valores nas portas de saída. Desse modo, o valor da porta de saída sa corresponde sempre ao valor da porta a, pois qualquer alteração do valor causa a execução do processo. No caso da porta sb, o valor é atualizado somente quando ocorre uma alteração no valor de a. Assim, o sinal sb se comporta como um circuito que memoriza o último valor da porta de entrada b, e permanece com o mesmo valor até que o instante em que a porta a sofre uma alteração. Em resumo, a execução de um processo ocorre se um sinal da lista de sensibilidade tem valor alterado. Iniciada a execução, os comandos são avaliados na seqüência e ao término da avaliação do último comando o processo é suspenso, aguardando uma nova alteração de valor nos sinais da lista. VHDL4 Prof. Rangel Arthur FT/UNICAMP 5 A atribuição incondicional de valor para um sinal pode ocorrer em regiões de código concorrente ou seqüencial. Em uma região de código concorrente, a atribuição é executada como um comando concorrente, isto é, na ocorrência de uma alteração de valor de um sinal da expressão. Numa região de código seqüencial (um processo, por exemplo), uma atribuição é agendada quando o comando é executado. 3. Construção IF ELSE A construção IF ELSE permite a execução condicional de um ou mais comandos seqüenciais, segundo uma lista de condições. A condição de teste pode ser uma expressão que retorne um valor do tipo BOOLEAN. O comando IF inicia a lista de condições e pode ser seguido por cláusulas ELSIF contendo, também, condições a serem verificadas. Se nenhuma condição for verdadeira e não existir uma cláusula ELSE na construção, nenhum comando é executado. VHDL4 Prof. Rangel Arthur FT/UNICAMP 6 Exemplo: Circuito de seleção com uma construção do tipo IF ELSE. o Comando seqüencial é necessário definir um processo; o Lista de sensibilidade é composta pelos sinais i0 i1 i2 i3 sel. o - remoção de um destes sinais: conseqüência? VHDL4 Prof. Rangel Arthur FT/UNICAMP 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ENTITY mux_4a IS PORT (i0, i1, i2, i3 : IN BIT; -- entradas s0, s1 : IN BIT; -- selecao ot : OUT BIT); -- saida END mux_4a; ARCHITECTURE teste OF mux_4a IS SIGNAL sel : BIT_VECTOR(1 DOWNTO 0); BEGIN sel <= s1 & s0; abc: PROCESS (i0, i1, i2, i3, sel) --sinal "sel" inserido na lista BEGIN IF sel = "00" THEN ot <= i0; ELSIF sel = "01" THEN ot <= i1; ELSIF sel = "10" THEN ot <= i2; ELSE ot <= i3; END IF; END PROCESS abc; END teste; 4. Construção CASE WHEN (similar à construção WITH SELECT) A construção CASE WHEN permite a execução condicional de um ou mais comando seqüenciais, conforme o valor de uma expressão. Cada condição define um conjunto de comandos seqüenciais a se executar. VHDL4Prof. Rangel Arthur FT/UNICAMP 8 As condições devem ser mutuamente exclusivas, significando que não é permitido mais de uma condição verdadeira na relação de valores que a expressão pode assumir, e todas as condições possuem a mesma prioridade. Caso a execução de um mesmo conjunto de comandos seja condicionada a mais de uma condição, é possível delimitar as condições através do delimitador “|”, que equivale a uma operação OR entre condições de escolha. Da mesma forma, as palavras reservadas TO e DOWNTO podem ser empregadas para delimitar uma determinada faixa de condições, assim como a palavra reservada OTHERS pode ser empregada na última condição para agrupar as condições não-relacionadas na lista. VHDL4 Prof. Rangel Arthur FT/UNICAMP 9 Exemplo: Circuito de seleção com uma construção do tipo CASE WHEN. Nesse caso, usando comando seqüencial, é necessário definir um processo. Os bits s0 e s1 agrupados no sinal sel. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ENTITY mux_5a IS PORT (i0, i1, i2, i3 : IN BIT; s1, s0 : IN BIT; ot : OUT BIT); END mux_5a; ARCHITECTURE teste OF mux_5a IS SIGNAL sel : BIT_VECTOR(1 DOWNTO 0); BEGIN sel <= s1 & s0; abc: PROCESS (i0, i1, i2, i3, sel) --sinal "sel" inserido na lista BEGIN CASE sel IS WHEN "00" => ot <= i0; WHEN "01" => ot <= i1; WHEN "10" => ot <= i2; WHEN OTHERS => ot <= i3; END CASE; END PROCESS abc; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 10 5. Comando WAIT O comando WAIT suspende a execução de um processo ou de um procedimento. A suspensão pode ser condicionada a três cláusulas, ou a uma combinação delas. o A construção WAIT ON fornece um mecanismo equivalente à lista de sensibilidade de um processo. Após a execução do comando WAIT, o processo fica suspenso até a alteração de valor em um dos sinais relacionados na lista. o Com o comando WAIT UNTIL, o processo é suspenso enquanto a expressão booleana contida no comando não for satisfeita. o No caso WAIT FOR, o processo é suspenso por um período de tempo, reiniciando no comando seguinte, após o período de tempo definido. WAIT ON lista_de_sensibilidade; WAIT UNTIL expressao_booleana; WAIT FOR expressao_boolena; WAIT ON lista_sensibilidade UNTIL condicao_boolena FOR expressao_de_tempo; WAIT; VHDL4 Prof. Rangel Arthur FT/UNICAMP 11 O código abaixo contém dois processos semelhantes empregando o comando WAIT com o objetivo de ilustrar a execução da instrução. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ENTITY wait_a IS PORT (xa, xb : BUFFER INTEGER RANGE 0 TO 15; ya, yb : BUFFER BIT); END wait_a; ARCHITECTURE teste OF wait_a IS BEGIN abc: PROCESS BEGIN xa <= xa +1; ya <= '1'; WAIT FOR 30 ns; ya <= '0'; WAIT FOR 20 ns; END PROCESS abc; cde: PROCESS BEGIN WAIT FOR 30 ns; xb <= xb +1; yb <= '1'; WAIT FOR 20 ns; yb <= '0'; END PROCESS cde; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 12 6. Comando NULL O comando NULL não realiza nenhuma operação; a execução é apenas passada para o próximo comando. Conforme sugestão do manual de referência da linguagem, este comando é especialmente útil na construção CASE WHEN. Os códigos abaixo exemplificam sua utilização. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ENTITY null_3a IS PORT (z : IN BIT_VECTOR(2 DOWNTO 0); sel : IN BIT_VECTOR(1 DOWNTO 0); s : OUT BIT); END null_3a; ARCHITECTURE teste OF null_3a IS BEGIN abc: PROCESS(z, sel) BEGIN s <= z(2) NOR z(0); CASE sel IS WHEN "00" => s <= z(0) AND z(1); WHEN "10" => s <= z(2) XOR z(0); WHEN OTHERS => NULL; END CASE; END PROCESS abc; END teste; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ENTITY null_3b IS PORT (w : IN BIT_VECTOR(2 DOWNTO 0); sel : IN BIT_VECTOR(1 DOWNTO 0); s : OUT BIT); END null_3b; ARCHITECTURE teste OF null_3b IS BEGIN abc: PROCESS(w, sel) BEGIN s <= w(2) NOR w(0); IF sel ="00" THEN s <= w(0) AND w(1); ELSIF sel ="10" THEN s <= w(2) XOR w(0); ELSE NULL; END IF; END PROCESS abc; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 13 7. Cuidados na descrição COMPARAÇÕES ENTRE WHEN ELSE E IF ELSE A construção WHEN ELSE pode ser empregada unicamente em regiões de código concorrente e a construção IF ELSE em regiões de código seqüencial. No caso da construção WHEN ELSE, a operação executada é a simples transferência de um valor para um sinal, enquanto a construção IF ELSE é mais flexível, pois permite a execução de vários comandos seqüenciais. COMPARAÇÕES ENTRE WITH SELECT E CASE WHEN As construções WITH SELECT e CASE WHEN têm como similaridade o fato de que todas as opções de seleção devem estar presentes na lista de escolha. VHDL4 Prof. Rangel Arthur FT/UNICAMP 14 A construção WITH SELECT somente pode ser empregada em regiões de código concorrente, e pode executar apenas a atribuição de um sinal a casa escolha. A construção CASE WHEN possibilita que cada condição de escolha inicie a execução de vários comandos seqüenciais. COMPARAÇÕES ENTRE IF ELSE E CASE WHEN Nas construções IF ELSE e CASE WHEN, uma condição define um conjunto de comandos seqüenciais a ser executado. Desse modo, essas construções podem ser aninhadas para executar uma decisão. Esse estilo de descrição pode ser muitas vezes evitado, concatenando-se os sinais envolvidos na decisão em um único sinal. As restrições impostas pela construção CASE WHEN são convenientes para evitar que circuitos seqüenciais sejam criados sem necessidade. Nessa construção, todas as condições possíveis de uma expressão de escolha devem ser testadas, enquanto a ausência de uma condição gera uma mensagem de erro na etapa de compilação. VHDL4 Prof. Rangel Arthur FT/UNICAMP 15 A construção IF ELSEIF, por sua vez, não é limitada a uma única expressão de controle, resultando que a cada estágio uma nova expressão pode ser avaliada. Essa liberdade excessiva pode conduzir a erros na descrição quando nem todas as condições são cobertas, por descuido do projetista. COMPARAÇÕES ENTRE WITHSELECT E CASE WHEN Algumas restrições devem ser observadas quanto à expressão de escolha. Dada a característica dessas construções, o compilador deve ser capaz de determinar todos os valores que a expressão de escolha pode assumir. Isso deve ser possível num contexto restrito à expressão. 8. Atraso, Variável e Atributos O atraso em VHDL é aplicado na geração de formas de onda para teste de descrições ou na modelagem do comportamento dinâmico de um circuito. Os comandos que modelam o atraso são ignorados pelas ferramentas de síntese. VHDL4 Prof. Rangel Arthur FT/UNICAMP 16 Sinal e variável, como visto anteriormente, são objetos que contêm um valor armazenado e este pode ser alterado na execução do código. O conceito de atributo disponível na linguagem permite extrair informações adicionais de um objeto, tipo e até unidades de projeto. Considerando um sinal, por exemplo, através de atributos, é possível determinar se ocorreu uma troca de valor no objeto, o tempo decorrido após essa mudança e o valor anterior do objeto. ATRASO A modelagem de atraso em VHDL pode ser com inércia ou com transporte. O modelo com inércia é indicado para representar uma informação que se propaga através de um circuito lógico. Normalmente, nesses elementos, pulsos com duração menor do que o atraso de propagação do circuito são transferidos para a saída. A cláusula AFTER seguida de um valor de tempo modela um atraso na transferência de uma informação. Caso não seja inserida a opção TRANSPORT, será suposto um atraso do modelo com inércia. VHDL4 Prof. Rangel Arthur FT/UNICAMP 17 1 2 3 4 5 6 7 8 9 10 11 ENTITY c04_atr2 IS PORT (a : BUFFER BIT; b, c : OUT BIT); END c04_atr2; ARCHITECTURE teste OF c04_atr2 IS BEGIN a <= '0', '1' AFTER 100 ns, '0' AFTER 300 ns, '1' AFTER 500 ns, '0' AFTER 550 ns; b <= a AFTER 100 ns; c <= TRANSPORT a AFTER 100 ns; END teste; SINAL E VARIÁVEL Objeto é um elemento que armazena um valor. Um sinal é um objeto e pode ser empregado tanto em regiões de código seqüencial como em regiões de código concorrente. A atribuição de valor a um sinal ocorre após um intervalo de 1 Δ na iteração dos comandos concorrentes. Variável é um objeto empregado em regiões de código seqüencial e sua declaração é feita nessas regiões. A transferência de uma variável para uma região de código concorrente emprega um sinal. Diferentemente dos sinais, os valores das variáveis são assumidos imediatamente após a avaliação do comando. VHDL4 Prof. Rangel Arthur FT/UNICAMP 18 A seguir apresenta-se um código de uma entidade contendo dois processos que executam operações similares empregando sinais e variáveis. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ENTITY sg_var8 IS PORT (sx : OUT INTEGER; -- saida teste sinal vx : OUT INTEGER); -- saida teste variavel END sg_var8; ARCHITECTURE teste OF sg_var8 IS SIGNAL sa : INTEGER := 1; BEGIN sig: PROCESS BEGIN sa <= sa +sa; sx <= sa; WAIT FOR 10 ns; END PROCESS sig; var: PROCESS VARIABLE va : INTEGER :=1; BEGIN va := va +va; vx <= va; WAIT FOR 10 ns; END PROCESS var; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 19 ATRIBUTOS Atributos são informações adicionais associadas a tipos, objetos, subprogramas e unidades de projeto. Um objeto, por exemplo, pode conter somente um valor num determinado instante de tempo, mas pode, contudo, possuir vários atributos não necessariamente relacionados com o valor que ele contém. Por ser um assunto bastante extenso, em momento oportuno esse assunto voltará a ser tratado com mais detalhes. 9. Prática de Laboratório 1. Com base na figura a seguir, desenvolva o código descrevendo o sistema contendo um decodificador BCD para 7 segmentos e um circuito de seleção empregando comandos seqüenciais. Não utilize blocos para a divisão da descrição; divida a descrição em dois processos: um contendo o decodificador e outro contendo o circuito de seleção. Os mostradores são acionados em nível baixo e os segmentos acionados em nível alto. VHDL4 Prof. Rangel Arthur FT/UNICAMP 20 2. A descrição do código a seguir contém erros. Apresente possíveis soluções para os erros e comente as razões. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ENTITY erro1 IS PORT (a, b : IN BIT; c : IN BOOLEAN; x, y, z, k : OUT BIT); END erro1; ARCHITECTURE teste OF erro1 IS BEGIN abc: PROCESS (a, b, c) BEGIN IF a THEN x <= '1'; END IF; IF c THEN z <= '1'; END IF; IF a AND b = '1' THEN y <= '0'; END IF; IF c AND b = '1' THEN k <= '1'; END IF; END PROCESS abc; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 21 3. Analise a descrição do código a seguir e apresente a carta de tempo das interfaces de saída x0, x1 e x2. Comente uma possível aplicação para essa descrição. 1 2 3 4 5 6 7 8 9 10 11 12 ENTITY c04_e01 IS PORT (x0, x1, x2 : BUFFER BOOLEAN); END c04_e01; ARCHITECTURE teste OF c04_e01 IS BEGIN x0 <= NOT x0 AFTER 100 ns; x1 <= NOT x1 AFTER 100 ns WHEN x0 ELSE x1 AFTER 100 ns; x2 <= NOT x2 AFTER 200 ns WHEN x1 ELSE x2 AFTER 200 ns; END teste; VHDL4 Prof. Rangel Arthur FT/UNICAMP 22 10. Referências [1] Perry, Douglas L., VHDL - Computer Hardware Description Language, 3rd Ed., McGraw-Hill, 1998. [2] d’Amore, Roberto, VHDL: Descrição e Síntese de Circuitos Digitais, LTC, São Paulo, 2005.
Compartilhar