하만(Harman) 세미콘 반도체 설계 과정/SoC를 위한 Peripheral 설계

하만(Harman) 세미콘 아카데미 71일차~ - SoC를 위한 Peripheral 설계(CPU, SoC, AMBA Bus, HandShake, AXI 프로토콜)

semicon_circuitdesigner 2024. 6. 25. 14:30

[2024.06.24~] 인천인력개발원


1-1. H/W vs. S/W

1-2. CPU(Central Processing Unit, 중앙처리장치)

1-3. SoC(System on Chip)

 

AMBA(Advanced Microcontroller Bus Architecture)
  • ARM이 개발한 SoC 내부 IP(Intellectual Property)간 통신을 위한 표준 버스 프로토콜
  • AMBA 프로토콜 종류
     - APB(Advanced Peripheral Bus): 저전력&낮은 인터페이스 복잡도를 갖는 저대역폭 주변장치 연결을 위한 버스 프로토콜
     - AHB(Adv. High performance Bus): CPU, DMA 컨트롤러, 메모리 등 고성능 IP간 통신을 위한 버스 프로토콜
     - AXI(Adv. eXtensible Interface): 고대역폭 파이프라인 작업, 버스트 전송 등 지원
     - ACE(AXI Coherency Extensions): AXI버스에 캐시 일관성 기능을 추가한 확장 프로토콜
     - CHI(Coherent Hub Interface): ARM의 최신 온칩 인터커넥트 프로토콜. AXI와 ACE의 발전된 버전. 고성능 SoC 설계에 적합
  • Master - Slave
     - Master: 버스 제어권을 가지는 부분. 데이터 전송 관리
     - Slave: 마스터의 요청에 응답하여 데이터 송수신

실습 2


1. 사이트에서 Block Memory Generator 다운로드

https://www.xilinx.com/products/intellectual-property/block_memory_generator.html#documentation

 

Block Memory Generator

The Block Memory Generator LogiCORE™ IP core automates the creation of resource and power optimized block memories for Xilinx FPGAs.

www.xilinx.com

 

2. my_axi project 생성 후 board에서 Cora Z7-07s선택

 

3. IP Catalog를 열어 RAMs & ROMs & BRAM의 Block Memory Generator 더블클릭

 

4. Basic 탭과 Port A Options 탭에서 값 설정

 

5. 위에서 다운로드한 파일의 74p 다음 내용을 복사하여 메모장에 붙여넣기 후 값 변경 및 저장

 

6. Vivado의 Other Options 탭에서 파일 선택

 

7. Generate 클릭

 

8. Design Source 확인

 


실습 3: AXI_READ


AXI 관련 내용은 아래 게시글 참고

2024.06.26 - [하만(Harman) 세미콘 반도체 설계 과정/SoC를 위한 Peripheral 설계] - AXI 프로토콜 / HandShake

 

AXI 프로토콜 / HandShake

HandShake 방식HandShake란? - 통신 과정에서, 수신부와 송신부의 특정 조건이 맞을 때 정보가 교환되는 방식AXI에서의 HandShakeMaster와 Slave에서 Valid, Ready 신호를 이용하여 Handshake 진행 - Valid 신호: 데

semicon-circuit.tistory.com

 

AXI 구조
Read Channel Block Diagram

Master 신호 이름 정의
  • Input
    • CLK
    • RST
    • Address => ADDR [4:0]
    • Start => START
    • Address Ready => AXI_AREADY
    • Read Data => AXI_DATA [7:0]
    • Data Valid => AXI_VALID
  • Output
    • Read Address => AXI_ADDR [4:0]
    • Address Valid => reg  AXI_AVALID
    • Data Ready => reg  AXI_READY
Slave 신호 이름 정의
  • Input
    • CLK
    • RST
    • Read Address => AXI_ADDR [4:0]
    • Address Valid => AXI_AVALID
    • Data Ready => AXI_READY
  • Output
    • Address Ready => reg  AXI_AREADY
    • Read Data =>  AXI_DATA
    • Data Valid => reg  AXI_VALID

axi_slave.v
0.00MB
my_axi_master.v
0.00MB


실습 4: AXI_WRITE


Write Channel Block Diagram

