Notice
Recent Posts
Recent Comments
Link
관리 메뉴

거북이처럼 천천히

Verilog RTL 설계(7월 15일 - 4, PISO Shift Register) 본문

RTL Design/Verilog RTL 설계

Verilog RTL 설계(7월 15일 - 4, PISO Shift Register)

유로 청년 2024. 7. 16. 18:39

1. PISO Shift  Register (Parallel Input Series Output)

  • 병렬 형태로 입력 값을 입력 받아 레지스터에 저장한 뒤, 레지스터의 저장된 데이터를 Shift시켜 직렬형태로 하나씩 출력시키는 구조를 갖는 레지스터
  • PISO Shift Register는 아래와 같은 회로 구조를 갖는다.

Structure of PISO Shift Register

 

  • Q) 입력 단자 부분에 왜 MUX가 있으며, MUX는 어떤 역활을 수행하는가?
  • A) PISO Shfit Register가 Read로 동작할 때와 Write로 동작할 때의 경우의 수로 나누어 생각해야한다.

    Write 로 동작할 경우)
    - 4bit 데이터를 한 번에 Parallel 형태로 입력받아야 한다.

    Read 로 동작할 경우)
    - 출력선 하나이기 때문에 D Flip Flop A부터 D Flip Flop D 방향으로 Shift 시키며, 레지스터에 저장된 데이터를 출력시킨다.

    위 동작 처럼 하나의 단선을 가지고, 2가지 작업 (입력값을 Write하는 작업, 출력값을 Shift하는 작업)을 수행해야 하기 때문에 MUX를 이용하여 Selector를 통해 2가지 작업 중 상황에 맞게 하나의 작업을 선택하여 수행하게끔 하는 것이다.

    Selector는 Write_enable 변수 값을 통해 컨트롤하게 된다.

 

 

 

2. N bit PISO Shift Register by using parameter  

< Source >

module PISO_Nbit_Shift_Register_by_using_shift_enable #(parameter N = 8)(
    input clk, enable, reset_p,
    input [N-1 : 0] input_data,
    input shift_load_p,
    output output_data  );
    
    reg [N-1 : 0] piso_reg;
    
    always @(posedge clk or posedge reset_p) begin 
        if(reset_p) piso_reg <= 0;
        else if(enable) begin
            if(shift_load_p) piso_reg <= {1'b0, piso_reg[N-1 : 1]};
            else piso_reg = input_data;
        end
    end
    
    assign output_data = piso_reg[0];
    
endmodule
  • shift_load_p 변수 값이 1이면 새로운 데이터 값을 입력 받지 않고, 기존에 있던 데이터들을 오른쪽으로 Shift한다.
  • shift_load_p 변수 값이 0이면 새로운 데이터 값을 입력 받아서 레지스터에 저장한다.
  • 중요) assign output_data = piso_reg[0];
    해당 명령문의 실행 조건을 보게 되면 어떤 조건없이 실행이 가능함을 확인할 수 있다.
    → 따라서 시뮬레이션이 실행하는 동안 계속해서 piso_reg[0] 데이터를 출력으로 내보내고 있는 상태이다.

 

 

< Test bench >

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/07/16 16:02:20
// Design Name: 
// Module Name: tb_PISO_Nbit_Shift_Register_by_using_shift_enable
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module tb_PISO_Nbit_Shift_Register_by_using_shift_enable( );
    // Set type of Input / Output.
    reg clk, enable, reset_p;
    reg [5:0] input_data;
    reg shift_load_p;
    wire output_data;
    
    // Data
    parameter data  = 6'b110101;
    
    // Create Instance.
    PISO_Nbit_Shift_Register_by_using_shift_enable #(.N(6)) DUT(
    clk, enable, reset_p,  input_data, shift_load_p, output_data  );
    
    // Initialization of simulation.
    initial begin
        clk = 0; enable = 1; reset_p = 1; shift_load_p = 0; input_data = 0;
    end
    
    // Set clock pulse.
    always #5 clk = ~clk;
    
    // variable 
    integer i;
    
    // processing of simulation.
    initial begin 
        #10;
        
        // Disable reset_p and write data.
        reset_p = 0;
        input_data = data; #10;
        
        // Enable shift_load_p
        shift_load_p = 1;
        #10;
        
        // Enable shift_load_p and read.
        for(i = 0; i<7; i = i+1) #10;
            
        $finish;
    end
endmodule

 

< Simulation >

  • 0 ~ 10ns : initialization of simulation 영역이 실행
  • 10ns ~ 20ns : disable reset_p 동시에 input_data 단자에 data 값을 넣는 중이다.
  • 20ns ~ 30ns : enable shift_load_p 
  • 30ns ~          : left shift하면서 데이터를 출력한다.

  • Q) 왜 shift_load_p가 활성화되기 전에 왜 먼저 output_data가 출력되는가?
    A) assign output_data = piso_reg[0];
    명령문의 실행 조건을 보아라. 특정 조건을 만족해야 실행 되는가? 아니다. 즉, piso_reg[0] 값 출력은 시뮬레이션이 실행하는 동안 계속 출력으로 나가고 있다. 따라서 shift_load_p가 활성화 되기 전에 먼저 출력되는 것은 이상하지 않다.