Lição do Teach
Lógica digital na DE1-SoC (2/6): tabelas-verdade, SOP/POS, mapas de Karnaugh e um multiplexador
Relacione tabelas-verdade, formas booleanas, mapas de Karnaugh e multiplexadores e teste lógica combinacional minimizada na DE1-SoC.
Entre com uma conta de professor para preparar uma sessão. Os estudantes entram com um código da turma.
Ainda não tem uma conta na LabsLand? Criar sua conta de professor
Objetivos de aprendizagem
Obter as formas soma de produtos (SOP) e produto de somas (POS; extensão opcional) a partir de uma tabela-verdade.
Minimizar uma função booleana com um mapa de Karnaugh e extrair a expressão simplificada.
Comparar uma forma canônica com sua forma mínima no hardware real e confirmar que são equivalentes.
Extensão opcional: Montar e verificar um multiplexador 4 para 1 que encaminha uma de quatro entradas para a saída.
Visualização da atividade do estudante
Conteúdo da atividade
Apenas visualização. Em uma sessão de aula, os estudantes podem preencher respostas e entregar o trabalho ao professor.
Da tabela-verdade ao circuito
10 min
Aula principal (70 minutos): complete a tabela-verdade, derive e minimize a SOP e verifique ambas as formas na placa. POS e MUX são extensões opcionais (cerca de 20 minutos cada); o decodificador requer mais 20 minutos. Não entram na nota principal.
Na Lição 1, você ligou portas individuais às chaves. Projetos reais começam um nível acima: primeiro se decide o que o circuito deve fazer, normalmente por meio de uma tabela-verdade, e depois se encontra uma rede de portas que produza esse comportamento. Nesta lição, você obterá a mesma função por dois caminhos e depois a tornará menor.
A função dos dois primeiros exercícios é F(C,B,A), com três entradas. Você ligará SW[0]=A, SW[1]=B, SW[2]=C e mostrará o resultado em LEDR[0]. A tabela abaixo segue a ordem de contagem binária C B A, de 000 a 111:
- Linha 0:
C B A = 0 0 0→F=0 - Linha 1:
C B A = 0 0 1→F=1 - Linha 2:
C B A = 0 1 0→F=0 - Linha 3:
C B A = 0 1 1→F=1 - Linha 4:
C B A = 1 0 0→F=1 - Linha 5:
C B A = 1 0 1→F=0 - Linha 6:
C B A = 1 1 0→F=1 - Linha 7:
C B A = 1 1 1→F=0
F vale 1 em quatro das oito linhas e 0 nas outras quatro. Identifique-as diretamente na tabela antes de responder. Essa divisão orienta toda a lição: as linhas com F=1 produzem a soma de produtos, e as linhas com F=0 produzem o produto de somas. Mantenha a tabela à vista nos dois exercícios.
Lembre-se das convenções da placa usadas na Lição 1: uma chave para cima representa 1 lógico, e LEDR é ativa em nível alto, portanto o LED acende quando a saída vale 1. Os circuitos desta lição são puramente combinacionais: a saída depende apenas das posições atuais das chaves, sem sinal de clock.
Em quantas das oito linhas F vale 1, e quais são essas linhas?
Soma de produtos e mapa de Karnaugh
20 min
Mintermo. Um mintermo é um único termo AND (produto) construído com todas as entradas, cada uma aparecendo uma vez, direta ou negada, e que vale 1 em exatamente uma linha da tabela-verdade. Para três entradas, há oito mintermos. A linha 1 é C=0, B=0, A=1, portanto seu mintermo é (~C & ~B & A), que vale 1 somente nessa combinação.
Soma canônica de produtos (SOP). Para construir F, aplique OR aos mintermos de todas as linhas em que F=1. Como cada mintermo vale 1 apenas em sua própria linha, o OR vale 1 precisamente nas linhas desejadas. Use a tabela para escrever os quatro mintermos de F. Não pule a forma completa: você a testará na placa antes da forma reduzida.
Minimização com mapa de Karnaugh. Um mapa de Karnaugh reorganiza a tabela-verdade para que células fisicamente adjacentes difiram em apenas uma entrada. Quando dois 1s adjacentes formam um grupo, a variável que muda entre eles não afeta esse par e pode ser eliminada, deixando um termo menor. A figura marca os quatro 1s e dois agrupamentos possíveis. Em cada grupo, identifique qual entrada permanece fixa, qual muda e qual termo de produto resta.
Mapa de Karnaugh de F. Em cada par contornado, compare as duas células e elimine a variável que muda; as variáveis que permanecem fixas formam o termo reduzido.
Escreva a expressão SOP canônica completa de F(C,B,A) a partir das quatro linhas em que F=1. Use ~ para NOT, & para AND e | para OR.
Usando o mapa, escreva o termo de produto reduzido de cada grupo. Em cada caso, indique qual variável muda e por isso desaparece. Depois combine os dois termos em uma expressão mínima para F.
Alguma variável de entrada desaparece da expressão mínima? Explique o que isso revela sobre a dependência de F. Em seguida, encontre duas linhas que diferem somente nessa variável e informe seus números e valores de F para confirmar sua afirmação.
Monte: SOP canônica e depois forma mínima
30 min
Agora implemente a função na placa real. Execute primeiro a SOP canônica, confira as oito linhas e depois edite o mesmo código inicial para testar a expressão mínima obtida pelo mapa.
O módulo abaixo está intencionalmente incompleto. Substitua TODO_CANONICAL_SOP_EXPRESSION por sua SOP completa. Depois de verificá-la, troque a mesma linha pela expressão minimizada e sintetize novamente.
// Lição 2 - Exercício 1-B: código inicial para soma de produtos (SOP)
// F(C,B,A): use as linhas da tabela em que F=1. SW[0]=A, SW[1]=B, SW[2]=C.
// Preencha primeiro a SOP canônica. Depois substitua pela expressão minimizada no mapa.
module leds_mirror(SW, LEDR);
input [9:0] SW;
output [9:0] LEDR;
wire A = SW[0];
wire B = SW[1];
wire C = SW[2];
// Passo 1: SOP canônica. Escreva um termo de produto para cada linha F=1.
assign LEDR[0] = TODO_CANONICAL_SOP_EXPRESSION;
// Passo 2: depois de verificar a forma canônica, substitua a linha acima
// pela expressão minimizada no mapa de Karnaugh e sintetize novamente.
assign LEDR[9:1] = 9'b0;
endmoduleAbra o laboratório Verilog da DE1-SoC. O editor mostra
leds_mirror.v.Selecione todo o conteúdo de
leds_mirror.ve substitua-o pelo módulo acima. Mantenha o nomeleds_mirror.Substitua
TODO_CANONICAL_SOP_EXPRESSIONpor sua SOP canônica. Mantenha exatamente uma linhaassign LEDR[0] = ...;.Clique em Synthesize (Sintetizar). Se um tour guiado cobrir o botão, feche-o ou pule-o. Aguarde de 1 a 3 minutos. Se houver erro, verifique ponto e vírgula e parênteses, corrija e sintetize novamente. Continue somente quando o estado final indicar sucesso com 0 erros.
Clique em Upload to FPGA (Enviar para a FPGA) e aguarde a sessão ao vivo e a câmera.
Percorra em
SW[2:0](C B A) as oito combinações000, 001, 010, 011, 100, 101, 110, 111, lendoLEDR[0]na câmera e registrando cada resultado.No segundo passo, edite a mesma linha
assign LEDR[0]para usar sua expressão minimizada. Sintetize, envie novamente e verifique pelo menos três linhas, incluindo uma comF=0e uma comF=1. Confirme que a versão mínima coincide com a canônica.
Defina SW[2:0] = C B A em cada linha e registre o valor de LEDR[0] observado na câmera (1 = aceso, 0 = apagado). Compare a SOP canônica com a expressão minimizada.
| C = SW2 | B = SW1 | A = SW0 | F = LEDR0 (observado) |
|---|---|---|---|
A SOP canônica e a expressão minimizada produziram o mesmo LEDR[0] nas linhas verificadas? Em uma frase, diga o que isso confirma sobre as duas expressões.
Envie sua evidência. Faça uma captura da câmera com a expressão minimizada executando em uma linha para a qual sua tabela prevê F=1. Informe a linha C B A escolhida.
Bônus opcional (sem envio obrigatório). O Quartus informa quantos elementos lógicos um projeto usa. Se esse relatório aparecer em sua sessão, sintetize as formas canônica e minimizada e compare as contagens. Esse relatório não é garantido, por isso a exploração não faz parte da evidência obrigatória.
A mesma função como produto de somas
20 min
A SOP construiu F a partir das linhas com 1. O produto de somas (POS) constrói a mesma F a partir das linhas com 0.
Maxtermo. Um maxtermo é um único termo OR (soma) que usa todas as entradas, diretas ou negadas, e vale 0 em exatamente uma linha. É a imagem espelhada de um mintermo. Na linha 0 (C=0, B=0, A=0), o maxtermo é (A | B | C): esse OR vale 0 apenas quando as três entradas valem 0.
Produto canônico de somas. Aplique AND aos maxtermos de todas as linhas em que F=0. Cada maxtermo força a saída a 0 em sua própria linha e a deixa em 1 nas demais. Identifique na tabela as quatro linhas com F=0 e escreva os quatro maxtermos.
// Lição 2 - Exercício 1-C: código inicial para produto de somas (POS)
// Mesma F(C,B,A). Use as linhas em que F=0 para escrever os maxtermos.
module leds_mirror(SW, LEDR);
input [9:0] SW;
output [9:0] LEDR;
wire A = SW[0];
wire B = SW[1];
wire C = SW[2];
// POS canônica: um termo de soma para cada linha F=0, todos ligados por AND.
assign LEDR[0] = TODO_CANONICAL_POS_EXPRESSION;
assign LEDR[9:1] = 9'b0;
endmoduleNo laboratório Verilog da DE1-SoC, substitua todo o conteúdo de
leds_mirror.vpelo código POS acima. Mantenha o nomeleds_mirror.Substitua
TODO_CANONICAL_POS_EXPRESSIONpela POS canônica deF.Clique em Synthesize e aguarde. Corrija qualquer erro de sintaxe e sintetize novamente.
Clique em Upload to FPGA e aguarde a câmera ao vivo.
Percorra em
SW[2:0](C B A) as oito combinações000 ... 111, lendoLEDR[0]. Confirme que a POS produz as mesmas linhas observadas na tabela da SOP.Se uma linha divergir, verifique o maxtermo correspondente e as posições físicas
SW[2]=C,SW[1]=B,SW[0]=A.
Para esta função F, como o tamanho da POS canônica se compara ao da SOP canônica?
Um multiplexador 4 para 1
20 min
Um multiplexador (MUX) é um seletor: encaminha uma entre várias entradas de dados para uma única saída, escolhida por linhas de seleção. Um MUX 4 para 1 tem quatro entradas de dados e duas linhas de seleção, pois dois bits escolhem entre 2^2 = 4 entradas. Ele se comporta como uma chave rotativa: o valor de seleção define qual linha chega à saída.
Mapeamento de pinos deste exercício:
- Entradas de dados:
SW[3]=D3,SW[2]=D2,SW[1]=D1,SW[0]=D0 - Linhas de seleção:
SW[5]=S1,SW[4]=S0 - Saída:
LEDR[0] = Y
A seleção {S1,S0} escolhe 00 → D0, 01 → D1, 10 → D2, 11 → D3. O bloco combinacional always @(*) deve atribuir Y em toda combinação possível. Os quatro casos cobrem todos os valores binários dos dois bits; default acrescenta uma saída para valores sem correspondência na simulação. Um latch é inferido quando uma entrada possível deixa Y sem atribuição, não pela simples ausência de default.
// Lição 2 - Exercício 1-D: multiplexador 4 para 1
// Dados: SW[3]=D3, SW[2]=D2, SW[1]=D1, SW[0]=D0
// Seleção: SW[5]=S1, SW[4]=S0. Saída: LEDR[0]=Y.
module leds_mirror(SW, LEDR);
input [9:0] SW;
output [9:0] LEDR;
wire D0 = SW[0], D1 = SW[1], D2 = SW[2], D3 = SW[3];
wire S0 = SW[4], S1 = SW[5];
reg Y;
always @(*) begin
case ({S1, S0})
2'b00: Y = TODO_SELECTED_INPUT_00;
2'b01: Y = TODO_SELECTED_INPUT_01;
2'b10: Y = TODO_SELECTED_INPUT_10;
2'b11: Y = TODO_SELECTED_INPUT_11;
default: Y = 1'b0; // default evita inferir um latch
endcase
end
assign LEDR[0] = Y;
assign LEDR[9:1] = 9'b0;
endmoduleAntes de compilar, substitua as quatro expressões TODO por D0, D1, D2 e D3 na ordem de seleção 00, 01, 10, 11.
Substitua todo o conteúdo de
leds_mirror.vpelo módulo do multiplexador. Mantenha o nomeleds_mirror.Clique em Synthesize, aguarde e corrija qualquer erro relatado.
Clique em Upload to FPGA e aguarde a câmera ao vivo.
Defina as quatro chaves de dados como
SW[3:0] = 1010:D3=1,D2=0,D1=1,D0=0.Percorra
S1:S0 = 00, 01, 10, 11usandoSW[5]eSW[4]. LeiaLEDR[0](Y) e registre cada valor. Com dados1010, a saída deve seguir a entrada selecionada:0, 1, 0, 1.Como verificação, escolha um valor de seleção, altere a chave de dados correspondente e confirme que
Yacompanha apenas essa linha.
Mantenha SW[3:0] = 1010 (D3 D2 D1 D0 = 1 0 1 0). Para cada seleção, defina SW[5]=S1 e SW[4]=S0, indique a entrada escolhida e registre LEDR[0] (Y). O valor esperado é 0, 1, 0, 1.
| S1 = SW5 | S0 = SW4 | Entrada selecionada (D0..D3) | Y = LEDR0 (observado) |
|---|---|---|---|
Envie sua evidência. Faça uma captura da câmera com dados SW[3:0] = 1010 e seleção S1:S0 = 01 (SW[4] para cima, SW[5] para baixo). Isso seleciona D1 = 1, portanto LEDR[0] deve estar aceso.
Suponha que você apague o caso 2'b10 e também default. O que ocorre quando {S1,S0}=10 deixa Y sem atribuição? Explique o armazenamento indesejado inferido. Remover apenas default teria o mesmo problema se os quatro casos binários ainda atribuíssem Y?
Bônus: decodificador decimal de dois dígitos e sete segmentos
20 min
Este exercício é opcional. Se houver tempo, ele leva a saída de um único LED para os displays formatados de sete segmentos.
Um display de sete segmentos possui barras a a g que formam os algarismos. Na DE1-SoC, cada display HEX é ativo em nível baixo, e a ordem dos bits é {g, f, e, d, c, b, a}: um segmento acende quando seu bit recebe 0. Assim, o algarismo 0, com a,b,c,d,e,f acesos e g apagado, usa 7'b1000000.
Nomes dos segmentos e ordem ativa em nível baixo {g,f,e,d,c,b,a} nos displays HEX da DE1-SoC. 0 acende um segmento; 1 o apaga. O algarismo 0 usa 7'b1000000.
O projeto lê SW[3:0] como um valor de 0..15, mostra as unidades em HEX0 e as dezenas (0 ou 1) em HEX1. Para controlar HEX1, é necessário adicionar output [6:0] HEX1 à lista de portas do módulo, pois o projeto inicial expõe apenas HEX0. O módulo abaixo já declara ambas as saídas.
// Lição 2 - Exercício 1-E (opcional): decodificador decimal de dois dígitos
// Complete os padrões ativos em nível baixo e as equações de dezenas/unidades.
module leds_mirror(SW, HEX0, HEX1);
input [9:0] SW; // SW[3:0] = valor 0..15
output [6:0] HEX0; // unidades
output [6:0] HEX1; // dezenas (0 ou 1)
wire [4:0] v = {1'b0, SW[3:0]};
function [6:0] seg;
input [3:0] d;
case (d)
4'd0: seg = 7'b1000000;
4'd1: seg = TODO_SEGMENT_PATTERN_1;
4'd2: seg = TODO_SEGMENT_PATTERN_2;
4'd3: seg = TODO_SEGMENT_PATTERN_3;
4'd4: seg = TODO_SEGMENT_PATTERN_4;
4'd5: seg = TODO_SEGMENT_PATTERN_5;
4'd6: seg = TODO_SEGMENT_PATTERN_6;
4'd7: seg = TODO_SEGMENT_PATTERN_7;
4'd8: seg = TODO_SEGMENT_PATTERN_8;
4'd9: seg = TODO_SEGMENT_PATTERN_9;
default: seg = 7'b1111111;
endcase
endfunction
wire [3:0] tens = TODO_TENS_DIGIT;
wire [3:0] ones = TODO_ONES_DIGIT;
assign HEX0 = seg(ones);
assign HEX1 = seg(tens);
endmoduleOpcional. Substitua
leds_mirror.vpelo módulo do decodificador. Confirme que a lista de portas dizmodule leds_mirror(SW, HEX0, HEX1);; a nova saídaHEX1permite controlar as dezenas.Clique em Synthesize, corrija qualquer erro e sintetize novamente.
Clique em Upload to FPGA e aguarde a câmera.
Teste alguns valores:
0000deve mostrar0emHEX0e0emHEX1;1001(decimal 9) mostra9e0;1111(decimal 15) mostra5emHEX0e1emHEX1.
Qual alteração na lista de portas do módulo foi necessária para acender HEX1, e por quê?
O que você construiu
10 min
Explique como seu mapa de Karnaugh elimina B e cite um par de linhas que confirme isso na placa. Remeta à tabela sem copiá-la.
Com dados SW[3:0] = 1010, qual sequência de Y você observou quando S1:S0 percorreu 00, 01, 10, 11, e por que ela corresponde exatamente à entrada selecionada em cada caso?
Transforme esta visualização em uma sessão de aula
Continue para o LabsLand Teach para usar esta lição com seus estudantes e conferir o acesso disponível para sua conta.
Ainda não tem uma conta na LabsLand? Criar sua conta de professor