Teach lesson
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.
New to LabsLand? Create your teacher account
Learning Outcomes
Obter as formas soma de produtos (SOP) e produto de somas (POS) 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.
Montar e verificar um multiplexador 4 para 1 que encaminha uma de quatro entradas para a saída.
Student activity preview
Activity Content
Preview only. In a class session, students can fill in responses and submit their work to the teacher.
Da tabela-verdade ao circuito
8 min
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
14 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
14 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
14 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
12 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
O valor {S1, S0} escolhe 00 → D0, 01 → D1, 10 → D2, 11 → D3. O módulo usa case dentro de always @(*). O ramo default não é decorativo: se alguma combinação deixasse Y sem atribuição, o sintetizador inferiria um latch para lembrar o valor anterior, transformando lógica combinacional em memória acidental. Atribuir Y em todos os caminhos garante um valor definido e evita o latch.
// 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;
endmoduleSubstitua 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.
Imagine que você removesse a linha default: Y = 1'b0;, deixando Y sem atribuição em alguma combinação. Qual componente indesejado o sintetizador inferiria, e por que isso entra em conflito com o multiplexador puramente combinacional pretendido?
Bônus: decodificador decimal de dois dígitos e sete segmentos
4 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
4 min
Em um parágrafo curto, resuma o trabalho com F(C,B,A): como a SOP e a POS canônicas vieram da tabela, como o mapa reduziu F à expressão mínima e o que uma variável ausente revelou. Mencione que as formas canônica e mínima produziram saídas idênticas na placa.
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?