Teach Remote lab lessons

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.

  • Altera DE1-SoC
  • 70 min
  • Graduação, introdutório
  • Português (Brasil)
  • Digital systems & FPGA
Altera DE1-SoC
Altera DE1-SoC

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.

1

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 0F=0
- Linha 1: C B A = 0 0 1F=1
- Linha 2: C B A = 0 1 0F=0
- Linha 3: C B A = 0 1 1F=1
- Linha 4: C B A = 1 0 0F=1
- Linha 5: C B A = 1 0 1F=0
- Linha 6: C B A = 1 1 0F=1
- Linha 7: C B A = 1 1 1F=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?

2

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(C,B,A), com os mintermos 1, 3, 4 e 6 marcados como 1. Dois pares adjacentes estão contornados, mas os termos reduzidos não aparecem; o estudante deve identificar a variável que muda em cada grupo.

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.

3

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;
endmodule
  1. Abra o laboratório Verilog da DE1-SoC. O editor mostra leds_mirror.v.

  2. Selecione todo o conteúdo de leds_mirror.v e substitua-o pelo módulo acima. Mantenha o nome leds_mirror.

  3. Substitua TODO_CANONICAL_SOP_EXPRESSION por sua SOP canônica. Mantenha exatamente uma linha assign LEDR[0] = ...;.

  4. 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.

  5. Clique em Upload to FPGA (Enviar para a FPGA) e aguarde a sessão ao vivo e a câmera.

  6. Percorra em SW[2:0] (C B A) as oito combinações 000, 001, 010, 011, 100, 101, 110, 111, lendo LEDR[0] na câmera e registrando cada resultado.

  7. 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 com F=0 e uma com F=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.

4

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;
endmodule
  1. No laboratório Verilog da DE1-SoC, substitua todo o conteúdo de leds_mirror.v pelo código POS acima. Mantenha o nome leds_mirror.

  2. Substitua TODO_CANONICAL_POS_EXPRESSION pela POS canônica de F.

  3. Clique em Synthesize e aguarde. Corrija qualquer erro de sintaxe e sintetize novamente.

  4. Clique em Upload to FPGA e aguarde a câmera ao vivo.

  5. Percorra em SW[2:0] (C B A) as oito combinações 000 ... 111, lendo LEDR[0]. Confirme que a POS produz as mesmas linhas observadas na tabela da SOP.

  6. 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?

5

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;
endmodule
  1. Substitua todo o conteúdo de leds_mirror.v pelo módulo do multiplexador. Mantenha o nome leds_mirror.

  2. Clique em Synthesize, aguarde e corrija qualquer erro relatado.

  3. Clique em Upload to FPGA e aguarde a câmera ao vivo.

  4. Defina as quatro chaves de dados como SW[3:0] = 1010: D3=1, D2=0, D1=1, D0=0.

  5. Percorra S1:S0 = 00, 01, 10, 11 usando SW[5] e SW[4]. Leia LEDR[0] (Y) e registre cada valor. Com dados 1010, a saída deve seguir a entrada selecionada: 0, 1, 0, 1.

  6. Como verificação, escolha um valor de seleção, altere a chave de dados correspondente e confirme que Y acompanha 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?

6

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.

Esquema de um display de sete segmentos com barras a a g. A ordem dos bits é g f e d c b a e os segmentos são ativos em nível baixo; o algarismo 0 acende a até f e apaga g.

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);
endmodule
  1. Opcional. Substitua leds_mirror.v pelo módulo do decodificador. Confirme que a lista de portas diz module leds_mirror(SW, HEX0, HEX1);; a nova saída HEX1 permite controlar as dezenas.

  2. Clique em Synthesize, corrija qualquer erro e sintetize novamente.

  3. Clique em Upload to FPGA e aguarde a câmera.

  4. Teste alguns valores: 0000 deve mostrar 0 em HEX0 e 0 em HEX1; 1001 (decimal 9) mostra 9 e 0; 1111 (decimal 15) mostra 5 em HEX0 e 1 em HEX1.

Qual alteração na lista de portas do módulo foi necessária para acender HEX1, e por quê?

7

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?