2024년 8월 23일 금요일

FPGA - XUP - Embedded System Design Flow on Zynq - Lab 2

Topic = Adding IP cores in PL

Lab - 2 Overview = lab-1 에서 만든 시스템을 두개의 GPIO(볌용 입출력) IP를 추가해 확장하기


목표
  • PS의 GP 마스터 포트를 구성해 PL의 IP에 연결한다(AXI4-Lite)
  • 기존 HW설계에 IP를 추가
  • 컴파일러 설정 변경법 숙지
======================================================

Step - 1 - Lab-1 실행
  1. lab-1을 실행시킴
  2. File > Project > save as를 이용해 lab-2로 저장한다(create project subdirectory를 체크해 새로운 lab을 위한 폴더를 생성한다
======================================================

Step - 2 - 2개의 GPIO Instance 추가
  1. source 패널에서 system_wrapper를 확장후 system.bd(system_i)를 더블클릭해 Diagram 출력
  2. ZYNQ 블록을 더블클릭해 RE-Customize IP 열기
  3. 좌측에 PS-PL Configuration 클릭
  4. AXI Non Secure Exablement -> GP Master AXI Interfaces 클릭후 M AXI GP0 Interface를 활성화
  5. General > Enable Clock Reset 에서 FCLK_RESET0_N 활성화
  6. 좌측의 Clock Configuration 에서 PL Fabric Clocks 를 선택해 FCLK_CLK0 옵션을 활성화 하고 Requested Frequency를 100 (100MHZ 를 의미) 으로 변경후 OK
  7. PSU Parameter 관련 Critical Messages 가 나오면 OK 클릭 (무시가능 에러)
  8. 다이어 그램에서 변경된점 확인 (하단 그림처럼 나와야 함)
    1. M_AXI_GP0_ACLK
    2. M_AXI_GP0
    3. FCLK_CLK0
    4. FCLK_RESET0_N

  9. +버튼(또는 우클릭후 Add IP 를 눌러 AXI GPIO 를 검색
  10. 생성된 AXI GPIO 블록 우클릭후 Block Properties 클릭 후 이름을 switches로 변경
  11. GPIO 블록 더블클릭후 속성창 열기
  12. Board 탭의 IP Interface 중 GPIO의  Board Interface 를 drop down 후 sws 2bits 로 변경
  13. IP Configuration 탭을 눌러 Enable Dual Channel과 Enable Interrupt 가 체크 헤지되었는지 확인(이때 채널은 다른 장치와 구성요소갖ㄴ의 유선연결임, 듀얼일때 128bit를 사용하고 싱글은 64 bit를 사용한다)
  14. 확인으로 저장하고 닫는다
  15. Designer Assistance available 을 확인하고 Run Connection Autimation 을 누른다
  16. 좌측 switches 하단의 S_AXI 를 선택
  17. Master 와 Slave인터페이스를 자동으로 연결되도록 클릭하고 확인을 누른다(2개의 추가 block 이 그려진다(Processor System Reset/AXI Interconnection 하단 그림 참조)

  18. 다른 GPIO Instance를 추가하고 이름을 buttons로 바꾼다
  19. 새로 생긴 IP 인 Buttons 를 더블클릭후 GPIO 인터페이스를 btns 4bits 로 바꾼다
  20. AXI Interconnected 를 더블클릭(ps7_0_axi_periph)후 Master Interfaces를 2로 바꾼다

  21. buttons로 추가한 요소의 X_AXI 포트를 클릭하고 AXI Interconnected 블록에 선을 잇는다(M01_AXI 에 선이 이어진다/ Found 1 interface 메시지가 꼭 나와야 한다.
  22. 이와 마찬가지로 다음 포트를 연결한다
    1. Buttons 의 s_axi_aclk -> zynq 7의 FCLK_CLK0 (Zynq처리시스템과 장치가 동기화 통신함)
    2. Buttons 의 s_axi_aresetn -> Processor 의 Reset peripheral_aresetn (Zynq처리시스템이 주변을 Reset한다)
    3. AXI Interconnect M01_ACKL -> Zynq7 Processing system의 FCLK_CLK0
    4. AXI Interconnect M01_ARESETN -> Processor System Reset Peripheral_aresetn
    5. 모든걸을 연결하고 Regenerate Layout을 누르면 다음과 같다

  23. Address Editor 탭을 누르고 Processing_system7_0/Data > Unassigned를 확장시킨다
  24. /buttons/S_AXI를 우클릭해 Assign 한다(주소범위는 0x40000000 ~ 0x7FFFFFFF 이라고 하는데 Buttons/S_AXI = 0x4121_0000 ~ 0x4121_FFFF , switches/S_AXI = 0x4120_0000 ~ 0x4120_FFFF)
    ======================================================
Step - 3 - GPIO 주변 장치 연결을 외부로 만들기
  1. 다이어그램 뷰에서 Designer Assistance가 가능한지 확인한다
  2. Switch 인스턴스에서 GPIO 포트를 마우스 우클릭해 Make External 을 선택해 외부 포트를 만든다-->선이 하나 빠짐
  3. 추가된 GPIO_0 포트를 우클릭해 Properties 를 눌러 이름을 switches 로 변경한다
  4. buttons의 GPIO 를 우클릭해 Run Connection Automation 을 누른다
  5. options 하단 select Board Part Interface 에 btns_4bits를 선택후 OK를 누른다
  6. 생성된 외부 포트의 이름을 buttons 로 변경한다
  7. Design validation 을 수행하고 verify하여 에러가 없는지 확인한다/ 이떄 완성된 다이어그램은 하단과 같다(이때 필요하면 automatic connection을 눌러준다)

  8. Flow Navigator 에서 Run Synthesis 를 실행(저장옵션이 나오면 저장한다)하고 Open Synthesized Design 을 선택하고 확인한다
  9. shortcut 바에서 Layout Dropdown 메뉴에서 I/O Planning 을 선택한다

2024년 8월 22일 목요일

FPGA - XUP - AMD University Program Workshops

 Vivado Workshops

=Workshop List


=수강 순서

FPGA - XUP - Embedded System Design Flow on Zynq - Overview

Topic = Xilinx XUP - Embedded System Design Flow on Zynq - Overview

=====

Lab outline = HW/SW 프로세서 시스템 설계를 해보는 워크샵, ZYNQ SOC 에서 설계하기 위한 구성요소를 이해하고 활용하는 방식을 이해

=====

H/W Device - ZYBO Z7-20 (PYNQ-Z2 지원)

=====
S/W Version - Vivado 2022.2



FPGA - XUP - Embedded System Design Flow on Zynq - Lab 1

Topic = Vivado를 활용한 Embedded System 개발

Lab - 1 Overview = IP 통합툴을 이용해 ARM Cortex A9 core(PS) , UART 시리얼 통신, DDR3 SDRAM 메모리를 통합하기
프로세서 설계 Diagram

목표

  • Vicado 프로젝트 생성법 숙달
  • IP 통합 도구를 활용한 HW 시스템 생성
  • Vitis IDE를 활용한 메모리 테스트 기준 생성
  • 보드에 적용하여 기능 적용

======================================================

Step - 1 - Vivado Project 생성
  1. Vivado 실행후 Create project 클릭후 Next 클릭
  2. Project name 에 lab_1 Project location 지정 / Create project subdirectory 체크 Next
  3. RTL Project 체크및 Do not specify source at this time 체크


  4. Default Part 화면에서 Board 탭 클릭 및 사용하는 보드 클릭




======================================================

Step - 2 - IP Integrator를 활용한 시스템 생성
  1. Flow Navigator에서 Create Block Design 클릭

  2. Design name 에 system 입력후 OK
  3. 화면 우측 Diagram workspace에서 마우스 우클릭후 Add IP 클릭

  4. IP Category 창이 열리면 search 창에 zynq 입력후 검색된 ZYNQ7 Processing System 을 선택
  5. 상단 초록색 영역의 Run Block Automation 클릭
  6. Run Block Automation 창이 열리면 기본적으로 processing_system7_0 이 좌측에 선택 되어 있음 OK 버튼 누름
  7. Block Automation 이 완료되면 port에 DDR(메모리)이 추가되고 FIXED_IO가 추가되며 그림은 다음과 같아야 한다

  8. 박스를 더블클릭해 Re-customize IP 창이 열리면 중앙 이미지의 I/O Peripherals 의 여러 입력 장치(uart,Enet0 등)에 V체크 되어있음 확인
======================================================

Step - 3 - UART만 사용하도록 Processing block 설정
  1. 박스를 더블클릭해 Re-customize 대화상자 열기
  2. I/O Peripherals 상자중 v표시로 된 아무요소(UART GPIO 등이 선택되어있음) 를 클릭하거나 좌측 MIO Configuration 을 클릭한다
  3. I/O Peripherals 에서 UART 1을 제외한 모든 장치를 비활성화 시킨다(ENET/USB/SD/GPIO를 확장해 GPIO MIO /Memory Interfaces를 확장해 Quad SPI Flah/ Application Processor Unit 을 확장해 Timer 0)
  4. 좌측의 PS-PL Configuration 을 선택한다
  5. AXI Non Secure Enablement ->GP Master AXI Interface 선택해 M AXI GP0 Interface 를 비활성화
  6. General -> Enable clock resets ->FCLK_RESET0_N 을 비활성화
  7. 좌측의 Clock configuration 을 선택한다
  8. PL Fabric Clocks -> FCLK_CLK0 를 비활성화 후 OK

  9. Critical Messages 가 열리면 OK 클릭( 무시 가능한 오류)
  10. 다음과 같은 이미지로 ZYNQ가 바뀌어야 함

  11. 위 그림의 초록색 화살표를 클릭(Regeneration Layout Button)
  12. 위 그림의 보라색 화살표를 클릭(Validation Design Button)
  13. Validation successful There are no errors or critical warnings in the design 이 나와야 한다
======================================================

Step - 3 - Top-Level 생성과 H/W 내보내기
  1. Source 패널에서 Design Source 를 누르고 system.bd를 우클릭해 Generate Output Products 를 클릭, Synthesis Oprions - Out of Context per IP / Run Setting - on local host 을 확인후 Generate 클릭 (Flow Navigator에서 generate block design 도 동일한 기능을 한다)

  2. Out-of-context module run was launched for generating output products 에 OK클릭
  3. System.bd를 우클릭해 Create HDL Wrapper 를 클릭(최상위레벨 VHDL 모델 생성)
  4. Let Vivado manage wrapper and auto update 선택후 OK(system.bd가 다음과 같이 변한다)

  5. 상단의 메뉴중 File ->Export ->Export hardware를 누르고 pre-synthesis 를 선택후 next(저장이 필요하다는 메시지가 나오면 ok를 누른다) HW Programmable Logic (PL)이 없기때문에 include bitstream 옵션은 선택하지 않는다
  6. XSA File name 과 경로를 적당히 두고 Next및 Finish (system_wrapper.xsa 파일이 생성된다)
======================================================

Step - 4 - Vitis IDE 에서 메모리 테스트 어플리케이션 실행
  1. Tools > launch Vitis IDE 를 선택해 경로를 lab_1_vitis 로 적고 Launch 선택
  2. Welcome 페이지에서 Create Application Project 클릭
  3. New Application Project 페이지 다음 Platform 페이지에서 create a new platform from hardware(XSA) 탭을선택해 Step - 3 에서 생성한 system_wrapper.xsa 파일을 선택한다
  4. platform name 에 lab_1_platform 을 입력후 next


  5. Application Prjoject Details 화면에서 lab1을 입력후 target processor 에 ps7_cortexa9_0이 선택되었는지 확인한다
  6. Domain 은 next 로 넘어간다
  7. Templates 에서 Memory Test 를 선택후 Finish 를 누른다

  8. 좌측의 Explorer 탭을 보면 2개의 프로젝트가 있음(lab1_platform, lab1_system)
  9. lab1_system 프로젝트는 설계의 기능검증을 위해 작동한다
  10. lab1_platform 프로젝트는 첫번째 단계 부트로더의 일부로 ps를 초기화하는 ps7_init 함수를 포함한다

  11. lab1_system -> lab1 -> src 에서 memorytest.c 파일을 열고 내용을 확인
  12. lab1_system 우클릭후 build project 클릭

  13. build 가 성공했는지 console 에서 확인(Build Finish 가 나와야 함)
======================================================

Step - 5 - HW에서 Test 
  1. 보드를 JTAG 로 설정하고 usb로 PC에 연결후 전원 On
  2. 상단 Window 메뉴 -> show view클릭
  3. terminal 을 filter text 에 입력
  4. Vitis Serial Terminal 을 선택하고 Open 

  5. 녹색 +버튼을 눌러 Port 에 연결한 보드의 comport를 넣는다(PC마다 다르다)

  6. Connected to COMxx at 115200 을 확인
  7. lab1_system을 우클릭후 launch hardware 클릭

  8. 다음과 같이 화면 변화 확인

  9. 프로그램 종료
======================================================

Conclusion
Vivado 와 IP Integrator 를 사용해 xsa 파일을 생성한다
Vitis IDE를 사용해 HW 작동을 검증하고 프로세서에서 실행하고 터미널창에서 출력을 확인한다

2023년 8월 1일 화요일

ETC - Google form survey question auto delete

Topic - 구글폼을 활용한 설문 조사에서 문항의 답이 원하는 만큼 수집 완료시 해당 문항을 삭제하여 추가적인 답변을 수집하지 않게 하는 기능
(A function to prevent additional answers from being collected by deleting the question when the desired number of questions is collected in a survey using Google Form)


solution

Step - 1 = 구글 폼을 만들고 주소창에서 해당 폼의 id를 얻는다 -이때 꼭 다음 화면과 같이 edit화면에서 진행한다



Step - 2 = edit 화면의 주소를 메모장에 복사해 해당 form의 id를 얻는다
/d/다음부터 /edit전까지가 해당 form의 id이다

Step - 3 = 우측 상단의 메뉴를 눌러 "스크립트 편집기"를 실행한다



Step - 4 = 다음 스크립트를 복사후 저장한다

function deleteQuestionIfResponsesExceeded() {
var formId = "======="; // 구글 폼 ID
var questionIndex = 0; // 1번 문항의 인덱스 (0부터 시작)
var form = FormApp.openById(formId);
var questionItem = form.getItems(FormApp.ItemType.MULTIPLE_CHOICE)[questionIndex];

// 1번 문항의 답변 수를 확인
var responseCount = form.getResponses().length;

// 지정한 답변 수에 도달하면 해당 문항을 삭제
var maxResponseCount = 2; // 원하는 답변 수
if (responseCount >= maxResponseCount) {
form.deleteItem(questionItem);
Logger.log("1번 문항이 삭제되었습니다.");
}
}

Step - 5 = 좌측의 트리거를 눌러 추가한다


Step - 6 = 다음과 같이 설정한 후 저장 한다

2023년 6월 18일 일요일

ETC - unexpected contents print from shared printer (HP printer)

topic - unexpected contents print from shared

problem - during the printing from shared printer some unexpected contecnt printing at the same time, normally have sentence @PJL SET username=USER


solution - The connection between the PC and the printer must use the IP protocol. If use the printer add function provided by Windows, you need to be careful because the WSD protocol is automatically used.





Why is this special? - normally use add printer function by window setting menu

2023년 3월 26일 일요일

ETC - AWS Amazon EventBridge cron only weekend

Topic - AWS Amazon EventBridge cron expression only weekend

problem - When specifying a date (1=Sunday, 7=Saturday) in the scheduler, an error occurred saying that it does not match the rules.

solution - must use question mark in some field

Why is this special? - normally crontab task in unix system does not need to use question mark in any field



2023년 2월 15일 수요일

Python - Barcode make using python

python을 활용한 바코드 만들기

from barcode import EAN13
from barcode.writer import ImageWriter

code_number= '112233445566'
#12 digit for barcode number

img_code= EAN13(code_number, writer=ImageWriter())
#EAN 13 type barcode

img_code.save("bar_code2_png")
# save it with any desired name -auto png file format

EAN-13 Last digit check sum method

12-digit numbers Odd numbers multiplied by 1 and tail numbers multiplied by 3 and added together..

ex)
1 1 2 2 3 3 4 4 5 5 6 6
1 3 1 3 1 3 1 3 1 3 1 3

1 + 3 + 2 + 6 + 3 + 9 + 4 + 12 + 5 + 15 + 6 + 18 = 84

check sum= mod(10 - mod( 84 , 10), 10) = 6

full barcode number =1122334455666