Multiplicador 8×8
Exercício lab4a
Registrador 16bits

Na continuação da construção do multiplicador 8×8, o objetivo desta etapa é construir em Verilog, um “16-bit register with synchronous control” (registrador de 16bits com controle síncrono) utilizando o “sequential process” (processo sequencial), sintetizar e verificar a sua operação.5

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

Passos A e B:

Abra o Quartus e o projeto do registrador: “File” -> “Open Project” -> Navegue até a pasta “lab4a” -> selecione e abra com o Quartus, o arquivo “reg16.qpf”.

Uma vez aberto o projeto, é hora de codificar o bloco do registrador 16 bits, cujo diagrama pode ser visto na figura abaixo:

“16-bit register with synchronous control” / “registrador de 16bits com controle síncrono”. Clique para ampliar.

No projeto, crie um arquivo Verilog HDL, conforme ensinado anteriormente e escreva a descrição de hardware de um “16-bit register with synchronous control” utilizando o “sequential process, tendo as informações abaixo como orientação:

O registrador deve ter:

  • Tamanho de 16 bits de entrada e de saída,
  • Clock de entrada,
  • Clear síncrono,
  • Um sinal para habilitar o clock que opere em modo síncrono.

Caso minhas notas sejam de grande valia para ti, vou ficar muito agradecido se você clicar nos anúncios desta página e conferir o que meus patrocinadores tem para lhe oferecer.

O comportamento do registrador deve ser conforme:

  • Todas transações ocorrem na borda de subida do “clk” (clock).
  • Após detectar a borda de subida do “clk”, precisa verificar se o sinal “clk_ena” está alto.
  • Se o sinal “clk_ena” estiver alto, precisa verificar se “sclr_n” é baixo. Se for, a saída do registrador deve ser apagada.
  • Se os sinais “clk_ena” e “scl_clr” estiverem altos, então a saída do registrador deve receber o valor da entrada do registrador.
  • O registrador não deve aceitar qualquer comando se o sinal “clk_ena” estiver baixo.
  • Utilize nomes do diagrama acima para nomear a sua descrição de hardware e portas, sempre utilizando caixa baixa.
  • Os controles síncronos não devem ser incluídos na lista e eventos (sensivity list).
  • A menos que explicitamente modificado, as saídas procedurais irão reter seus valores da execução prévia.

Salve o arquivo como “reg16.v” e ele deve ficar no diretório “lab4a”.

Segue abaixo um exemplo da descrição de hardware:

module reg16 (
	input [15:0] datain,		
	input clk, sclr_n, clk_ena,	
	output reg [15:0] reg_out	
);

	// Criando o processo sequencial, sensível ao clock e utilizando 
	// declarações if-else aninhadas para habilitar o clock síncrono e 
	// controle de clear.
	always@(posedge clk) begin
		if (clk_ena)
			if(!sclr_n)
				reg_out <= 16'b0 ;
			else
				reg_out <= datain;
	end 

endmodule

Passo D – Executar a simulação RTL:

Nesta etapa será verificada a funcionalidade do projeto. O exercício já tem um arquivo de testes, uma macro, criada para verificar se tudo está certinho.

Abra o Questa, e troque o diretório para o local do projeto “lab4a” e em seguida execute a macro, clicando em “Tools” -> “Tcl” -> “Execute Macro”, selecionando o arquivo de macro”reg16_tb.do” e clicando em “Open”.

Após rodar a macro, a tela Wave deve ficar conforme imagem abaixo:

Tela do “16-bit register with synchronous control”. Clique para ampliar.

Caso o resultado não seja conforme a tela acima, reveja os passos anteriores até obter o resultado esperado.

Nesta etapa foi codificado um “16-bit register with synchronous control” em Verilog, utilizando um “sequential procedural block” (bloco de procedimentos sequenciais) e foi verificado o seu correto funcionamento no Questa.

Feche a simulação.

Implementando e testando na Mini-FPGA, o registrador de 16bits com controle síncrono.

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.

Feito os testes, para subir a descrição de hardware para a placa de desenvolvimento, é necessário planejar o pin planner de acordo com o diagrama esquemático da placa Mini-FPGA, <que pode ser consultado neste link aqui>.

Considerações:

Os sinais “clk”, “sclr_n”, “clk_ena” e “datain[15:0]” representam 18 bits de entrada e a placa Mini-FPGA não tem todas as chaves necessárias para fazer o teste.

262144 combinações possíveis de teste:

Para elaborar um teste completo, precisaria usar os pinos de I/0 externos e montar um hardware adicional, ou elaborar no Questa, um programa que teste todas as possibilidades que esse circuito pode fazer. A própria Intel não fez isso na simulação RTL listada acima -.-

Simplificando:

Para as coisas continuarem simples, também vou fazer um teste parcial utilizando apenas os recursos da placa Mini-FPGA, lembrando que opções de testes mais elaboradas podem ser desenvolvidas, tanto em hardware como usando o Questa.

Desta forma vou distribuir os sinais da seguinte forma, na placa Mini-FPGA:

  • Cinco chaves SW[0:4] vão representar 5 bits LSB dos dados de entrada “datain”.
  • Chave SW5 vai representar o sinal “clk_ena”.
  • Chave SW6 vai representar o sinal “sclr_n”.
  • Chave SW7 vai representar o sinal “clk”.
  • Leds “Led[0:15]” vão representar a saída “reg_out[15:0]”

Conforme configuração indicada abaixo:

| datain[4] - PIN_N16 | datain[3] - PIN_N15 | datain[2] - PIN_P16 | datain[1] - PIN_P15 | datain[0] - PIN_R16 |

| clk_ena - PIN_M12 | sclr_n - PIN_N14 | clk - PIN_N13 |

| reg_out[0] - PIN_D15 | reg_out[1] - PIN_D16 | reg_out[2] - PIN_F15 | reg_out[3] - PIN_F16 |
| reg_out[4] - PIN_G15 | reg_out[5] - PIN_G16 | reg_out[6] - PIN_L13 | reg_out[7] - PIN_L14 |
| reg_out[8] - PIN_A5 | reg_out[9] - PIN_B5 | reg_out[10] - PIN_A4 | reg_out[11] - PIN_B4 |
| reg_out[12] - PIN_A3 | reg_out[13] - PIN_B3 | reg_out[14] - PIN_A2 | reg_out[15] - PIN_C3 |

Abaixo segue o print de tela da configuração do pin planner:

Mapeamento dos pinos do registrador de 16bits com controle síncrono. Clique para ampliar.

Publicado por Renato de Pierri em 01/12/2023.

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

Last updated by at .