Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Verilog para Loop


A for loop é o loop mais usado em software, mas é usado principalmente para replicar lógica de hardware em Verilog. A ideia por trás de um for loop é iterar um conjunto de instruções fornecidas dentro do loop, desde que a condição dada seja verdadeira. Isso é muito semelhante ao while loop, mas é usado mais em um contexto em que um iterador está disponível e a condição depende do valor desse iterador.

Sintaxe

  
  
	for (<initial_condition>; <condition>; <step_assignment>) begin
		// Statements
	end

  

A palavra-chave for é usado para especificar este tipo de loop e tem três partes:
  1. Condição inicial para especificar valores iniciais de sinais
  2. Uma verificação para avaliar se a condição fornecida é verdadeira
  3. Atualize a variável de controle para a próxima iteração


A condição inicial e as atualizações da variável de controle estão incluídas no for loop e não precisa ser especificado separadamente, diferente de um while ciclo. Um while loop é de propósito mais geral e é usado principalmente apenas quando as instruções fornecidas devem ser repetidas enquanto uma determinada condição. No entanto, o for loop normalmente tem um início e um fim definidos controlados pela variável step.

Aqui está um exemplo simples que ilustra o uso de um loop for.
  
  
module my_design;
	integer i;
	
	initial begin
		// Note that ++ operator does not exist in Verilog !
		for (i = 0; i < 10; i = i + 1) begin
			$display ("Current loop#%0d ", i);
		end
	end
endmodule

  
Registro de simulação
ncsim> run
Current loop#0 
Current loop#1 
Current loop#2 
Current loop#3 
Current loop#4 
Current loop#5 
Current loop#6 
Current loop#7 
Current loop#8 
Current loop#9 
ncsim: *W,RNQUIE: Simulation is complete.

Exemplo de projeto


Vamos dar uma olhada em como um registrador de deslocamento à esquerda de 8 bits pode ser implementado em Verilog sem um for loop e compare-o com o código usando um for loop apenas para apreciar a utilidade de uma construção de loop.
  
  
module lshift_reg (input 						clk,				// Clock input
                   input 						rstn,				// Active low reset input
                   input [7:0] 			load_val, 	// Load value 
                   input 						load_en, 		// Load enable
                   output reg [7:0] op); 				// Output register value

	 // At posedge of clock, if reset is low set output to 0
	 // If reset is high, load new value to op if load_en=1
	 // If reset is high, and load_en=0 shift register to left
	 always @ (posedge clk) begin
	    if (!rstn) begin
	      op <= 0;
	    end else begin
	    	if (load_en) begin
	      	op <= load_val;
	      end else begin
	        op[0] <= op[7];
	        op[1] <= op[0];
	        op[2] <= op[1];
	        op[3] <= op[2];
	        op[4] <= op[3];
	        op[5] <= op[4];
	        op[6] <= op[5];
	        op[7] <= op[6];
	      end
	    end
	  end
endmodule

  

O mesmo comportamento pode ser implementado usando um for loop que reduzirá o código e o tornará escalável para diferentes larguras de registro. Se a largura do registro for um parâmetro Verilog, o módulo de design se tornará escalável e o mesmo parâmetro poderá ser usado dentro do for ciclo.
  
  
module lshift_reg (input 						clk,				// Clock input
                   input    				rstn,				// Active low reset input
                   input [7:0] 			load_val, 	// Load value 
                   input 						load_en, 		// Load enable
                   output reg [7:0] op); 				// Output register value

	 integer i;
	 
	 // At posedge of clock, if reset is low set output to 0
	 // If reset is high, load new value to op if load_en=1
	 // If reset is high, and load_en=0 shift register to left
	 always @ (posedge clk) begin
	    if (!rstn) begin
	      op <= 0;
	    end else begin
	    
	    	// If load_en is 1, load the value to op
	    	// else keep shifting for every clock
	    	if (load_en) begin
	      	op <= load_val;
	      end else begin
            for (i = 0; i < 8; i = i + 1) begin
              op[i+1] <= op[i];
            end
            op[0] <= op[7];
	      end
	    end
	  end
endmodule

  

Banco de teste


O código do testbench é mostrado abaixo e instancia o design.
  
  
module tb;
  reg clk;
  reg rstn;
  reg [7:0] load_val;
  reg load_en;
  wire [7:0] op;
  
  // Setup DUT clock
  always #10 clk = ~clk;
  
  // Instantiate the design
  lshift_reg u0 ( .clk(clk),
                 .rstn (rstn),
                 .load_val (load_val),
                 .load_en (load_en),
                 .op (op));
  
  initial begin
  	// 1. Initialize testbench variables
    clk <= 0;
    rstn <= 0;
    load_val <= 8'h01;
    load_en <= 0;
    
    // 2. Apply reset to the design
    repeat (2) @ (posedge clk);
    rstn <= 1;
    repeat (5) @ (posedge clk);
    
    // 3. Set load_en for 1 clk so that load_val is loaded
    load_en <= 1;
    repeat(1) @ (posedge clk);
    load_en <= 0;
    
    // 4. Let design run for 20 clocks and then finish
    repeat (20) @ (posedge clk);
    $finish;
  end
endmodule

  

Verilog

  1. Introdução ao Verilog
  2. C# para loop
  3. C# loop foreach
  4. Armstrong Number no programa JAVA usando For Loop
  5. Tutorial Verilog
  6. Concatenação Verilog
  7. Atribuições Verilog
  8. Verilog Blocking &Non-Blocking
  9. Funções Verilog
  10. Tarefa Verilog