관련 기사
디지털 IC 프런트 엔드 연구 노트: LSFR(Linear Feedback Shift Register)
디지털 IC 프런트 엔드 연구 노트: 교차 클록 도메인 신호 동기화
디지털 IC 프런트 엔드 연구 노트: 신호 동기화 및 에지 감지
디지털 IC 프런트 엔드 연구 노트: FIFO의 Verilog 구현(1)
디지털 IC 프런트 엔드 연구 노트: FIFO의 Verilog 구현(2)
디지털 IC 프런트엔드 연구 노트: LRU(최소 최근 사용) 알고리즘
목차
2. 바이너리 코드에서 그레이 코드로 Verilog 구현
1. 그레이 코드 인코딩/디코딩
그레이 코딩은 1953년 프랭크 그레이(Frank Gray)가 공개한 특허에서 등장하는데, 인접한 코딩 값 중 1비트만 변화하는 것이 주요 특징이며, 3비트와 4비트 바이너리 코드와 이에 대응하는 그레이 코드는 다음 표와 같다. 그림 이 기능은 에서 명확하게 볼 수 있으며 이 기능은 또한 그레이 코드가 매우 광범위한 응용 프로그램을 갖도록 합니다.
3비트 그레이 코드
십진법 | 이진 코드 | 그레이 코딩 |
0 | 000 | 000 |
1 | 001 | 001 |
2 | 010 | 011 |
삼 | 011 | 010 |
4 | 100 | 110 |
5 | 101 | 111 |
6 | 110 | 101 |
7 | 111 | 100 |
4비트 그레이 코드
십진법 | 이진 코드 | 그레이 코딩 | 십진법 | 이진 코드 | 그레이 코딩 |
0 | 0000 | 0000 | 8 | 1000 | 1100 |
1 | 0001 | 0001 | 9 | 1001 | 1101 |
2 | 0010 | 0011 | 10 | 1010 | 1111 |
삼 | 0011 | 0010 | 11 | 1011 | 1110 |
4 | 0100 | 0110 | 12 | 1100 | 1010 |
5 | 0101 | 0111 | 13 | 1101 | 1011 |
6 | 0110 | 0101 | 14 | 1110 | 1001 |
7 | 0111 | 0100 | 15 | 1111 | 1000 |
그레이 코딩은 두 개의 서로 다른 클록을 사용하는 비동기식 FIFO(First In First Out)에서 널리 사용됩니다. 일반적으로 여러 비트의 데이터가 클록 도메인 경계를 넘을 때 기존 동기화 장치를 사용하여 데이터의 각 비트를 직접 동기화할 수 없습니다. 이러한 데이터가 동시에 동기화된다는 보장이 없고 높은 오류율이 발생할 수 있기 때문입니다. . 그러나 다중 비트 데이터가 그레이 코딩되고 한 번에 한 비트의 데이터만 변경될 수 있는 경우 직접 동기화할 수 있습니다.
비동기 FIFO에서 쓰기 주소와 읽기 주소 포인터는 서로 다른 클럭 도메인에 저장되며 FIFO 상태를 나타내기 위해 쓰기 클럭 도메인에서 FIFO_full 신호를 생성하고 읽기 클럭 도메인에서 FIFO_rmpty 신호를 생성해야 합니다. FIFO 상태 판단 , 읽기 및 쓰기 포인터의 값을 비교해야 하며 두 개의 서로 다른 클럭 도메인의 값을 직접 비교할 수 없습니다. 따라서 먼저 이진 코드 포인터를 그레이 코드로 변환하고 그레이 코드를 한 클럭 도메인에서 다른 클럭 도메인으로 이동시킨 다음 변환 공식을 사용하여 그레이 코드를 다시 이진 코드로 변환하고 대상 클럭 도메인 포인터 비교. 전체 동기화 프로세스는 아래 그림에 나와 있습니다.
몇 가지 실제 사례를 통해 이 프로세스를 심층적으로 분석한 다음 이 변환 방법을 사용할 때 존재하는 문제를 살펴봅니다. 다음 예제에서는 CLKA 클록 도메인에서 값이 10진수 값인 5에서 6으로 변경됩니다. 다중 비트 데이터의 전송 프로세스를 분석해 보겠습니다.
십진수 값 | 이진 값 | 그레이 코드 값 | 동기화된 바이너리 값 | 동기화된 10진수 값 |
5 | 101 | 111 | 111 | 5 |
6 | 110 | 101 | 111 또는 101 | 5 또는 6 |
CLKA에서 10진수가 5에서 6으로 바뀌면 동기화기를 통과한 후 대상 클럭 도메인에서 101이 되거나 일시적으로 원래의 111이 됩니다(1~2 클럭 주기가 지나면 여전히 101이 됨). 101이건 111이건 최종 결과는 순차적으로 나타나는 합법적인 값임을 알 수 있다.
위의 바이너리 그레이 코드 변환 회로를 사용하지 않고 CLKB 클럭 도메인에서 싱크로나이저를 직접 사용하면 어떻게 될까요? 아래 표는 가능한 결과를 제공합니다.
십진수 값 | 이진 값 | 동기화된 바이너리 값 | 동기화된 10진수 값 |
5 | 101 | 101 | 5 |
6 | 110 | 101 또는 110 또는 100 또는 111 | 5 또는 6 또는 4 또는 7 |
동기화 후의 값은 이전 값인 101, 새 값일 수도 있지만 100 또는 111이 될 수도 있음을 알 수 있습니다. 여러 비트의 데이터가 개별적으로 동기화되기 때문에 여러 비트의 신호가 동일한 클록 에지에서 샘플링된다는 보장이 없으며 이러한 독립적으로 동기화된 신호의 유효 값이 다른 클록 에지에 나타날 수 있습니다.
결국 올바른 값을 얻을 수 있지만 최종 출력은 가 됩니다. 그러나 규칙을 위반하는 값이 이 시간 동안 나타날 수 있습니다. 이 예에서는 두 개의 잘못된 값이 있으며, 동시에 더 많은 비트 데이터 전환이 있으면 많은 수의 잘못된 값이 생성될 수 있으며 출력은 이러한 값을 1~2주기 동안 유지합니다.
FIFO의 경우 포인터를 비교하여 빈/가득 신호를 얻습니다. 이러한 잘못된 값이 나타나면 FIFO에 잘못된 빈/가득 신호가 있을 수 있으며, 이로 인해 시스템 작업 오류 또는 충돌이 발생할 수 있습니다.
2. 바이너리 코드에서 그레이 코드로 Verilog 구현
module binary_to_gray #(parameter PTR = 8)
(input [PTR:0]binary_value,
output [PTR:0]gray_value);
genvar i;
generate
for(i = 0;i < PTR;i = i+1) begin
assign gray_value[i] = binary_value[i] ^ binary_value[i+1];
end
endgenerate
assign gray_value[PTR] = binary_value[PTR];
endmodule
3. 그레이 코드에서 이진 코드로 Verilog 구현
module gray_to_binary #(parameter PTR = 8)
(output [PTR:0]binary_value,
input [PTR:0]gray_value);
genvar i;
generate
for(i = 0;i < PTR;i = i+1) begin
assign binary_value[i] = binary_value[i+1] ^ gray_value[i];
end
endgenerate
assign binary_value[PTR] = gray_value[PTR];
endmodule
위 내용은 "Verilog 고급 디지털 시스템 설계 기술 및 예제 분석"에서 가져온 것입니다.