산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog는 항상 차단

always 블록은 절차적 중 하나입니다. Verilog의 블록. always 블록 내의 명령문은 순차적으로 실행됩니다.

구문

  
  
always @ (event)
	[statement]
	
always @ (event) begin
	[multiple statements]
end

  

always 블록은 특정 이벤트에서 실행됩니다. 이벤트는 민감도 목록으로 정의됩니다.

민감도 목록이란 무엇입니까?

민감성 list는 always 블록이 실행되어야 하는 시기를 정의하는 표현식으로 @ 뒤에 지정됩니다. 괄호 ( ) 안의 연산자 . 이 목록에는 값 변경이 항상 블록을 실행하는 신호 그룹이 하나 또는 포함될 수 있습니다.

아래 표시된 코드에서 always 안의 모든 명령문은 신호 또는 b의 값이 변경될 때마다 블록이 실행됩니다.

  
  
// Execute always block whenever value of "a" or "b" change
always @ (a or b) begin
	[statements]
end

  

항상 블록은 무엇에 사용됩니까?

always 블록은 조합 또는 순차 요소를 구현하는 데 사용할 수 있습니다. 플립플롭과 같은 순차 소자는 클럭과 리셋이 제공되면 활성화된다. 마찬가지로 조합 블록은 입력 값 중 하나가 변경되면 활성화됩니다. 이러한 하드웨어 블록은 모두 서로 독립적으로 동시에 작동합니다. 각각의 연결이 데이터의 흐름을 결정합니다. 이 동작을 모델링하려면 always 차단은 감도 목록 내의 신호가 활성화될 때 트리거되고 일부 작업을 수행하는 연속 프로세스로 만들어집니다.

다음 예에서 always 블록 내의 모든 명령문은 신호 clk의 모든 양의 에지에서 실행됩니다.

  
  
// Execute always block at positive edge of signal "clk"
always @ (posedge clk) begin
	[statements]
end

  

민감도 목록이 없으면 어떻게 됩니까?

always 블록은 시뮬레이션 기간 동안 계속 반복됩니다. 감도 목록은 특정 타이밍 감각을 가져옵니다. 즉 감도 목록의 신호가 변경될 때마다 항상 차단이 트리거됩니다. 항상 블록 내에 타이밍 제어 문이 없으면 지연이 없는 무한 루프로 인해 시뮬레이션이 중단됩니다!

예시

아래에 표시된 예는 신호 clk의 값을 반전시키려는 always 블록입니다. 명령문은 0 시간 단위마다 실행됩니다. 따라서 명령문에 지연이 없기 때문에 영원히 실행됩니다.

  
  
// always block is started at time 0 units
// But when is it supposed to be repeated ?
// There is no time control, and hence it will stay and
// be repeated at 0 time units only. This continues
// in a loop and simulation will hang !
always clk = ~clk;

  

민감도 목록이 비어 있더라도 다른 형태의 시간 지연이 있어야 합니다. 시뮬레이션 시간은 always 내의 지연 문에 의해 앞당겨집니다. 아래와 같이 구성합니다. 이제 시계 반전은 10시간 단위마다 수행됩니다.

  
  
	always #10 clk = ~clk;

  

참고: 명시적 지연은 논리 게이트로 합성할 수 없습니다!

따라서 실제 Verilog 디자인 코드에는 항상 민감도 목록이 필요합니다.

순차적 요소 설계 예

아래 표시된 코드는 데이터 입력, 클록 및 액티브 로우 리셋을 수락하는 tff라는 모듈을 정의합니다. 클럭의 양의 에지에서 d가 1로 발견될 때마다 출력이 반전됩니다. 여기에서 always 블록은 clk의 양의 에지 또는 rstn의 음의 에지에서 트리거됩니다.

클록의 플러스 에지에서는 어떤 일이 발생합니까?

다음 이벤트는 클록의 양의 에지에서 발생하고 클록의 모든 양의 에지에 대해 반복됩니다.

  1. 첫 번째 if 블록은 액티브 로우 리셋 rstn의 값을 확인합니다.
    1. rstn이 0이면 출력 q는 기본값 0으로 재설정되어야 합니다.
    2. rstn이 1이면 재설정이 적용되지 않고 기본 동작을 따라야 함을 의미합니다.
  2. 이전 단계가 거짓인 경우:
    1. d의 값을 확인하고 1이면 q의 값을 반전합니다.
    2. d가 0이면 q 값을 유지

  
  
module tff (input  		d,
						clk,
						rstn,
			output reg 	q);
			
	always @ (posedge clk or negedge rstn) begin
		if (!rstn)
			q <= 0;
		else
			if (d)
				q <= ~q;
			else
				q <= q;
	end
endmodule

  

리셋의 네거티브 에지에서는 어떻게 됩니까?

다음 이벤트는 rstn의 음수 에지에서 발생하며 이러한 모든 경우에 발생합니다.

  1. 첫 번째 if 블록은 먼저 액티브 로우 리셋 값을 확인합니다. 신호의 음의 에지에서 값은 0입니다.
    1. rstn의 값이 0이면 리셋이 적용되고 출력을 기본값 0으로 리셋해야 함을 의미합니다.
    2. rstn의 값이 1인 경우는 현재 이벤트가 negative edge이므로 고려하지 않음 첫 번째

조합 요소 설계 예

always 블록은 조합 블록 설계에도 사용할 수 있습니다. 예를 들어 다음 디지털 회로는 신호 o에서 특정 출력을 제공하는 3개의 서로 다른 논리 게이트의 조합을 나타냅니다.

<노스크립트> combinational-gates

아래에 표시된 코드는 module입니다. 4개의 입력 포트와 o라는 단일 출력 포트가 있습니다. always 차단은 민감도 목록의 신호 값이 변경될 때마다 트리거됩니다. 출력 신호는 reg 유형으로 선언됩니다. 절차 블록에서 사용되기 때문에 모듈 포트 목록에 있습니다. 절차 블록에서 사용되는 모든 신호는 reg 유형으로 선언되어야 합니다. .

  
  
module combo (	input 	a,
      			input	b,
              	input	c,
              	input	d,
  	            output reg o);
  
  always @ (a or b or c or d) begin
    o <= ~((a & b) | (c^d));
  end
  
endmodule

  

RHS의 조합 식이 참이 될 때마다 신호 o가 1이 되는 것을 보십시오. 마찬가지로 o는 RHS가 거짓일 때 0이 됩니다.

시뮬레이션 출력

시뮬레이션 예제가 있는 슬라이드쇼를 보려면 여기를 클릭하십시오!


verilog

  1. Verilog 튜토리얼
  2. Verilog 연결
  3. Verilog - 호두 껍질에
  4. Verilog 할당
  5. Verilog 차단 및 비 차단
  6. Verilog 기능
  7. Verilog 작업
  8. Verilog 클록 생성기
  9. Verilog 수학 함수
  10. Verilog 시간 형식