2026년 8월 1일 토요일

[MyChip-on-MyDesk 예제/유튜브] "탁구 게임기"

[MyChip-on-MyDesk 예제] "탁구 게임기"

노란 딱지가 붙은 SOIC-28 패키지가 "내 칩" MPW로 제작된 탁구 게임기 칩
오른쪽 RP2040-Zero 보드는 OLED128x64 그래픽 컨트롤러 기능 수행

by GoodKook, goodkook(at)gmail.com
--------------------------------------------------------------------------------------------------
"탁구 게임기" 예제 소스(실습 자료)[링크]
"탁구 게임기" 교재 [pdf][유튜브 플레이리스트]
커뮤니티/네이버 카페 "마이칩 인앤아웃(mychipinout)"[링크]
"내 칩 제작 서비스"/"반도체 설계 교실" 오픈-소스 디자인 킷 사용자 그룹[링크]의 유튜브 채널[링크]
--------------------------------------------------------------------------------------------------
"[베릴로그 RTL 예제] 탁구 게임기"는 "내 칩 설계교실"의 한학기 분량의 교재 입니다. 오픈-소스 툴 사용법은 줄이고 디지털 반도체 "설계"에 집중합니다. 선수과목으로 "디지털 논리회로", 베릴로그 HDL 그리고 C++ 과목을 이수를 전재로 쉽게 작성하려고 했습니다. 디지털 회로에서 배웠던 카운터 회로부터 시작하여 시스템 수준 테스트벤치, 코-시뮬레이션, FPGA 활용 코-에뮬레이션 검증 그리고 "내 칩 제작 서비스"의 공정으로 합성에서 레이아웃 생성까지 다룹니다. 총 8편으로 구성되었습니다.

0. 시작하기 전에...

"내 칩 제작 서비스[바로가기]"의 MPW 경험이 반도체 분야 취업에 도움이 될까?[바로가기]

    0-1. 오픈-소스 설계 툴이 사전 설치된 WSL 가상 디스크 이미지 배포 및 사용법

    0-2. 미리 읽어둘 것들,
        자인 킷의 디렉토리 “doc/ETRI_ 연구노트 ” 중 아래 문서
            연구노트 3: 하드웨어 기술 언어의 코딩 스타일[pdf]
            연구노트 4: C++ 템플릿 크래스와 SystemC 의 최소한 이해[pdf]
            연구노트 11: MyChip FIR PE(1 부 ):RTL[pdf]
            연구노트 12: MyChip FIR PE(2 부 ):GDS[pdf]
        [추가 읽을 꺼리]
            연구노트  9: C-to-GDS, FIR 필터(1부:시뮬레이션)[pdf]
            연구노트 10: C-to-GDS, FIR 필터(2부:합성과 표준 셀 배치배선)[pdf]
        [추가 도구 설치]
            연구노트 XX: Ubuntu 24.04, Fresh Install for MyChip-on-MyDesk[link]
            연구노트 12: Arduino, Quartus, Vitis-HLS [pdf]
            연구노트 13: 다시 WSL![pdf]

    0-3. ETRI 0.5um CMOS DK 예제: 비디오 게임기 "Pong"
        "알기만 하는 사람은 좋아하는 사람만 못하고, 좋아하는 사람은 즐기는 사람보다 못하다"

    0-4. "내 칩"하기전에 "남의 칩" 체험
        [소스코드 해설] ATmega328P활용 "미니 오실로스코프"
        

    0-5. "남의 칩"으로 탁구 게임기
        
        Pong_1/2/3 @ 32x16 LED Matrix
        

1. RTL 베릴로그로 "탁구대" 그리기
    1-1. 래스터 스캔 방식 비디오 시현
    1-2. 베릴로그 HDL로 탁구대 그리기
    1-3. C++ 로 작성하는 하드웨어 시뮬레이션 테스트벤치
    1-4. 시뮬레이터 빌드
    1-5. Makefile
    1-6. 실습