Master 신호 이름 정의
  • Input
    • CLK
    • RST
    • Address => ADDR [4:0]
    • Start => START
    • Data => DATA [7:0]
    • Address Ready => AWREADY
    • Data Ready => WREADY
    • Response Valid => BVALID
    • Response => BRESP
  • Output
    • Write Address => AWADDR [4:0]
    • Address Valid => reg  AWVALID
    • Write Data = > WDATA [7:0]
    • Data Valid => reg  WVALID
    • Reponse Ready =>  reg  BREADY
    • Error =>   reg  ERROR
Slave 신호 이름 정의
  • Input
    • CLK
    • RST
    • Write Address => AWADDR [4:0]
    • Address Valid => AWVALID
    • Write Data => WDATA [7:0]
    • Data Valid => WVALID
    • Response Ready => BREADY
  • Output
    • Address Ready => reg  AWAREADY
    • Data Ready => reg  WREADY
    • Response Valid => reg  BVALID
    • Response => reg  BRESP

axi_write_master.v
0.00MB
axi_write_slave.v
0.00MB


실습 5: 


Block Design

1. zync_basic으로 프로젝트 생성

 

2. Create Block Design 클릭하여 zync_system으로 디자인 생성

 

3. Diagram에서 우클릭 - Add Ip 후 zynq 검색, 선택

 

4. Run Block Automation 클릭 - OK

 

5. 그림 더블클릭 - 좌측 PS-PL Configuration에서 값 변경 (체크 해제해보기)

MAXI GP0: Master AXI General Purpose Interface 0

확인 후 원상복귀

 

6. MIO Configuration 탭에서 ENET 0, USB 0, SD0, GPIO MIO 체크 해제

 

7. Clock Configuration 탭에서 PL Fabric Clocks의 FCLK_CLK0의 값을 100으로 변경

 

8. Add IP - GPIO 검색 후 추가

 

9. gpio의 이름을 바꾸기 위해 클릭 후 좌측의 Block Properties 창에서 이름 변경

 

10. Run Connection Automation: AXI GPIO와 S_AXI 연결

 

11. 결과 확인

 

12. 상단의 Regenerate Layout을 눌러 Layout 변경 가능

 

13. AXI GPIO를 펼쳐보면 Slave 파트의 신호 확인

 

14. Add IP - GPIO 추가

 

15. 추가한 GPIO의 이름을 axi_gpio_out으로 변경

 

16. Run Connection Automation에서 설정 변경 후 OK

 

17. Regenerate Layout

 

18. Address Editor 탭에서 Address 확인

 

Validate Design으로 적합성 확인

 

19. Add IP - System ILA 추가 후 System ILA의 Interface Slots을 2로, Sample Data Depth를 2048로 변경

 

20. SLOT_0_AXI를 M00_AXI에, SLOT_1_AXI를 M01_AXI에 연결

 

21. Run Connection Automation

 

22. Validate Design


Create HDL Wrapper

 

1. 우클릭 - Create HDL Wrapper

 

2. Generate Bitstream

3. Export Hardware

 

4. include bitstream 선택

 


Vitis 실행


1. Vitis 실행 - WorkSpace 지정

2. Create Platform Component 선택 후 플랫폼 생성

 

3. XSA 파일 선택

 

4. Next - Finish

 

5. Platform Build (=Compile)

 

6. File - New Component - From Examples - Empty Application 선택

 

7. Source 추가

 

8. DIP2LED.c 파일의 declaration을 완료하기 위해 zynq_basic [platform] - sources - ps7_coretexa9_0 - include에서 파일 찾기

 

9. FLOW에서 Component를 zynq_basic 선택 후 Build

 

10. 에러 확인 후 코드 수정

 

11. 8번의 경로에서 xparameters.h를 찾은 뒤 복사 - 붙여넣기 후 내용 수정(DIP2LED.c의 24번, 29번 줄)

Vivado에서 앞서 설정한 IP의 이름에 맞게 수정한 부분

 

12. 다시 Build 수행 - Build 성공

 

13. Run

 

14. TeraTerm 설정 후 통신 확인: 버튼을 누르면 LED가 켜지며 Teraterm에 출력


15. Vivado - Program and Debug로 확인