Multiplicador 8×8:
Exercício lab2a
4-bits 2:1 Mux

Na continuação da construção do multiplicador 8×8, o objetivo desta etapa é construir em Verilog, um multiplexador de 4 bits 2:1, utilizando a cláusula de controle “if-else”, sintetizar e verificar sua operação. O projeto resolvido desta etapa, pode ser baixado diretamente no github <clicando neste link aqui> e no diretório raiz IVER10_1 temos todos os arquivos e instruções dos exercícios.

Se você caiu de paraquedas por aqui e precisa saber como instalar o software Questa para trabalhar com Verilog, leia a série “Instalando Quartus com Questa”, <clicando neste link aqui>.

Continuando, passos A e B:

A instrução pede para abrir o Quartus, navegar até a pasta lab2a, selecionar e abrir o arquivo mux4.qpf e em seguida pede para escrever a descrição de hardware do bloco multiplexador 2:1, conforme indicado na figura abaixo:

Mux de 4 bits, 2 entradas de 4 bits e uma saída de 4 bits “mux 4 2:1”, clique para ampliar.

O multiplexador deve ter:

  • 2 entradas de 4 bits: “mux_in_a[3:0]”, “mux_in_b[3:0].
  • Uma linha de seleção “mux_sel”.
  • Uma linha de saída com 4 bits “mux_out[3:0]”.
  • Quando “mux_sel” tiver valor lógico zero, ele deve apresentar a entrada “mux_in_a[3:0]” em “mux_out[3:0]”.
  • Quando “mux_sel” tiver valor lógico um, ele deve apresentar a entrada “mux_in_b[3:0]” em “mux_out[3:0]”.
  • A codificação com declarações de comportamento “behavioral”, sempre requer o uso de blocos “block”.
  • Todas entradas do bloco procedural, devem ser listadas na lista de monitoramento de eventos do bloco.

Código criado para o multiplexador:

module mux4(
	input [3:0] mux_in_a, mux_in_b,
	input mux_sel,
	output reg[3:0] mux_out
);

	//Criando processo sensivel a todas entradas
	always@(mux_in_a, mux_in_b, mux_sel) begin
		if (mux_sel == 1'b0)
			mux_out = mux_in_a;
		else
			mux_out = mux_in_b;
		end
endmodule

Passo C: Sintetizando o projeto e corrigindo erros.

Uma vez criado o bloco, salve como mux4.v, no diretório do exercício lab2a, mande sintetizar e vá corrigindo os erros até que retorne a mensagem “Quartus Prime Analysis & Synthesis was successful”.

Passo D: Executando a simulação RTL:

Como nos exercícios anteriores, é para abrir o Questa e mudar para o diretório do exercício, que no caso é o lab2a.

Clique em “Tools” -> “Tcl” -> “Execute macro”, selecione o arquivo “mux4_tb.do” e clique em “Abrir”.

Neste momento o diretório work será adicionado à lista de arquivos e em seguida será aberta a janela do “Quarter Intel Starter FPGA Edition”.

Na área da janela “Wave – Default”, clique com o botão direito do mouse sobre a área das formas de onda e selecione a opção “Zoom Full”.

Observe na tela “Wave – Default”, que “mux_out” irá apresentar o valor, de acordo com a seleção de “mux_sel”, conforme indicado na tabela abaixo:

mux_sel mux_in_a mux_in_b mux_out
0 9 7 9
1 9 7 7

Simulação do funcionamento do Mux 4 bits 2:1, clique para ampliar.

Caso a simulação não fique conforme apresentado na figura acima, precisa proceder com a revisão do exercício.

Implementando e testando na Mini-FPGA, o multiplexador de 4 bits 2:1

Os passos a seguir são específicos para a placa de desenvolvimento Mini-FPGA utilizando o Cyclone IV EP4CE6F17C8.

Caso esteja utilizando outra placa de desenvolvimento, os devidos ajustes devem ser realizados.

Para testar o módulo do multiplexador de 4 bits 2:1, são necessários:

  • 4 chaves para o sinal “mux_in_a[3:0]”
  • 4 chaves para o sinal “mux_in_b[3:0]”
  • 1 botão binário “mux_sel” para selecionar qual entrada irá aparecer na saída.
  • 4 saídas led para o sinal “mux_out[3:0]”

Quando o botão “mux_sel” estiver em zero, “mux_out[3:0]” irá apresentar o sinal “mux_in_a[3:0]”.

Quando o botão “mux_sel” estiver em um, “mux_out[3:0]” irá apresentar o sinal “mux_in_b[3:0]”.

Dito isso, é hora de abir a interface do Pin Planner do Questa, já configurada para CycloneIV EP4CE6F17C8 e atribuir os pinos de acordo com o layout de hardware da placa Mini-FPGA, conforme lista a seguir:

| mux_in_a[0] - PIN_N16 | mux_in_a[1] - PIN_M12 | mux_in_a[2] - PIN_N14 | mux_in_a[3] - PIN_N13 |
| mux_in_b[0] - PIN_R16 | mux_in_b[1] - PIN_P15 | mux_in_b[2] - PIN_P16 | mux_in_b[3] - PIN_N15 |
| mux_out[0]  - PIN_A5  | mux_out[1]  - PIN_B5  | mux_out[2]  - PIN_A4  | mux_out[3]  - PIN_B4  |
| mux_sel     - PIN J14 |

O pin planner deve ficar conforme figura abaixo:

Atribuição de pinos de acordo com a placa Mini-FPGA. Clique para ampliar.

Fechar a janela do pin-planner, compilar o projeto, fazer o upload do código no chip e testar o funcionamento do mux.

  • Quando “Key 0″ estiver em nível lógico 1 (solta), mux_out[3:0]” irá apresentar o valor das chaves de “mux_in_b[3:0]”
  • Quando “Key 0″ estiver em nível lógico 0 (acionada), mux_out[3:0]” irá apresentar o valor das chaves de “mux_in_a[3:0]”

Publicado por Renato de Pierri em 28/11/2023.

Fonte: Manual de exercícios de Introdução ao Verilog, da Intel.

Last updated by at .