Multiplicador 8×8
Exercício lab4b
Contador 2bits
assíncrono

Na continuação da construção do multiplicador 8×8, o objetivo desta etapa é construir em Verilog, um “2-bit counter with asynchronous control” (contador de dois bits com controle assíncrono), sintetizar e verificar a 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>.

Passos A e B:

Abra o projeto do contador no Quartus. Para isso, navegue até o diretório <Projeto Diretório>\lab4b e escolha Abrir projeto ao selecionar o arquivo “counter.qpf” para codificar o contador de 2 bits com controle assíncrono, conforme figura abaixo:

“2-bit counter with assynchronous control” (contador de 2 bits com controle assíncrono), clique para ampliar.

No Quartus crie no projeto counter, o arquivo verilog a partir do menu “File” -> “New”” -> “Verilog HDL file” -> “Ok” e monte o “2-bit counter with assynchronous control” utilizando o processo sequencial, conforme indicações a seguir:

  • O registrador possui um clock, um “clear” assíncrono e uma saída de dados de 2 bits.
  • A saída do contador deve ir para 00 imediatamente quando “aclr_n” está baixo.
  • Se “aclr_n” for alto, a saída do contador incrementa 1 cada vez que tiver uma subida no pulso de “clk”.
  • Use os nomes do diagrama acima para descrever o circuito e suas portas, sempre com todas em letras minúsculas.
  • A checagem dos sinais do “asynchronous register control” em um bloco processual sequencial, deve ocorrer primeiro.
  • Os controles assíncronos devem ser incluídos na lista de eventos (lista de sensibilidade).

Abaixo temos um exemplo de como esse código deve ficar:

module counter (
	input clk, aclr_n,			
	output reg [1:0] count_out	
);
	// Cria um processo sequencial sensível ao clock, com clear assíncrono.
	// Utilizando a instrução "if-else" para testar primeiro a atuação do sinal de controle assíncrono.
	// A contagem na borda ascendente do clock não irá acontecer, caso o clear esteja ativo.
	always@(posedge clk, negedge aclr_n) begin
		if (aclr_n == 1'b0)
			count_out <= 2'b0;
		else  
			count_out <= count_out + 1'b1;
    end 
endmodule 

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.

Passo C, Sintetizando:

Salve o arquivo como “counter.v” na pasta “lab4b” do diretório do projeto e proceda com a síntese e análise do mesmo, clicando em “Start” -> “Start Analysis & Synthesis.

Corrija todos os erros até que a janela de status da compilação apresente a mensagem: “Analysis & Synthesis was successful”.

Passo D, Executando a simulação RTL:

Utilize o Questa para verificar a funcionalidade do projeto.

Abra o Questa, selecione o menu “File” -> “Change Directory” -> e navegue até a pasta do projeto, que deve estar no diretório lab4b e clique em “Selecionar a pasta”.

Feito isso, rode o arquivo de macro “counter_tb.do” pelo menu “Tolls” -> “Tcl” -> “Execute macro” -> selecione o arquivo “counter_tb.do” -> e clique no botão “Abrir”.

A macro será executada e o Questa deve apresentar a tela de simulação Wave, conforme indicado abaixo:

Simulação do contador de 2 bits com controle assíncrono. Clique para ampliar.

Confira os resultados da simulação para ver se batem com a figura acima. Caso sua simulação tenha ficado diferente, precisa revisar os passos anteriores até que a saída fique conforme print de tela acima.

Implementando e testando na Mini-FPGA, o contador 2bits assí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:

Este bloco possui os sinais “clk”, “aclr_n”, “count_out[1:0]” do contador, e os sinais “clk_50Mhz” e “rst_50Mhz” para testar o contador. Esses sinais de teste, linhas 7 ao 25 e a declaração dos sinais, serão removidos no circuito final do multiplicador.

Abaixo temos a descrição de hardware do contador com o circuito de teste:

module tstnato(
  input clk_50mhz,rst_50mhz,  //gerador de clock 0,5hz - 1 segundo alto, 1 segundo baixo

 aclr_n,      
  output reg [1:0] count_out  
);
// Gerador de clock para testes
reg [25:0] count_reg = 0;
reg out_1hz = 0;
reg clk;
always @(posedge clk_50mhz or negedge rst_50mhz) begin
    if (rst_50mhz == 0) begin
        count_reg <= 0;
        out_1hz <= 0;
    end else begin
        if (count_reg < 50000000) begin
            count_reg <= count_reg + 1;
        end else begin
            count_reg <= 0;
            out_1hz <= ~out_1hz;
				clk <= out_1hz; // Aqui o clock é injetado no somador
        end
    end
end
	//Fim do gerador de clock
	
	// Somador de 2 bits
	// Cria um processo sequencial sensível ao clock, com clear assíncrono.
	// Utilizando a instrução "if-else" para testar primeiro a atuação do sinal de controle assíncrono.
	// A contagem na borda ascendente do clock não irá acontecer, caso o clear esteja ativo.
  always@(posedge clk, negedge aclr_n) begin
    if (aclr_n == 1'b0)
      count_out <= 2'b0;
    else  
      count_out <= count_out + 1'b1;
    end 
endmodule

O circuito de teste pega o sinal de 50Mhz e divide por 50 milhões, gerando o sinal de teste “out_1hz” que é um clock de 0,5hertz (1 segundo nível alto e 1 segundo nível baixo).

O sinal de teste “out_1hz” é injetado no sinal “clk” e o resto do contador é o mesmo do circuito do contador.

A partir da descrição acima, temos abaixo o mapeamento da pinagem e o respectivo print do pin planner:

|clk_50Mhz – PIN_E1|rst_50Mhz – PIN_J13|aclr_n – PIN_J14|count_out[1] – PIN_B5|count_out[0] – PIN_A5|

Contador e circuito de teste – mapeamento do pin planner. Clique para ampliar

Realizado por Renato de Pierri em 02/12/2023

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

Last updated by at .