여러 비트의 데이터를 한 번에 병렬로 입력(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비트씩 차례로 출력되는 것을 확인 할 수 있다.