Questão de Programação — Linguagens de programação — FGV 2024
Programação›Linguagens de programação
Código
fg085436
Banca
FGV
Órgão
INPE
Ano
2024
Nível
Superior
Cargo
Tecnologista Júnior I - Desenvolvimento de Sistemas Eletrônicos Digitais
Um dispositivo programável deve implementar um contador crescente e decrescente. Num determinado trecho de código VHDL, tem-se:
O código a ser inserido no local indicado como “parcela” deve ser:
Anot UP & not UP & not UP & '1'
B"000" & not UP
Cnot UP & "001"
D'0'& not UP & not UP & '1'
Enot UP & not UP & not UP & not UP
Revelar gabarito e comentário▾
GabaritoA — not UP & not UP & not UP & '1'
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
VHDL: contador crescente e decrescente
Gabarito: letra A. A parcela correta é not UP & not UP & not UP & '1', pois o sinal UP controla o sentido da contagem e, quando UP = '0' (contagem decrescente), o valor somado ao contador deve ser -1, representado em complemento de dois como 1111 (quatro bits). A alternativa A gera exatamente 1111 quando UP = '0', e 0001 quando UP = '1', implementando o incremento/decremento de forma correta.
O problema envolve a implementação de um contador bidirecional em VHDL, uma linguagem de descrição de hardware. O sinal UP determina se a contagem é crescente (UP = '1') ou decrescente (UP = '0'). Para que o contador funcione, a parcela somada ao valor atual deve ser +1 (para incrementar) ou -1 (para decrementar). Em aritmética binária com complemento de dois, o valor -1 é representado como 1111 (todos os bits em 1) para um vetor de 4 bits, e +1 como 0001.
A expressão not UP & not UP & not UP & '1' produz, quando UP = '0', a concatenação 1 & 1 & 1 & 1 = "1111", que é -1 em complemento de dois. Quando UP = '1', a expressão resulta em 0 & 0 & 0 & 1 = "0001", que é +1. Assim, a soma com o valor atual do contador implementa corretamente o incremento e o decremento. As demais alternativas ou produzem valores incorretos (como "000" concatenado com not UP, que resulta em "0001" ou "0000", não representando -1) ou não geram a representação correta de -1 em complemento de dois.
A pegadinha central está na representação de números negativos em binário: muitos candidatos esquecem que -1 em complemento de dois é 1111, não 1001 ou outra combinação. Além disso, a concatenação em VHDL (&) é um operador que une vetores de bits, e a expressão deve ter exatamente 4 bits para somar corretamente com o contador. A alternativa A é a única que, para ambos os valores de UP, gera o valor correto a ser somado.
Guarde o critério decisivo: a parcela deve ser +1 quando UP = '1' e -1 (ou seja, 1111 em complemento de dois) quando UP = '0'. É exatamente essa dualidade que separa a alternativa correta das demais.
1Identificar sinal UP
2Exigir +1 (UP=1)
3Exigir -1 (UP=0)
4Testar cada expressão
LEVEL · soulevel.com.br
Alternativa A — ✅ Correta ⟵ GABARITO
A expressão not UP & not UP & not UP & '1' gera, para UP = '0', o vetor "1111", que é -1 em complemento de dois, e para UP = '1', o vetor "0001", que é +1. Isso implementa corretamente o incremento e o decremento do contador, pois a soma com o valor atual produz a contagem nos dois sentidos.
Alternativa B — ❌ Incorreta
A expressão "000" & not UP gera um vetor de 4 bits, mas quando UP = '0', resulta em "0001" (que é +1), e quando UP = '1', resulta em "0000" (que é 0). Isso não representa -1 em nenhum caso, portanto não implementa a contagem decrescente.
Alternativa C — ❌ Incorreta
A expressão not UP & "001" gera, para UP = '0', o vetor "1001" (que é -7 em complemento de dois), e para UP = '1', o vetor "0001" (que é +1). O valor "1001" não é -1, então a contagem decrescente estaria incorreta.
Alternativa D — ❌ Incorreta
A expressão '0' & not UP & not UP & '1' gera, para UP = '0', o vetor "0111" (que é +7), e para UP = '1', o vetor "0001" (que é +1). Nenhum dos valores representa -1, portanto a contagem decrescente não é implementada.
Alternativa E — ❌ Incorreta
A expressão not UP & not UP & not UP & not UP gera, para UP = '0', o vetor "1111" (que é -1), mas para UP = '1', o vetor "0000" (que é 0). Isso significa que, na contagem crescente, o contador não incrementaria, permanecendo parado, o que invalida a implementação.
NÃO CAIA NESSA!
A banca explora a confusão entre a representação de -1 em complemento de dois e a necessidade de gerar +1 quando UP = '1'. A alternativa E parece correta porque gera 1111 para UP = '0', mas falha ao não gerar 0001 para UP = '1'. Lembre-se: a parcela deve ser +1 OU -1, nunca 0.
PEGA ESSA DICA!
Para resolver questões de contador em VHDL, verifique sempre o valor gerado pela expressão para ambos os estados do sinal de controle. Monte uma pequena tabela com UP = '0' e UP = '1' e confira se os resultados são -1 e +1 em complemento de dois.