산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 임베디드

Verilog의 조합 회로 설명

2019년 1월 6일 Dr. Steve Arar

이 기사에서는 조건 연산자를 사용하여 조합 진리표를 설명하는 방법을 조사하여 Verilog에서 조합 회로를 설명하는 기술을 소개합니다.

이 기사에서는 조건 연산자를 사용하여 조합 진리표를 설명하는 방법을 조사하여 Verilog에서 조합 회로를 설명하는 기술을 소개합니다. 또한 조합 회로를 설명하기 위해 Verilog "always" 블록을 활용하는 방법을 보여줍니다. "always" 블록은 디지털 회로를 설명하는 훨씬 더 쉬운 솔루션을 제공할 수 있습니다.

이전 기사에서 Verilog "assign" 키워드를 사용하여 연속 할당을 수행하는 방법에 대해 논의했습니다. 이러한 할당은 항상 활성 상태이며 디지털 회로의 게이트 수준 설명을 획득하는 데 사용할 수 있습니다. 예를 들어, AND 게이트를 설명하는 다음 코드에서 오른쪽은 지속적으로 평가되고 결과는 out1 net에 표시됩니다.

out1 할당 =a &b;  

Verilog에는 이러한 할당을 수행하기 전에 조건을 확인할 수 있는 조건부 연산자(?:)가 있습니다. 구문은 다음과 같습니다.

assign [signal_name] =[conditional_expression] ? [value_if_true] :[value_if_false]; 

"conditional_expression"이 평가됩니다. true이면 "signal_name"에 "value_if_true"가 할당됩니다. true가 아니면 "signal_name"은 "value_if_false"를 얻습니다. 예를 들어 다음 코드를 고려하십시오.

out1 할당 =(sel) ? (a &b) :(a|b); 

"sel"이 true이면 &b는 "out1"에 할당됩니다. 사실이 아니면 "out1"은 |b를 얻습니다. 따라서 위의 코드는 2:1 멀티플렉서의 기능을 구현합니다. 이 코드의 개념적 구현은 아래 그림 1과 같을 수 있습니다.

조건부 할당을 사용하면 전통적인 컴퓨터 프로그래밍 언어에서 볼 수 있는 "if" 문의 기능이 있기 때문에 특정 회로에 대해 보다 추상적인 설명을 할 수 있습니다. 조건 연산자는 더 복잡한 회로를 구현하기 위해 중첩된 형태로 사용될 수 있습니다. 예 1은 이러한 세부 사항을 설명합니다.

예시 1:중첩 조건 연산자

조건부 연산자(?:)를 사용하여 다음 진리표를 사용하여 4:2 우선 순위 인코더를 설명합니다.

이 우선 순위 인코더에 대한 Verilog 코드는 다음과 같습니다.

 모듈 Prio_4_to_2 ( 입력 와이어 [3:0] x, 출력 와이어 [1:0] y, 출력 와이어 v ); 할당 y =x[3] ? 2'b11 :x[2] ? 2'b10 :x[1] ? 2'b01 :2'b00; v =( x[3] | x[2] | x[1] | x[0] ) ? 1'b1 :1'b0; 엔드 모듈 

7~10행을 제외하고 코드에는 이전 기사에서 논의한 기본 언어 요소가 포함되어 있습니다. 이제 이 행을 살펴보겠습니다.

2'b11, 2'b10, 2'b01이라는 용어는 2비트 이진수를 나타내는 Verilog 표기법을 나타냅니다. 일반적으로 'b' 앞의 첫 번째 숫자는 비트 수를 지정합니다. 문자 b는 숫자가 이진수임을 지정합니다. 'b' 뒤의 숫자는 숫자의 값을 나타냅니다. 따라서 2'b01은 값이 01인 2비트 이진수를 나타내는 Verilog 표기법이고 3'b100은 값이 100인 3비트 이진수를 나타냅니다.

