오늘은 맑음

verilog 문법(3) part select 본문

Digital logic

verilog 문법(3) part select

자전거 타는 구구 2021. 4. 24. 15:27
반응형

verilog hdl을 설계하다 보면 전체 비트에서 일부를 떼어서 사용하는 경우가 발생합니다.

예를 들면, 16-bit color range를 예로 들겠습니다.

 

 

16-bit color range

 

16-bit에서 RGB color range는 위와 같습니다.

만약 input [15:0] pixel로 위의 값이 들어올 때 R, G, B를 따로 찢어야 할 때 다음과 같이 표현할 수 있습니다.

 

reg [4:0] red = pixel[15:11];

reg [5:0] green = pixel[10:5];

reg [4:0] blue = pixel[4:0];

 

이런 식으로 전체 데이터중 일부를 잘라서 할당하는 행위를 part select라고 합니다.

음.. 그런데 이렇게 상수로 넣게 되면 사용되는 bitwidth가 변경되었을 때 하나하나 수작업 해줘야겠죠??
이럴 때 parameter를 이용해서 part select를 이용하면 참 편하겠죠??
parameter만 변경해주면 bitwidth도 모두 변경되고 알아서 part select도 수행할껍니다.

방법은 아래와 같습니다.
먼저 include된 parameter가 있다고 가정하기 위해 module에서 parameter를 선언해주었습니다.

 

module test#(
    parameter BITWIDTH             = 16,
    parameter REDWIDTH          = 5,
    parameter GREENWIDTH    = 6,
    parameter BLUEWIDTH        = 5
)(
    input [BITWIDTH-1:0]  pixel,
    output [REDWIDTH-1:0] red,
    output [GREENWIDTH-1:0] green,
    output [BLUEWIDTH-1:0] blue
    );
    
    assign red = pixel[GREENWIDTH+BLUEWIDTH+:REDWIDTH];
    assign green = pixel[BLUEWIDTH+:GREENWIDTH];
    assign blue = pixel [BLUEWIDTH-1:0];
    
endmodule

 

위와 같이 red, green, blue를 할당하게 해주면 parameter만 변하면 알맞게 part select를 수행합니다.
방식은 다음과 같습니다.

assign a = b[STARTBIT+ : PARTSELECTLENGTH];

앞의 파라미터는 part select를 수행할 시작 bit를 의미하고, 뒤의 파라미터는 시작 bit부터 몇 bit를 select할지 length를 의미합니다.

시뮬레이션으로 보게 되면 아래와 같이 수행됩니다.

 

 

 

반응형
Comments