2. 그래픽 LCD 구동 칩의 시뮬레이션 모델
    2-1. 도트 매트릭스 그래픽 LCD 구동 칩
    2-2. 인터페이스 프로토콜
    2-3. 그래픽 데이터 메모리
    2-4. SystemC 모델
        a. 리셋 동작
        b. 명령 또는 데이터 구분
        c. 명령 해석
        d. 그림 데이터 접근(읽기 또는 쓰기)
    2-5. 실습
        a. 따라하기
        b. 과제

3. "탁구대"의 그래픽 테스트 벤치
    3-1. 핸드 쉐이크
    3-2. RTL 베릴로그 "탁구대"
    3-3. 그래픽 LCD 인터페이스 모델
    3-4. 실습 및 과제

4. 움직이는 탁구공
    4-1. 탁구공 이미지 비트-맵
    4-2. 임의 위치에 탁구공 그리기
    4-3. 움직이는 탁구공
    4-4. 실습 및 과제

5. GLCD의 버스 기능 모델
    5-1. 버스 기능 모델
    5-2. BFM 수준으로 작성된 GLCD 모델
    5-3. 실습 및 과제

6. 탁구대, 움직이는 공 그리고 탁구채
    6-1. "탁구대"와 "움직이는 공" 시현
    6-2. "탁구채"
    6-3. 대화형 하드웨어 시뮬레이터
    6-4. 실습 및 과제

7. 코-에뮬레이션(Co-Emulation) 검증
    7-1. 테스트벤치 재사용 코-에뮬레이션
    7-2. "내 칩" 에뮬레이션 검증 키트
    7-3. 에뮬레이터 작동 모드
        a. 싸이클 상세(CA, Cycle Accurate) 모드
        b. 전송수준(TL, Transaction Level) 모드
        c. 시스템 응용(SA, System Application) 모드
    7-4. 실습 및 과제
        a. 싸이클 상세(CA) 모드
        b. 전송수준(TL) 모드
        c. 시스템 응용(SA) 모드
        d. 과제

8. "내 칩"
    8-1. 반도체 제조도면
    8-2. 합성
    8-3. 합성 후 시뮬레이션
    8-4. 표준 셀 배치와 배선
    8-5. 사인-오프: '레이아웃' 도면 검사
        a. 적층 비아 검사(Stacked Via Check)
        b. 디자인 룰 검사(Design Rule Check)
        c. 레이아웃 대 회로도(Layout versus Schematic) 검사
    8-6. 칩-탑
    8-7. 실습 및 과제

2026년 7월 27일 월요일

"남의 칩"으로 탁구 게임기

"남의 칩"으로 탁구 게임기

목차:
    0. 개요
    1. 탁구대 벽 그리기
    2. 움직이는 공
    3. 탁구대와 움직이는 공
    4. 탁구채
    5. 과제


MyChip-on-MyDesk, "내 칩 제작 서비스" 오픈-소스 디자인 킷 사용자 그룹
--------------------------------------------------------------------------------------------
0. 개요

"남의 칩"으로 탁구 게임기를 제작해본다. 여기서 "남의 칩"은 AVR계열 마이크로 컨트롤러 ATmega328p다. "미니 오실로스코프[링크]"를 만들어 봤던 바로 그 칩이다. 마이크로 컨트롤러는 써넣는 코드(응용 프로그램)에 따라 기능이 바꿀 수 있는 "범용" 칩이다.

마이크로 컨트롤러가 범용이라지만 이 칩 하나로는 아무것도 못한다. 최소한 전원은 넣어 줘야 할 것 이다. USB 를 통하거나 전용 DC-DC 전압 변환기 칩을 통해 배터리로 5V 전원을 안정적으로 공급해 줘야한다. 전원 칩이 없으면 시스템 반도체도 무용지물이다. 전자 정보화 시대가 도래하던 무렵 "도란스 내려!"라고 외치던 패기는 이제 전원 칩 없으면 시스템 반도체(인공지능 반도체) "무쓸모"라는 구호로 옮겨왔다. "전원 칩"이 비메모리 반도체 이기는 하다. (MLCC는?) 이쨌든 범용 마이크로 컨트롤러에 전원과 크리스털 발진 소자(이상한 컨덴서) 그리고 커넥터를 붙여 놓은 "아두이노 프로 미니"보드[그림]를 활용키로 한다. 여기에 비디오 게임기를 만들려고 하는 만큼 시현장치도 있어야 한다[회로도]. 사용할 비디오 시현장치는 가로 128, 세로 64의 그래픽 OLED 모듈이다. 비디오 컨트롤러로는 SSD1306[가술문서]이다. 마이크로 컨트롤러와는 I2C 버스로 연결 되었다.