7행은 조건 연산자에서 입력 x[3]의 MSB를 확인합니다. x[3]=1이면 조건이 참으로 평가되고 2'b11이 y에 할당됩니다(할당된 값은 진리표에서 가져옴). x[3]=0이면 조건이 false로 평가되고 콜론(:) 뒤의 표현식이 y에 할당됩니다. 콜론 뒤의 식은 8행의 코드로 그 자체가 또 다른 조건 연산자입니다.

8행의 두 번째 조건 연산자는 입력의 두 번째 최상위 비트인 x[2]를 검사하여 2'b10을 y에 할당해야 하는지 아니면 또 다른 조건 연산자(9행)인 콜론 뒤에 표현식을 할당해야 하는지 결정합니다. 평가받다. y에 할당된 값이 주어진 진리표와 일치하는지 확인할 수 있습니다.

진리표의 유효한 출력(v)은 입력의 적어도 하나의 비트가 논리 하이이면 논리 하이가 됩니다. 11행은 비트 OR 연산자(|)를 입력 비트에 적용하여 이 설명을 보여줍니다. 위 코드의 Xilinx ISE 시뮬레이션은 그림 2에 나와 있습니다.

그림 2. 위 코드의 Xilinx ISE 시뮬레이션

조건식은 참 표현식을 찾을 때까지 연속적으로 평가된다는 점에 유의하는 것이 중요합니다. 이 true 표현식에 해당하는 할당이 수행됩니다. 결과적으로 이전에 평가된 표현식이 다음 표현식에 비해 더 높은 우선순위를 갖습니다. 이는 이론적으로 조건부 연산자가 멀티플렉서(그림 4)와 같은 균형 구조보다 우선 순위 네트워크(그림 3)를 구현하는 데 더 적합하다는 것을 의미합니다.

그림 3. 우선순위 네트워크.

그림 4. 입력 간에 우선 순위가 없는 n-to-1 멀티플렉서입니다.

이전 기사는 VHDL 동시 할당에 대한 유사한 논의를 보여줍니다.

Verilog 절차적 진술

모든 조합 회로를 몇 가지 기본 논리 게이트(AND, OR, NOT 등)로 분리하고 "할당" 문을 사용하여 이러한 게이트를 설명할 수 있습니다(게이트 수준 설명). 우리는 또한 이전 섹션에서 논의한 조건부 연산자를 사용하여 일부 조합 회로를 설명하는 보다 추상적인 방법을 사용할 수 있습니다(컴퓨터 프로그래밍 언어의 "if" 문과 유사). 그러나 Verilog "항상" 차단을 사용하는 더 강력한 솔루션이 있습니다.

"항상" 블록 내에서 순서대로 실행되는 절차적 명령문을 가질 수 있습니다. 또한 "always" 블록은 "if" 및 "case" 문과 같은 추상 언어 구문을 지원합니다.

"항상" 블록 내에서 사용할 수 있는 추상 언어 구성과 함께 순차적 실행 기능을 사용하면 인간의 추론이 순차적인 특성을 갖고 추상적 설명에 의존하기 때문에 회로의 기능을 보다 쉽게 ​​설명할 수 있습니다. 우리는 일반적으로 저수준 논리 게이트의 관점보다는 알고리즘적 고수준 방식으로 생각합니다. "항상" 블록은 디지털 회로를 설명하는 더 쉬운 솔루션을 제공할 수 있습니다. HDL이 순차 문에 기반한 설명을 지원하는 이유에 대한 자세한 내용은 내 기사 순차 VHDL 문 소개를 참조하세요.

예시 2:"항상" 차단 문

"항상" 블록의 단순화된 구문은 다음과 같습니다.

항상 @(sensitivity_list)은 sequence_statements를 시작합니다. 끝 

sensitivity_list는 "always" 블록 내의 순차 명령문이 실행되어야 하는 시기를 지정합니다. 예를 들어, "항상" 블록을 사용하여 그림 5의 회로를 설명하는 것을 고려하십시오.

