한 비트씩 순서대로 들어오는 직렬(Serial)신호를 내부 레지스터에 차례로 저장한 뒤, 여러 비트를 한 번에 동시에 병렬(Parallel) 출력한다.
데이터 버퍼/임시 저장: 데이터를 순차적으로 입력받고, 일정 시점에 한꺼번에 병렬로 처리하거나 출력
사용 코드
module shift_register_SIPO_n(
input clk, // 클록 신호 (데이터 이동 시점 결정)
input d, // 직렬 입력 데이터 (Serial-In)
input read_enable, // 병렬 출력 활성화 신호 (1이면 출력, 0이면 high-impedance)
output [7:0] q // 8비트 병렬 출력 (Parallel-Out)
);
reg [7:0] sipo_reg; // 8비트 시프트 레지스터 (내부 데이터 저장)
// 클록의 하강 에지마다 입력 d를 레지스터에 저장하고 시프트
always @(negedge clk) begin
sipo_reg = {d, sipo_reg[7:1]}; // 입력 d를 최상위 비트에 넣고, 나머지는 오른쪽으로 시프트
end
// read_enable이 1일 때만 q에 병렬로 출력, 아니면 high-impedance 상태('z')
assign q = read_enable ? sipo_reg : 8'bz;
endmodule
Schematic
Simulation
결과
이 회로는 입력 신호 d에 들어오는 데이터를 클록 신호의 하강 에지마다 내부 8비트 레지스터(sipo_reg)에 순서대로 저장하는 것을 확인 할 수 있다.
입력값이 들어올 때마다 기존 값들은 한 칸씩 오른쪽으로 이동(시프트)하고, 새 입력값이 맨 앞(최상위 비트)에 저장된다.
read_enable 신호가 1일 때는 레지스터에 저장된 8비트 데이터를 병렬로 출력(q로)하고, read_enable이 0일 때는 출력이 high-impedance 상태('z')가 되어 외부 신호와 충돌을 방지한다.