산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
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.

디자인 예시

for 없이 Verilog에서 8비트 왼쪽 시프트 레지스터를 구현하는 방법을 살펴보겠습니다. 루프를 만든 다음 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

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

  
<노스크립트> <노스크립트> hardware schematic for shift register

verilog

  1. Verilog 소개
  2. C# for 루프
  3. C# foreach 루프
  4. For 루프를 사용하는 JAVA 프로그램의 암스트롱 번호
  5. Verilog 튜토리얼
  6. Verilog 연결
  7. Verilog 할당
  8. Verilog 차단 및 비 차단
  9. Verilog 기능
  10. Verilog 작업