Verilog_RTL 설계/Basys_3

[Shift_Register] PISO_(Parallel-In Serial-Out)

juniha 2025. 7. 12. 22:52

목적

  • 여러 비트의 데이터를 한 번에 병렬로 입력(Parallel-In)하고, 이를 한 비트씩 직렬로 출력(Serial-Out)하는 시프트 레지스터이다.

 

  • 병렬 입력(Parallel-In):
    • 여러 개의 입력 핀을 통해 데이터를 한 번에 레지스터에 저장한다.
    • 일반적으로 ‘load’ 신호를 사용하여 병렬 데이터를 레지스터에 로드한다.
  • 직렬 출력(Serial-Out):
    • 병렬 입력 후, 클록 신호가 들어올 때마다 저장된 데이터가 한 비트씩 이동(시프트)하면서, 최하위 비트(보통 Q_out)에서 한 비트씩 출력됩니다.

 

사용 코드

module shift_register_PISO(
    input clk,             // 클록 신호
    input [7:0] d,         // 8비트 병렬 입력 데이터
    input shift_load,      // 동작 제어 신호: 1이면 시프트, 0이면 로드
    output q               // 직렬 출력 (최하위 비트)
);

    reg [7:0] piso_reg;    // 8비트 시프트 레지스터

    // 클록의 상승 에지에서 동작
    always @(posedge clk) begin  
        if (shift_load)
            piso_reg = {1'b0, piso_reg[7:1]};  // shift_load=1: 오른쪽으로 1비트 시프트 (MSB는 0으로)
        else
            piso_reg = d;                      // shift_load=0: 병렬 입력 데이터를 한 번에 로드
    end

    assign q = piso_reg[0];                    // 레지스터의 최하위 비트(q)에서 직렬 출력

endmodule

 

Schematic

Simulation

결과

 

  • 병렬 데이터 로드일 때는 shift_load가 0이 되면, 입력 데이터 d(8비트)가 한 번에 내부 레지스터(piso_reg)에 저장되는 것을 확인 할 수 있다.
  • 직렬 데이터 출력은 병렬 데이터 로드 이후 shift_load를 1로 유지하고 클록을 입력하면, 레지스터에 저장된 값이 한 비트씩 오른쪽으로 이동(시프트)하면서, 최하위 비트가 출력 q에 순서대로 나타나는 것을 확인 할 수 있다.
  • 즉, 8비트 데이터가 한 번에 입력되어, 클록이 발생할 때마다 1비트씩 차례로 출력되는 것을 확인 할 수 있다.