본문 바로가기

실전! Verilog HDL RTL Design

[Verilog HDL] 18. 제어 가능한 ALU IP 만들기 - 레지스터 맵

반응형

HW IP (Intellectual Property)는 SoC에서 사용 가능한 HW block을 의미한다. SoC에서 사용 가능하다는 것은 CPU에서 IP에 대한 제어를 할 수 있다는 것이다. 즉 software에서 HW IP를 제어하고 필요한 기능을 수행할 수 있어야 하는 것이다. APB interface에서 살펴 보았듯이 SoC 에서 HW IP는 bus를 통해 CPU와 연결되어 있고 그 중 간단한 bus interface중 하나가 APB이다. 

이번 장에서는 ALU에 APB register file을 추가하여 ALU 기능을 수행 하기 위한 register를 만들고 CPU에서 이 register file을 read/write 함으로써 ALU의 필요한 기능을 수행할 수 있도록 해보겠다.

일단 ALU를 제어하기 위한 신호를 정의하고 그 신호들을 register file의 각 register에 mapping시키는 작업이 필요하다. 먼저 11장에서 ALU의 입출력 신호를 다시 한 번 살펴보면 아래와 같다.

 

이름 bit width 입출력 설명
clock 1 input clock 입력
resetn 1 input active low reset 
opA 8 input operand 
opB 8 input operand
opcode 2 input opcode :
'00' : 덧셈
'01' : 뺄셈
'10' : 오른쪽 시프트
'11' : 왼쪽 시프트
shift_num 3 input shift bit number
이 숫자 만큼 bit를 옮긴다.
shift_dir 1 Input shift direction
0 : left
1 : right
y 8 output 연산 결과 값
opOut 2 output opcode를 1 클럭 지연시켜 출력하는 값.
연산 결과 y가 어떤 연산인지 확인하는 용도로 사용한다.

table 18-1 ALU 입출력 신호

 

여기서 clock과 reset은 module의 입력으로 직접 연결하면 되고 나머지 신호들을 register에 mapping시켜 사용할 것이다. 그리고 추가적으로 ALU를 동작시키기 위한 control 신호를 정의할 것이다.

 

register map은 memory map과 마찬가지로 주소와 그 주소에 대한 data filed로 정의 된다. 여기서 data field는 16bit로 정의하겠다. 필요한 레지스터를 용도별로 정의해 보자

 

1. control register

   ALU가 연산을 할 지, 말 지를 정의하는 신호를 저장하는 레지스터이다.

2. operand register

  연산에 사용되는 8bit data 2개를 저장하는 레지스터이다.

3. opcode register

  어떤 연산을 수행할 지 결정하는 opcode가 저장되는 레지스터이다.

4. shift control register

  shift 연산을 수행할 때 몇 bit shift할 지를 결정하는 값이 저장되는 레지스터이다.

5. status register

  연산 결과가 수행 된 opcode와 함께 저장되는 레지스터이다.

6 . result register

  연산 결과 값이 저장되는 레지스터이다.

 

이를 표로 정리하면 아래와 같다. 이렇게 레지스트를 주소별로 구분하고 용도를 기술한 표를 register map이라고 한다. 주소는 CPU가 하드웨어 IP를 접근할 때 사용하는 주소를 말한다. 마치 메모리에 접근하는 것과 동일하다고 보면 된다. 주소는 레지스터의 크기 단위로 증가한다. 여기서는 하나의 레지스터에 16bit를 사용할 것이기 때문에 16bit = 2byte단위로 주소가 증가하게 된다. 

아래 표에서 RW는 이 레지스터가 Read/Write 가 가능한지를 나타낸다. RW는 read/write 모두 가능. R이면 read only이다. 비트 필드는 레지스터의 각 bit가 어떤 의미를 가지는지 나타낸다.

주소 RW 이름 비트 필드 설명
0x00 RW control [0] : start bit
     '0', 정지
     '1', 시작
start bit를  1로 쓰면 ALU 동작을 시작한다.
연산 결과는 status와 result 레지스터에 저장된다.
0이면 status 레지스터와 result 레지스터는 이전 값을 유지한다.
0x01 RW operand [15:8] : opA
[7:0] : opB
operand A와 operand B를 설정한다. 이 두개의 입력으로 ALU 연산을 수행한다.
0x02 RW opcode [1:0] : opcode
'00' : 덧셈
'01' : 뺄셈
'10' : 오른쪽 시프트
'11' : 왼쪽 시프트
opcode는 ALU 연산의 종류이다.
shift연산일 경우 [0] bit는 shift direction으로 사용한다.
0x03 RW shiftcon [2:0] shiftnum shiftnum 만큼의 bit를 shift direction에 따라 left 또는 right로 shift한다.
0x04 R status [1:0] : result opcode result_opcode는 연산 결과를 계산한 연산 종류를 나타낸다.
0x05 R result [7:0] : result 연산 결과가 저장된다.

table 18-2 register map

 

이렇게 레지스터 맵을 정의하면 이 레지스터 맵을 사용하여 software를 작성할 수 있다.

다음 장에는 이 레지스터 맵을 이용히여 ALU IP에서 필요한 부분을 실제로 코딩해 보도록 하겠다.

 

 

반응형