여러 비트의 데이터를 한 번에 병렬로 입력(Parallel-In)하고, 내부 레지스터에 저장된 값을 한 번에 병렬로 출력(Parallel-Out)하는 시프트 레지스터이다. _ 입력: 비트를 병렬 입력 단자를 통해 한 번에 입력 _ 클록 신호: 클록이 들어올 때마다 입력 데이터 전체가 레지스터에 저장 _ 출력: 저장된 데이터가 각 비트 단자에서 동시에 병렬로 출력
즉, 입력과 출력 모두 병렬이다.
사용 코드
module shift_register_PIPO(
input clk, // 클록 신호 (상승 에지에서 데이터 저장)
input [7:0] d, // 8비트 병렬 입력 데이터
input rd_en, // 출력 활성화(read enable) 신호
input wr_en, // 입력 저장(write enable) 신호
output [7:0] q // 8비트 병렬 출력 데이터
);
reg [7:0] register; // 8비트 내부 레지스터(데이터 저장용)
// wr_en이 1일 때 클록 상승 에지에서 입력 d를 레지스터에 저장
always @(posedge clk) begin
if (wr_en)
register <= d; // wr_en=1: 병렬 입력 저장
end
// rd_en이 1이면 저장된 데이터 출력, 아니면 출력 버스를 high-impedance('z')로 설정
assign q = rd_en ? register : 8'bz; // rd_en=1: 데이터 출력, 0: high-impedance
endmodule
Schematic
Simulation
결과
입력 d에 8'b11001100을 넣고 wr_en을 1로 설정한 뒤, 클록 신호를 한 번 인가하면 해당 데이터가 내부 레지스터에 저장되는 것을 확인 할 수 있다.
이후 rd_en을 1로 하면, 레지스터에 저장된 값이 q[7:0]에 병렬로 그대로 출력되는 것을 확인 할 수 있다.
이 과정을 통해 PIPO 레지스터가 입력 데이터를 올바르게 저장하고, 필요할 때 병렬로 출력함을 확인할 수 있다.