디지털 IC 프런트 엔드 연구 노트: 그레이 코드(Verilog에서 구현한 이진 그레이 코드 변환기 포함)

관련 기사

디지털 IC 프런트 엔드 연구 노트: LSFR(Linear Feedback Shift Register)

디지털 IC 프런트 엔드 연구 노트: 교차 클록 도메인 신호 동기화

디지털 IC 프런트 엔드 연구 노트: 신호 동기화 및 에지 감지

디지털 IC 프런트 엔드 연구 노트: 래치 래치 합성

디지털 IC 프런트 엔드 연구 노트: FIFO의 Verilog 구현(1)

디지털 IC 프런트 엔드 연구 노트: FIFO의 Verilog 구현(2)

디지털 IC 프런트 엔드 연구 노트: 중재 폴링(1)

디지털 IC 프런트 엔드 연구 노트: 중재 폴링(2)

디지털 IC 프런트 엔드 연구 노트: 중재 폴링(3)

디지털 IC 프런트 엔드 연구 노트: 중재 폴링(4)

디지털 IC 프런트 엔드 연구 노트: 중재 폴링(5)

디지털 IC 프런트 엔드 연구 노트: 중재 폴링(6)

디지털 IC 프런트엔드 연구 노트: LRU(최소 최근 사용) 알고리즘


목차

1. 그레이 코드 인코딩/디코딩

2. 바이너리 코드에서 그레이 코드로 Verilog 구현

3. 그레이 코드에서 이진 코드로 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 고급 디지털 시스템 설계 기술 및 예제 분석"에서 가져온 것입니다.

추천

출처blog.csdn.net/weixin_45791458/article/details/130084594