1. 탁구대 벽 그리기

1인 탁구 게임기의 상대가 되는 벽(wall)을 그려보자. 소스코드는 01_TableDraw.ino [링크]다.

그래픽 장치를 구동하기 위해 이미 만들어 놓은 다양한 라이브러리들을 활용하기로 한다. 각 라이브러리에 속한 함수(API, Application Programing Interface)들을 사용하려면 이들을 정의한 헤더 파일(header file)을 들여온다.

각 라이브러리들의 헤더 파일은 다음과 같다.
    - Wire.h: I2C 장치와 통신에 필요한 라이브러리다.
    - Adafruits_GFX.h: Adafruit 사에서 개발하여 공개하는 범용 그래픽 라이브러리다. 점찍기, 줄긋기, 사각형 그리기, 원 그리기, 비트맵 문자 표시 등 다양한 함수들을 제공한다. API 문서는 아래링크에서 받을 수 있다.


    - DIYables_OLED_SSD1309.h: 특정 OLED 칩의 드라이버 라이브러리다. 수많은 개발자들에 의해 드라이버가 개발되어 공개됐다. 이 드라이버는 SSD1309(2.4"), SSD1315(0.96"), SSD1306(0.96") 등과 호환된다.
- EEPROM.h: 내장된 EEPROM(1K 바이)을 고정 데이터(주변장치 초기 설정 등) 저장공간으로 사용하기 위한 라이브러리다. 프로그램 코드는 플래시 메모리(32K 바이트, 16K x 16Bit)에 저장된다.

다음은 사용할 그래픽 장치의 특성(가로세로 화소크기)과 버스의 주소등을 정의한 후 장치 구동 객체(크래스)를 사례화한다. 앞으로 그래픽 장치로 접근은 모두 이 객체  'oled' 를 통한다.

아듀이노의 개발환경에서 사용하는 코딩 언어는 C++ 다. C/C++ 언어의 시작은 main() 인데 이를 포함하여 각 마이크로 컨트롤러를 장착한 보드(모듈)에 맞게 기본 설정을 미리 해놓고 이를 스타트-업 라이브러리로 제공한다. 굳이 C/C++ 의 기준을 따르면 다음과 같다.

    int main(int argc, char** argv)
    {
        // 보드 특성에 따른 초기화

        setup();    // 사용자 초기화
        while(true)
            loop();    // 사용자 어플리케이션

        return 0;
    }

무한 반복이 사용된 이유는 아듀이노 개발환경이 별도 운영체제(저장소 및 메모리 관리)가 없는 소규모 컴퓨팅 환경을 목표로 하기 때문이다. main() 이 종료되면 갈곳이 없다!

사용자 초기화는 다음과 같다. 먼저 사용할 그래픽 장치를 초기화 한 후 시작 화면을 꾸미고 탁구대 벽을 그렸다.

고정된 탁구대를 그리고 나면 사용자 어플리케이션이 할일은 없다. 그저 LED만 깜빡인다. 그리고 그려놓은 탁구대를 그래픽 장치로 전송한다.

그래픽 장치는 매우 느리다. 컴퓨터의 시현장치(스크린 모니터)의 갱신율(refresh rate)이 보통 60Hz다. 이는 초당 겨우 60번 화면을 갱신 한다는 뜻이다. 수 기가 헤르츠의 속도로 동작하는 CPU의 논리회로에 비하면 터무니 없다. 전체 시스템의 성능이 가장 느린 장치에 종속되지 않도록 고속의 CPU와 느린 입출력 장치를 직접 붙이지 않고 버스를 통하면 어느정도 입출력 병목(IO device bottleneck)을 해소할 수 있다. 하지만 고속 디지털 회로들 사이의 연결(CPU과 메모리)과 저속 입출력 장치의 연결을 별도의 버스로 분리하는 것 만으로는 충분치 않다.

OLED 시현장치는 마이크로 컨트롤러의 직렬 버스(I2C) 제어기를 통하여 연결되었다. OLED 패널에 점을 찍으려면 CPU는 그래픽 램(GDDRAM)에 값을 써넣는다. 그래픽 컨트롤러(SSD1309의 Display Controller)가 GDDRAM의 값을 그대로 OLED 패널에 뿌린다. 문제는 그래픽 패널의 반응 속도가 매우 느리다는 점이다.

가로 폭 5, 높이 64인 탁구대 벽을 시현하려면 총  320개의 점을 찍어야 한다. OLED 그래픽 컨트롤러의 사양에 따르면 최대 화면 갱신율이 50Hz라고 하는데 소요되는 시간은 20ms 다. 결국 벽을 하나 그리는데 6.4초(~320x20ms)가 걸린다.

점하나 찍을 때마다 그래픽 컨트롤러의 화면을 갱신 시키는 방법은 매우 불합리하다. 그래픽 구동 소프트웨어들은 별도로 그림판 메모리(캔바스, Canvas)를 확보해둔다. CPU는 데이터 램에 확보한 캔바스에 한 화면 분량을 그림을 빠르게 그려 놓고 이를 시현장치의 GDDRAM에 일괄적으로 전송한다. 디스플레이 컨트롤러는 GDDRAM의 내용대로 OLED 패널을 갱신한다. 탁구대 벽을 그리는 API인 fillRect()는 데이터 램에 확보해둔 메모리(캔바스)에 그림 데이터를 채울 뿐이다. 이어 display() 를 호출 하여 시현 장치에 전송하면 OLED 컨트롤러는 화면 갱신을 수행한다.

빠른 데이터 메모리에 그리고 이를 일괄 전송하는 방식은 모든 컴퓨터 그래픽에 적용되는 기법이다. 예를 들어 파이썬의 matplotlib를 보자. 다음은 MNIST 데이터를 시현하는 파이썬 코드 plot_data.py의 일부다. 마지막 줄에 show()를 호출해야 비로서 그림이 화면에 나타난다.


    import matplotlib.pyplot

    all_values = data_list[1].split(',')

    image_array = numpy.asfarray(all_values[1:]).reshape((28,28))

    # Plot that array!
    matplotlib.pyplot.imshow(image_array)

    matplotlib.pyplot.show()

응용 프로그램의 첫 화면에 문자열을 출력하는 함수는 다음과 같다.

메모리 버퍼(캔바스라고 부르는)에 문자 이미지를 그려놓고 이를 시현하기 위해 display()를 호출하고 있다.

2. 움직이는 공

움직이는 탁구공을 비트맵으로 그리고 움직여보자. 소스 파일은 02_Ball.ino [링크]다. 

앞서 벽을 그리기 위해 일일이 점을 찍지 않고 안을 채운 사각형 그리기 API를 활용 했었다. 이번에는 작은 공을 비트맵 이미지로 미리 제작하고 이를 화면에 뿌린다. 이 방법은 화면에 문자 표시하는 방법과 같다. 컴퓨터 게임 그래픽에서 움직이는 캐릭터 이미지를 시현할 때 흔히 사용하는 비트 블릿(BitBlit)기법이다.

공의 비트맵 이미지는 다음과 같다. 공의 이미지는 변경되지 않을 것이므로 프로그램 롬 영역에 넣어둔다. 마이크로 컨트롤러의 제한적인 램 영역을 아낄 수 있다. 

비트맵 이미지를 화면의 임의 위치에 그려넣는 API를 활용하여 공을 그린다. 이미지의 움직임을 고려하여 그리거나 지울 수 있도록 하였다.

이제 공을 움직여 보자. 이전에 그렸던 공을 지우고 새 좌표를 계산하여 그린다. 공이 화면 밖으로 나가지 않도록 움직이는 범위를 제한 하였다. 탁구대(화면 영역)에 부딪치면 공은 방향을 바꾼다.

과제: ++yPos와 yPos++의 차이에 대하여 프로그래밍 언어의 순차실행 구문의 관점에서 설명해 보라.  하드웨어 기술 언어(베릴로그)의 병렬 구문 실행과 비교해보자. 아울러 베릴로그 하드웨어 언어에서 단항 연산자 ++, -- 등을 둘 경우 그 위험성(?)을 설명해 보자.

3. 탁구대와 움직이는 공

앞서 움직이는 공은 탁구대의 벽을 감안하지 않았다. 벽을 다시 그리지 않아서 공이 지날 때 벽을 손상 시키는 모습을 볼 수 있다.

공은 벽과 부딪치면 방향을 바꾸므로  움직이는 범위를 재조정 해야 한다. 공이 벽 위를 지날일이 없으므로 매번 벽을 다시 그릴 필요는 없다. 소스 파일은 03_Table_Ball.ino [링크]다. 

고정된 탁구대 벽의 크기를 매크로(define macro)로 정의해 놓아 소스 코드의 가독성(readability)과 재사용성(re-usablity)을 높인다.

4. 탁구채

탁구채(paddle)까지 넣어 게임기를 완성해보자. 소스 파일은 04_Table_Ball_Paddle.ino [링크]다.  탁구채는 가로축은 고정된채 버튼의 눌림에 따라 상하로 움직인다. 탁구채가 화면의 밖으로 벗어나지 않도록 세심하계 계산 되었다.

이어 공의 움직임을 묘사한다. 공이 벽에 부딪치거나 탁구채에 맞았을 때 방향을 바꾼다.

게임의 흥미를 돗우기 위해 점수를 메겨본다. 탁구채가 공을 맞추지 못하면 게임이 끝나고 점수를 보여준다.


움직이는 탁구채 그리기는 아래와 같다. 상하로 움직이므로 지우고 다시 그릴 수 있도록 하였다.


5. 과제

탁구 게임기를 "남의 칩" 마이크로 컨트롤러의  소프트웨어로 구현하였다. 아래의 내용을 토론해보자.

- 게임기의 행동을 프로그래밍 언어 C++로 기술하였다. 순차적으로 실행되는 구문만을 가지는 소프트웨어 언어와 병렬 실행이 추가된 하드웨어 언어의 차이를 토론해보자.

- 시현장치(CRT, 디스플레이 패널)를 다루는 설명에 흔히 언급되는 비월 주사(raster scan[링크])에 대하여 알아보라. 화소점을 순차적으로 제어하기 위해 VSYNC, HSYNC 신호의 역활에 대하여 토론해보자.

- 위의 탁구 게임기에서 버그(소프트웨어 오류)를 찾아 수정하라.

- "내 칩"으로 탁구게임기를 설계할 참이다. 소프트웨어로도 충분히 구현 가능함에도 불구하고 굳이 전용 칩(하드웨어)이 필요한 이유에 대하여 토론해 보라.




라즈베리 파이(RP2040) 칩이 나오기까지...

라즈베리 파이(RP2040) 칩이 나오기까지...

  
라즈베리 파이(RP2040) 칩 개발에 참여했던 소프트웨어 기술자가 들려주는 이야기 입니다.

The journey to Raspberry Silicon

라즈베리 파이의 개발은 2017년 여름에 시작되었습니다. 소프트웨어 개발자로 참여 했는데 합류할 당시 반도체 설계는 아무것도 몰랐습니다. 처음에 구조(architecture)를 잡고 어떤 기능들을 넣을지 정하고 베릴로그 하드웨어 언어로 모두 꿰맞추기 시작 했습니다. 소프트웨어 언어 C 와 하드웨어 언어 Verilog는 사뭇 다르군요. 카운터를 C 로 작성하면 이랬는데,


베릴로그는 클럭에 맞춰 작동합니다. 더구나 구문 실행의 병렬성이라니....


 시뮬레이터로 코드가 실행되는 모습을 디지털 파형으로 본다는 것이 재미(?)있습니다. 코어(ARM-M0 가 사용됨)가 "Hello World"를 출력하는 프로그램을 실행 하는 모습입니다.


시뮬레이터로 소프트웨어를 실행해보기에는 너무나 시간이 오래 걸렸습니다. 칩에서 1초도  안걸릴 내용을 시뮬레이터는 몇시간 씩 걸렸으니까요. 그래서 FPGA 를 동원 했습니다. 칩의 목표 속도가 133Mhz 였지만 48Mhz로 돌리는 것에 만족해야 했습니다. FPGA는 아날로그 회로를 구현할 수 없어서 동일한 기능을 하는 별도 부품(일테면 USB-PHY 같은)을 붙여서 에뮬레이션 보드를 만들었습니다. 에뮬레이션 보드는 속도가 빨랐지만 시뮬레이터 처럼 소스 코드가 내놓는 파형을 일일이 들여다 볼수 없어서 하드웨어 기술자들이 고생을 좀 했습니다.


이랬던 하드웨어 기술자의 책상이 급기야 이렇게 됐습니다.


USB 기능을 시험할 때는 아주 혼란의 도가니 입니다. 칩에 내장될 부트 롬 코드는 저 FPGA에서 개발 되었습니다.


소프트 엔지니어가 내장 롬 코드를 개발하는 것과 동시에 하드웨어 엔지니어는 베릴로그로 작성한 코드들을 합성하여 논리회로로 변환 했습니다. 받아든 테스트 칩은 이런 모습입니다.


반도체 공정은 완벽하지 않습니다. 웨이퍼에서 잘라낸 모든 칩이 모두 양품은 아닙니다. 하드웨어 기술자들은 양품을 골라낼 수 있도록 칩에 테스트 할 수 있도록 DFT(Design-for-Test) 기능을 넣어 두었습니다. 합성된 논리 회로도를 표준 셀에 매핑하여 반도체 제조가 가능한 GDS 파일을 샌산 했습니다. 공정은 TSMC에서 이뤄 졌습니다.

양산 패키지 칩은 이제 시험 보드에 장착해 봅니다. 처음 전원을 넣을 때 칩에서 연기가 올라오지 않을까 조마조마합니다. 다행히 무사합니다. RP2040 칩이 보드 중앙에 소켓에 담겨 있군요.

내장 부트 롬도 이상 없이 작동하니 쁘듯 합니다.


실험실에서 좀더 가혹한 환경을 조성하여 테스트 합니다. 견디는 온도, 동작 전압 등등...


마침내 고객의 손에 넘기게 되었습니다.


문서가 부실한 칩은 아무짝에도 쓸모가 없습니다. RP2040이 양산에 들어가는 동안 수개월에 걸쳐 SDK(Software Development Kit, 소프트웨어 개발 킷)을 작성해야 했습니다. 완벽한 문서를 마련한 까닭에 오늘날의 라즈베리 파이가 있을 수 있었습니다.







2026년 7월 22일 수요일

Ubuntu 24.04: Fresh Install for MyChip-on-MyDesk

Ubuntu 24.04: Fresh Install for MyChip-on-MyDesk
on PC(old i5 CPU is ok. But UEFI for USB booting) with RAM(>8GB) & SSD(>128GB)

Prepare Ubuntu 24.04 Install Boot Disk
    - USB Disk(>8GB)
    - Download Ubuntu 24.04 ISO image [download]
    - Create bootable USB Disk using Rufus

* NOTE: As of Aug., 2026, Ubuntu 26.04 is released but NOT recommended for Open-Source EDA.

After Ubuntu Installed,

1. Make Ubuntu latest,

    $ sudo apt update && sudo apt upgrade

    * Install nVidia driver,

    $ sudo add-apt-repository ppa:graphics-drivers/ppa
    $ sudo apt update
    $ ubuntu-drivers devices
    $ sudo ubuntu-drivers autoinstall

2. System Setup for Korean

        App: Settings > System > Language support > add Korean
        App: Settings > Keyboard > Input Sources > add Korean(Hangul)

    Korean fonts,

    $ sudo apt update && sudo apt upgrade
    $ sudo apt install -y fonts-nanum fonts-nanum-coding fonts-nanum-extra
    $ fc-cache -fv
    $ fc-list | grep -i nanum

    See current Locale,

    $ locale
    LANG=en_US.UTF8
    LANGUAGE=
    LC_CTYPE="en_US.UTF8"
    LC_NUMERIC="en_US.UTF8"
    LC_TIME="en_US.UTF8"
    LC_COLLATE="en_US.UTF8"
    LC_MONETARY="en_US.UTF8"
    LC_MESSAGES="en_US.UTF8"
    LC_PAPER="en_US.UTF8"
    LC_NAME="en_US.UTF8"
    LC_ADDRESS="en_US.UTF8"
    LC_TELEPHONE="en_US.UTF8"
    LC_MEASUREMENT="en_US.UTF8"
    LC_IDENTIFICATION="en_US.UTF8"
    LC_ALL=

    Install Korean Language Pack(optional),
    $ sudo apt update
    $ sudo apt install language-pack-ko

    Update Locale,
    sudo update-locale LANG=ko_KR.UTF-8 LC_ALL=ko_KR.UTF-8

    Reboot System to take effect updated locale config.,

3. Download & install Browser & Editor

        - Google's Chrome for Linux [Link]

    $ cd ~/Downloads
    $ sudo apt install ./google-chrome-stable_current_amd64.deb

        - Microsoft Code for Linux [Link]

    $ cd ~/Downloads
    $ sudo apt install ./code_1.129.1-1784303641_amd64.deb

    * Recomended Extensions:
        - C/C++ by MicroSoft
        - C/C++ Dev Tools by MicroSoft
        - C/C++ Extension Pack by MicroSoft
        - C/C++ Themes by MicroSoft
        - CMake Tools by MicroSoft
        - Makefile Tools by MicroSoft
        - Binary Viewer by Qiao Jie
        - Verilog-HDL/SystemVerilog by Masahiro Hiramori

4.  Add command alias at the end of ~/.bashrc

    alias ls='ls --color=auto --group-directories-first'
    alias la='ls -al --color=auto --group-directories-first'
    alias ll='ls -l --color=auto --group-directories-first'

5. Apply Ubuntu Pro, https://ubuntu.com/pro,

    $ sudo pro attach <Your Token>
    $ sudo apt update && sudo apt upgrade

6. Install git,

    $ sudo install git

7. Clone ETRI050 Design Kit

    $ git clone https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK.git
    $ ln -s ETRI-0.5um-CMOS-MPW-Std-Cell-DK ~/ETRI050_DesignKit

8. Install libs & pkgs for building Open-Source EDA tools,

    $ cd ~/ETRI050_DesignKit/Tools
    $ chmod +x *.sh
    $ ./prerequisites.sh
    $ ./build_tools.sh

9.  Add $USER to dialout group,
    accessing USB device without any system complaint

    $ sudo usermod -aG dialout $USER

10. Download & install Xilinx FPGA Tools

    - Xilinx [Web Installer 26.1]: Vivado, Vitis-HLS, Artix-7

    $ cd ~/Downloads
    $ chmod +x FPGAs_AdaptiveSoCs_Unified_SDI_2026.1_0616_1700_Lin64.bin
    $ sudo ./FPGAs_AdaptiveSoCs_Unified_SDI_2026.1_0616_1700_Lin64.bin

11. Download & install Altera FPGA Tools
    - Quartus Prime Standard [25.1 Installer]: Cyclone IV & V

    $ cd ~/Downloads
    $ chmod +x ./qinst-standard-linux-25.1std-1129.run
    $ sudo ./qinst-standard-linux-25.1std-1129.run

12. Environments,
    Copy Env file to user's home,

    $ cp /~/ETRI050_DesignKit/Tools/Altera_env ~/.Altera_env
    $ cp /~/ETRI050_DesignKit/Tools/Xilinx_env ~/.Xilinx_env
    $ cp /~/ETRI050_DesignKit/Tools/SC_env ~/.SC_env

13. Download & install Arduino,
    - Arduino IDE[Download AppImage] & CLI

    $ curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh

14. Download & install KiCAD [Download

    If the message shown,

        Gtk-Message: 12:58:38.720: Failed to load module "xapp-gtk3-module"

    Un-Set GTK3_MODULES,

    $ unset GTK3_MODULES
    $ kicad


15. Additional apt install,

    - Libreoffice

    $ sudo apt install libreoffice

    - Zoom workplace [Download]

    $ sudo apt install ~/$HOME/Downloads/zoom_amd64.deb

    - OBS-Studio

    $ sudo apt install obs-studio

    - kdenlive

    $ sudo apt install kdenlive