그림 5. Circuit_1

또는 b 중 하나가 변경되면 출력이 변경될 수 있으며, 이는 및 b 모두 "항상" 블록의 민감도 목록에 있어야 함을 의미합니다. 일반적으로 조합 회로의 경우 모든 입력 신호가 감도 목록에 포함되어야 합니다.

이제 비트 AND 연산자를 사용하여 회로(a&b)의 기능을 설명하고 결과를 출력에 할당할 수 있습니다. "always" 블록 내에는 두 가지 다른 유형의 할당이 있습니다:차단 할당(=) 및 비차단 할당(<=). 차단 할당을 사용하여 다음 코드를 얻습니다.

항상 @(a, b)begin out1 =a &b;end 

차단 할당과 비차단 할당의 차이점은 무엇인가요?

차단 할당을 사용하면 오른쪽이 평가되고 즉시 out1에 할당됩니다. 따라서 3행이 실행되면 코드의 다음 행으로 이동하기 전에 out1이 즉시 업데이트됩니다. "할당 차단"이라는 이름은 왼쪽이 업데이트될 때까지 다음 줄이 차단된다는 것을 강조합니다.

비차단 할당을 사용하면 오른쪽 표현식이 평가되지만 "항상" 블록의 끝에 도달할 때까지 왼쪽 변수에는 적용되지 않습니다. 차단 또는 비차단 할당의 선택은 초보자에게 혼란을 줄 수 있으며 부적절하게 사용하면 원하지 않는 기능이 발생할 수 있습니다. 예를 들어, 플립플롭을 추론하기 위해 차단 할당을 사용하면 경쟁 조건이 발생할 수 있습니다.

이 소개 기사에서는 세부 사항을 더 이상 다루지 않고 잠재적인 함정을 피하기 위해 하나의 간단한 지침만 고수할 것입니다. 조합 회로에 대한 코드를 작성할 때 차단 할당을 사용하십시오. 따라서 목록 1의 "항상" 블록은 AND 게이트를 설명하는 데 사용됩니다.

이전 기사에서 Verilog "와이어" 데이터 유형에 익숙해졌습니다. 이 데이터 유형은 FPGA 설계에서 물리적 와이어를 나타냅니다. "항상" 블록 내에서 Verilog 표준은 "와이어"에 값을 할당하는 것을 허용하지 않습니다. 대신 "reg" 데이터 유형을 사용합니다. "reg"라는 이름은 다소 혼란스럽지만 "reg"는 디자인에서 물리적 스토리지 요소로 이어질 수도 있고 그렇지 않을 수도 있습니다. 다음 코드는 "always" 블록을 사용한 그림 5의 Verilog 설명입니다. 출력 데이터 유형은 절차 할당에서 값을 가져오기 때문에 "reg"여야 합니다.

 모듈 Circuit_1 ( 입력 와이어 a, 입력 와이어 b, 출력 reg out1 ); 항상 @ (a, b) 시작 out1 =a &b; 엔드 모듈 

이 기사에서 우리는 Verilog 조건 연산자에 대해 배웠습니다. 우선 순위 인코더를 설명하기 위해 이 연산자의 중첩 형식을 사용했습니다. 그런 다음 조합 회로를 설명하기 위해 더 강력한 언어 구성인 "항상" 블록에 대해 설명했습니다. 다음 기사에서 "always" 블록을 사용하여 순차 회로를 구현하는 방법을 살펴보겠습니다.


임베디드

  1. Verilog 소개
  2. DC 회로 소개
  3. AC 회로 소개
  4. 다중 조합 회로 사용
  5. 제어 회로
  6. C# 연산자
  7. C# 삼항(? :) 연산자
  8. Verilog 튜토리얼
  9. Verilog 연결
  10. Verilog `ifdef 조건부 컴파일