본문 바로가기
하만 세미콘 아카데미/Verilog HDL

Verilog HDL 실습 (Parity_bit)

by smileww 2024. 5. 31.

오늘은 패리티 비트를 이용해 오류를 검증하는 방법을 Verilog HDL로 만들어보도록 하겠습니다.

 

https://keshavsps.blogspot.com/2017/11/parity-bit.html

 

패리티 비트 (Parity Bit)

패리티 비트는 디지털 통신과 데이터 저장장치에서 널리 사용되는 오류 검출 기법입니다. 데이터 비트 중 '1'의 개수를 기반으로 추가적인 비트(패리티 비트)를 설정함으로써, 데이터가 원래의 상태로 정확하게 전송되었는지를 검증할 수 있습니다.

 

패리티 비트는 통신이나 데이터 저장 과정에서 데이터의 무결성을 검사하는 데 중요한 역할을 합니다. 데이터 전송 과정에서 발생할 수 있는 오류를 감지하고, 이를 통해 데이터가 손상되었는지 여부를 파악할 수 있습니다. 이 방법은 구현이 간단하면서도 효과적으로 비교적 단순한 오류를 감지할 수 있어, 데이터의 정확성을 보장하는 데 크게 기여합니다. 이러한 패리티 비트의 사용은 데이터의 신뢰성을 유지하고, 오류로 인한 문제를 최소화하는 데 도움을 줍니다.

 

작동 원리

  • 짝수 패리티: 데이터 비트 중 '1'의 개수가 짝수가 되도록 패리티 비트를 설정합니다. 만약 '1'의 개수가 이미 짝수라면 패리티 비트는 '0'이 되고, 홀수라면 '1'이 됩니다.
  • 홀수 패리티: 데이터 비트 중 '1'의 개수가 홀수가 되도록 패리티 비트를 설정합니다. 이 경우 '1'의 개수가 홀수일 때 패리티 비트는 '0'이 되고, 짝수일 때 '1'이 됩니다.

 

`timescale 1ns / 1ps

module my_parity #(parameter width = 32) (
    input [width-1:0] d_word,
    output [width:0] data_frame
);
    
    function parity;
        input [width-1:0] bv;
        reg par;
        integer i;
        begin
            par = 1'b0;
            for(i = 0; i < width; i = i + 1)
                par = par ^ bv[i];
            parity = par;
        end
    endfunction

    assign data_frame = {d_word, parity(d_word)};
endmodule

 

`timescale 1ns / 1ps

module my_parity_tb();

    parameter width = 8; // Define the width parameter dynamically

    reg [width-1:0] data;
    wire [width:0] dout;

    // Instantiate the my_parity module with the width parameter
    my_parity #(.width(width)) uut (
        .d_word(data),
        .data_frame(dout)
    );

    initial begin
        data = 0; // Initialize data bits to zero
        repeat (2**width) 
        begin
            #10
            $display("Time: %t data: %b parity: %b", $time, data, dout[width]); // Display data and parity bit
            data = data + 1; // Increment data to test all possible combinations
        end
    end
    
    initial begin
        #(10 * (2**width)); // Wait enough time to complete all tests
        $finish; // End the simulation
    end

endmodule

 

 

 

 

  • data[7:0]: 현재 입력 데이터를 표시합니다. 예를 들어, 14(16진수 0E)에서 시작하여 순차적으로 증가합니다.
  • dout[8:0]: 출력 데이터 프레임입니다. 이는 입력 데이터와 계산된 패리티 비트를 포함합니다. 데이터 프레임은 기본 데이터 d_word와 패리티 비트가 하나 추가된 형태입니다.
  • d_word[7:0]: 테스트 벤치에서 모듈로 보내진 실제 데이터입니다.
  • data_frame[8:0]: 계산된 패리티 비트를 포함한 전체 데이터 프레임입니다.

 

  • 입력 데이터 확인: data[7:0]를 확인하여 어떤 데이터가 테스트 되었는지 확인합니다.
  • 패리티 비트 확인: data_frame[8:0]의 마지막 비트(data_frame[0])를 보면 해당 데이터의 패리티 비트를 확인할 수 있습니다. 이 비트는 입력 데이터의 1의 개수가 홀수일 때 1이 되고, 짝수일 때 0이 됩니다.
  • 데이터 프레임 확인: data_frame[8:0]을 통해 전체 데이터와 패리티 비트를 한 눈에 볼 수 있습니다. 예를 들어, 데이터 프레임이 01d라면, 이는 입력 데이터 1c에 대한 패리티 비트 1이 추가된 것을 의미합니다.