Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Verilog для цикла

А for Цикл — это наиболее широко используемый цикл в программном обеспечении, но в основном он используется для реплицирования аппаратная логика в Verilog. Идея for Цикл состоит в повторении набора операторов, заданных в цикле, до тех пор, пока данное условие истинно. Это очень похоже на while цикла, но чаще используется в контексте, когда доступен итератор и условие зависит от значения этого итератора.

Синтаксис

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

  

Ключевое слово for используется для указания этого типа цикла и состоит из трех частей:

  1. Начальное условие для указания начальных значений сигналов
  2. Проверка, чтобы оценить, верно ли заданное условие
  3. Обновить управляющую переменную для следующей итерации.

Начальное условие и обновления управляющей переменной включены в for цикла и не требуется указывать отдельно, в отличие от while петля. А while Цикл имеет более общее назначение и в основном используется только тогда, когда данные операторы должны повторяться до тех пор, пока выполняется заданное условие. Однако for Цикл обычно имеет определенное начало и конец, управляемые переменной шага.

Вот простой пример, иллюстрирующий использование цикла 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

  
Журнал моделирования
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.

Пример дизайна

Давайте посмотрим, как 8-битный левый регистр сдвига может быть реализован в Verilog без for. цикла, а затем сравните его с кодом, используя for 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

  

Такое же поведение можно реализовать с помощью for цикл, который уменьшит код и сделает его масштабируемым для различной ширины регистра. Если сделать ширину регистра параметром Verilog, модуль дизайна станет масштабируемым, и тот же параметр можно будет использовать внутри for петля.

  
  
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

  

Тестовый стенд

Код тестового стенда показан ниже и реализует проект.

  
  
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. Введение в Верилог
  2. С# для цикла
  3. С# цикл foreach
  4. Число Армстронга в программе JAVA с использованием цикла for
  5. Учебник Verilog
  6. Конкатенация Verilog
  7. Верилог Задания
  8. Блокировка и неблокировка Verilog
  9. Верилог-функции
  10. Верилог Задача