
open-sds1000cml 저장소는 Siglent SDS1000CML+ 시리즈 오실로스코프용 대체 펌웨어다. SDS1102CML+에서 개발됐으며, 두 채널을 각각 500 MS/s로 샘플링하고 채널당 1,048,576개 샘플을 저장한다. 52개 직렬 프로토콜의 하드웨어 트리거와 연속 디코딩, 브라우저 인터페이스도 제공한다. 펌웨어는 USB 메모리에서 실행되며 기기의 플래시에 기록되지 않아, 메모리를 빼고 전원을 껐다 켜면 공장 펌웨어로 돌아간다.
이 펌웨어는 전원에 연결된 계측기의 릴레이와 DAC, 샘플링 버스를 제어한다. 프로젝트는 사용에 따른 위험을 사용자가 부담해야 하며 SDS1000CML+ 시리즈에만 적용된다고 경고한다. 보증은 없으며 라이선스와 안전 안내를 확인해야 한다.
화면과 분석 기능
펌웨어는 ARM 프로세서에서 실행되는 애플리케이션과 그 앱이 불러오는 FPGA 이미지를 대체한다. 기기 화면과 전면 패널에는 SCOPE, BUS, SPECTRUM, MEASURE, COMPARE의 다섯 작업공간이 있다. 각 작업공간의 기능 키를 다시 누르면 다음 화면으로 이동한다. 웹 인터페이스도 같은 작업공간을 제공하며, Alt+1부터 Alt+5까지로 전환한다. 설정 전체는 Ctrl+,로 열 수 있다.
프로젝트가 공개한 시연은 펌웨어를 실행하는 SDS1102CML+와 10배 프로브를 사용했다. Alchitry Au가 104 MHz SPI 플래시 읽기와 비슷한 신호를 만들었고, 트리거는 0B 00 10 00 명령에 맞췄다. 한 번의 캡처에는 채널당 1,048,576개 샘플이 담기며, 500 MSa/s에서 SINGLE 캡처는 2.1 ms를 기록한다. 시연 화면에는 한 번의 기록에 포함된 286개 플래시 읽기와 19,769바이트 패킷 목록이 표시된다. 확대 화면에서는 200 ns/div로 읽기의 클록 에지와 디코딩된 바이트를 확인한다.
기본 사양은 두 채널 동시 샘플링, 채널당 500 MS/s(합계 1 GS/s), 채널당 최대 1,048,576개 샘플이다. 시간축은 1 ns/div부터 50 s/div, 수직 범위는 2 mV/div부터 10 V/div다. DC·AC·GND 입력, 20 MHz 대역폭 제한, 프로브 ×1·×10·×100 설정을 지원한다. 일반 화면은 1 µs/div부터 1 ms/div까지 초당 16~24프레임을 표시하며, 5 ms/div에서는 초당 약 12프레임이다.
정밀 모드는 CIC 필터를 통해 ×16부터 ×1,048,576까지 디시메이션하고, ARM에서 63탭 보정 필터를 적용해 16비트 샘플을 만든다. 최대 ×64 시간 격자(31.25 ps)의 초해상도는 FPGA에서 반복 신호를 누적하며, 프로젝트는 약 4비트의 해상도 증가를 제시한다. 자동 측정 18종, 커서, 수학 연산, FFT, 스펙트로그램, 아이 다이어그램, 지터, 마스크 검사, 버스 계층 분석, 오디오 분석 기능도 포함한다.
획득과 트리거
각 획득은 두 채널의 2 MiB SRAM을 채운다. 실행 중에는 화면에 필요한 크기의 데이터만 읽어 표시하고, STOP이나 SINGLE을 누르면 전체 기록을 읽는다. 전체 기록을 불러오는 데 약 4초가 걸리며, 로딩 표시가 나타난다. 읽어온 기록은 확대·측정·디코딩·내보내기에 사용할 수 있고, 정지한 상태에서 V/div, 오프셋, 시간축을 바꾸면 메모리의 기록을 다시 그린다. SINGLE은 캡처 직후 화면을 표시하고 멈춘 뒤 같은 캡처의 전체 기록을 불러온다. 평균·ERES·정밀 모드에서는 SINGLE이 결과 하나를 만든 뒤 멈추며, STOP은 현재 결과를 유지한다.
채널마다 100 MS/s 변환기 다섯 개를 번갈아 사용한다. FPGA는 각 변환기의 오차를 보정해 인터리빙 패턴을 줄이며, 프로젝트 설명에 따르면 콤 패턴은 11코드에서 0.15코드로 낮아졌다. FPGA를 불러올 때 변환기 일부가 작동하지 않는 경우를 감지하기 위해 변환기 인코딩 클록을 재시작하고 열 개 코어를 확인한다. 이후에도 매분, 또는 전체 속도 기록에서 코어가 한 코드에 고정된 경우 다시 확인해 복구를 시도한다. 복구되지 않으면 LCD와 웹 상태 표시줄에 고장 난 변환기를 표시하고 /api/status의 adc_fault에 상태를 기록한다. adc_recoveries는 복구한 횟수를 센다.
평균 모드는 트리거에 맞춰 최대 256개 캡처를 평균한다. ERES와 정밀 모드도 제공한다. 라이브 화면은 FPGA가 4,096개의 최소·최대 점으로 줄여 좁은 이벤트가 보이도록 한다. 충분히 확대하면 같은 캡처에서 확대 구간을 다시 읽어 열마다 최소·최대값을 표시한다. 평균·ERES·정밀 모드의 라이브 캡처는 8,192개 샘플로 표시한다. 아이 다이어그램과 초해상도는 사용하는 동안 원시 샘플을 읽는다.
AUTO 모드에서 10 ms/div보다 느린 시간축을 선택하면 롤 모드가 화면을 계속 이동시킨다. 기본 방식은 디시메이션한 캡처를 이어 붙이며, 캡처 사이의 간격은 마지막 값으로 표시하고 측정에서는 제외한다. HORIZ F4 또는 웹의 SCOPE, Horizontal, Roll: Stream 설정으로 FPGA stream 이미지를 사용하는 간격 없는 스트리밍을 켤 수 있다. 채널당 최대 약 978,000개 샘플/초(디시메이션 ×512, 3.9 MB/s)를 전송하며, 버스 전송량은 약 5.1 MB/s다. SRAM은 ARM이 ×512에서 약 0.5초, ×1024에서 약 1초 멈춰도 샘플을 보존한다. 더 오래 멈추면 손실을 알린다.
에지 트리거는 FPGA에서 결정하며, 5 ns/div에서 에지 위치의 피크 대 피크 흔들림은 0.19 ns다. 펄스 폭·기울기·PAL/NTSC 비디오 트리거도 하드웨어에서 처리한다. AUTO·normal·single 모드, 최대 10초 홀드오프, 강제 트리거가 있다. 52개 프로토콜 트리거는 바이트·워드·주소·ID·프레임 패턴을 마스크와 와일드카드로 비교한다. 최대 32개 프로토콜 이벤트를 잇는 시퀀스 트리거와 오류 트리거, 화면에 최대 네 개 상자를 그려 파형이 통과하거나 피하도록 하는 구역 트리거도 제공한다. 트리거 판단은 FPGA가 하고 앱은 이벤트에 트리거 지점을 맞춘다. 라이브 프레임에서 기준 마스크를 만들고 실패를 세거나 첫 실패에서 멈추며, 실패 기록을 둘러볼 수도 있다.
프로토콜 디코딩
52개 프로토콜은 모두 FPGA 트리거와 디코더를 제공하며 필요한 FPGA 이미지를 자동으로 불러온다. 목록에는 UART, I²C, SPI, CAN/CAN FD, FlexRay, ARINC 429, MIL-STD-1553, SENT, Manchester, USB 저속·전속, LIN, DMX512, MIDI, Modbus RTU, 1-Wire, WS281x, DHT/AM230x, HDMI-CEC, SAE J1850 VPW, 적외선 NEC·Sony SIRC·RC-5·RC-6 및 다중 프로토콜, DALI, USB Power Delivery, S/PDIF, PS/2, SWD, MDIO, Wiegand, 쿼드러처 인코더, 스테퍼 STEP/DIR, PWM, PT2262/EV1527, Oregon Scientific OOK, ISO 14443 Miller, Morse, DCF77, EM4100, EM4305, T55xx, STM8 SWIM, SDQ, PJON(PJDL), DSI, Qi, SD 카드, AVR PDI, cJTAG, Maple 버스, 디지털 캘리퍼가 포함된다.
BUS의 자동 감지는 캡처에서 버스 종류와 채널 역할, 전송률, SPI 모드와 비트 순서를 찾아 디코더 설정에 반영한다. LCD·웹·휴대전화에서 설정을 확인하고 수정할 수 있으며, 버스가 현재 시간축에서 읽히도록 시간축도 조정한다. 약 2초간 디코딩이 멈추면 다시 감지한다. UART·I²C·SPI·SENT·ARINC 429는 디시메이션 캡처에서 1.5초 안에 이름을 찾고, Manchester·MIL-1553·CAN·USB·FlexRay처럼 전체 샘플 속도가 필요한 버스는 몇 초가 걸린다.
BUS의 AUTO는 버스를 다시 찾고 프레임에 맞춰 표시한다. 임계값을 신호 중간에 맞추고, I²C START나 SPI 첫 워드, CAN SOF, MIL-1553 명령 워드, 유휴 구간 뒤 첫 UART 문자 등에 하드웨어 트리거를 건다. Manchester, USB, SENT, CAN, FlexRay, MIL-1553, ARINC 429의 프로토콜 이미지는 전체 속도로 2.1 ms를 기록하므로 200 µs/div 이하에서 트리거가 동작한다. UART 프레임이 이미 설정돼 있으면 AUTO는 해당 qualifier 이미지를 유지한다. 패킷·라인 코드 버스는 이미지 전환에 11~15초가 걸릴 수 있으며, 전환을 기다리는 스트림은 상태를 표시한다.
연속 디코딩은 캡처 사이의 공백 없이 버스 데이터를 표시하면서 각 프레임의 전체 속도 기록을 보존한다. BUS의 세 번째 화면에서 UART 921,600 baud를 3분간 실행한 사례는 1,660만 바이트를 손실 없이 디코딩했다. 더 높은 속도에서 이벤트가 유실되면 표시하며 조용히 버리지 않는다. 디코딩 결과는 16진수·ASCII·통합 화면과 정규식 검색이 가능한 감시 버퍼에서 볼 수 있다.
FPGA의 fast 이미지는 SPI·UART·I²C를 125 MHz 라인 레벨이 아니라 변환기의 원시 샘플에서 디코딩한다. 2 ns 샘플의 에지 교차를 보간해 1/16 ns 단위로 시간을 구하고, 그 시점에서 비트를 읽는다. 세 프로토콜은 하나의 이미지에서 동작하며 FPGA 논리의 86%를 사용하고 타이밍 조건을 충족했다고 프로젝트는 설명한다. 일반 이미지에서 UART는 5 MBd 8N1, I²C는 fast-mode plus, SPI는 약 20 MHz까지 처리한다. 그보다 빠르거나 BUS 설정에서 Receiver = Samples를 선택하면 약 4초 만에 fast 이미지로 전환한다.
프로젝트가 제시한 시험에서 104 MHz SPI 플래시 모양의 신호는 3,947회 중 3,947회 정확히 디코딩됐고 104 MHz에서 4,945회 중 4,945회 성공했다. UART는 62.5 MBd의 8N1·7E1·9O1 및 반전 신호를 시험해 32문자 버스트 3,961회(8N1), 3,982회(9O1)에서 오류가 없었다. 10·25·50 MBd도 시험했다. I²C는 3.4 MHz 고속 모드에서 3,799회 전송, 오류 0건을 기록했으며 100 kHz·400 kHz·1 MHz도 시험했다. SPI의 자동 데이터 지연은 데이터 전이가 없는 가장 넓은 클록 위상 구간의 중간에서 샘플링하며, 설정 화면에 지연과 양쪽 타이밍 여유를 표시한다.
측정과 연결
자동 측정은 Vpp, Vmax, Vmin, Vmean, Vrms, AC rms, Vtop, Vbase, 진폭, 오버슈트, 프리슈트, 주파수, 주기, 듀티 사이클, 상승·하강 시간, 양·음 펄스 폭 등 18종이다. 커서는 시간·전압 차와 Δt의 역수, ΔV를 표시하며 시간축·V/div·오프셋·확대 변경에 맞춰 신호 위에서 이동한다. 수학 연산은 C1−C2, C2−C1, C1+C2, C1×C2와 FFT 피크를 이용한 반송파 제거를 지원한다.
FFT는 최대 64개 피크 표와 스펙트로그램을 제공한다. 아이 다이어그램·지터 분석에는 소프트웨어 클록 복구, TIE RMS·피크 대 피크, RJ/DJ 분리, 주기·주기 간 지터, 아이 높이·너비, TIE 히스토그램과 스펙트럼이 포함된다. 초해상도는 반복 에지를 최대 ×64 더 촘촘한 시간 격자에 누적하며, 보간·큐빅·드리즐 커널이나 FPGA가 트리거한 UART 바이트를 사용할 수 있다. 신호에 따라 샘플링된 기준 파형 두 개, 퍼시스턴스, XY, 정지 화면도 제공한다.
버스 계층 분석은 디코딩한 버스 위에 애플리케이션 디코더를 쌓는다. SPI용 플래시·SD 카드·AVR ISP·라디오·네트워크 칩·변환기·센서 22종, I²C용 EDID·클록·EEPROM·포트 확장기·센서 16종, UART용 S.BUS·ARM trace·Bluetooth 모듈·Amulet 디스플레이 6종, 1-Wire ROM과 장치 3종, MDIO CFP 모듈, USB 요청 등을 제공한다. SOUND 기능은 두 채널을 61 kSa/s로 스트리밍하며 dBu·dBV·프리셋 기준 레벨 미터, 튜너, ADSR 엔벌로프, 트레몰로·비브라토·FM 지수, 고조파·THD를 표시한다. 브라우저에서 스트림을 재생하는 Listen 기능도 있다.
웹 UI는 포트 8080에서 실행되며 WebGL로 표시한다. PNG·CSV·sigrok .sr(PulseView에서 열 수 있고 임계값을 적용한 로직 채널 포함)·VCD·WAV로 내보낼 수 있다. LAN의 VXI-11을 통한 SCPI와 Siglent/LeCroy 단축 명령, WAVEDESC 헤더를 포함한 WF? 파형 전송, SCDP 화면 캡처를 지원한다. 휴대전화에서는 http://<scope>:8080/r을 열어 파형을 보지 않고 설정·작업공간·키를 조작한다. 조작은 기기 화면을 열지 않으며, 여러 휴대전화가 동시에 접속할 수 있다. 메뉴 검색, 변경 이력과 되돌리기, 단위가 붙은 숫자 입력, 16진수 값과 매치 바이트 입력도 제공한다.
설치와 보안
필요한 장비는 Siglent SDS1000CML+ 오실로스코프(개발·검증 모델은 SDS1102CML+), USB 메모리다. 웹 UI·휴대전화 리모컨·SCPI를 쓰려면 LAN 연결이 필요하고, 브라우저는 WebGL을 지원해야 한다. 설정은 USB 메모리의 scope-settings.json에 저장된다. 기기 플래시에는 아무것도 기록하지 않는다.
빌드 없이 릴리스를 설치할 수 있다. 새 기능과 알려진 제한은 릴리스 노트에 있다.
open-sds1000cml-<version>-usb.zip을 내려받는다. 확인하려면SHA256SUMS도 받아 다음 명령을 실행한다.
sha256sum -c SHA256SUMS --ignore-missing
- USB 메모리를 MBR과 FAT32, 기본 파티션 하나로 포맷한다. Windows에서는 Rufus에서 MBR과 FAT32를 선택한다(Windows 기본 도구는 32 GB를 넘는 메모리에서 제한이 있다). macOS 디스크 유틸리티에서는 MS-DOS (FAT)와 Master Boot Record를, Linux GParted에서는 msdos 파티션 테이블과 fat32 파티션을 사용한다. GPT 메모리는 인식되지 않는다.
- ZIP 파일을 메모리 최상위에 푼다.
startup.sh,ota/,agent-slots/가 ZIP 이름의 폴더 안이 아니라 최상위에 있어야 한다. - 메모리를 안전하게 꺼내 오실로스코프에 꽂고 전원을 껐다 켠다. 부팅 시 공장 펌웨어가 메모리의
startup.sh를 실행하고, 몇 초 뒤 새 펌웨어가 LCD와 전면 패널을 제어한다. - LCD나 라우터의 DHCP 클라이언트 목록에서 기기 주소를 확인하고
http://<scope-ip>:8080/을 연다. 휴대전화 리모컨 주소는/r이다.
메모리를 꽂아 둔 채 부팅하면 새 펌웨어가 실행되고, 빼면 공장 펌웨어로 부팅한다. 업데이트는 새 릴리스 ZIP을 같은 방식으로 메모리에 풀고 전원을 껐다 켜면 된다. 설정 파일은 ZIP에 들어 있지 않아 유지된다. 다만 ota/agent.env는 ZIP의 파일로 교체되므로 직접 수정했다면 다시 반영해야 한다. 네트워크 업데이트 도구 otactl은 두 앱 슬롯 중 다른 슬롯에 새 앱을 설치하고 상태 확인에 실패하면 이전 앱으로 되돌린다. 이전 슬롯을 실행하는 명령은 다음과 같다.
otactl -tcp <scope-ip>:5900 activate A
A 대신 B를 지정할 수도 있다. ZIP 설치 직후에는 두 슬롯에 같은 앱이 있으므로 이전 릴리스로 돌아가려면 이전 ZIP을 사용해야 한다. 펌웨어를 제거하려면 USB 메모리를 빼고 전원을 껐다 켠다. 공장 펌웨어는 변경되지 않은 상태로 부팅된다.
웹 UI(8080), SCPI(VXI-11), 에이전트 제어 포트(5900)는 인증을 요구하지 않는다. 기기에 접속할 수 있는 사람은 제어할 수 있고, 5900 포트는 root 권한으로 명령을 실행한다. 프로젝트는 신뢰할 수 있는 네트워크에서만 사용할 것을 권고한다. ota/agent.env에 OTA_LISTEN=127.0.0.1:5900을 설정하면 네트워크에서 5900 포트를 닫을 수 있으며, 이 경우 업데이트는 USB 메모리로 해야 한다.
버전은 기기의 SYS 설정 탭(Help 키), 웹 UI 상태 표시줄, /api/status의 version에서 확인한다. otactl version은 컨트롤러 버전을, 아래 명령은 에이전트 상태를 확인한다.
otactl -tcp <scope-ip>:5900 status
otactl -tcp <scope-ip>:5900 update-app agent-slots/A/app # a release zip의 앱
otactl -tcp <scope-ip>:5900 logs agent
otactl은 호스트에서 기기 에이전트를 관리하는 도구로 상태·로그·업데이트·롤백을 지원하며 Linux·macOS·Windows용 릴리스에 포함된다. 자세한 내용은 ota/README.md에 있다. 설계 요구사항·아키텍처·동작·결정은 model/의 requirements.yml과 decisions.yml부터 확인할 수 있고, 구현에 사용한 동작 사양은 specs/에 있다.
공장 펌웨어와의 차이 및 개발
공장 펌웨어는 실시간 1 GSa/s 샘플링, 일반 모드 40 k포인트 기록(최대 2 M포인트), 에지·펄스·비디오·기울기·교대 트리거를 내세운다. 프로젝트 설명은 공장 펌웨어에 직렬 프로토콜 트리거와 디코딩이 기재돼 있지 않다고 비교한다. 대체 펌웨어는 두 채널의 전체 1 M 샘플 기록, 52개 프로토콜 하드웨어 트리거·디코딩, 연속 디코딩, 시퀀스·오류·구역 트리거, 아이 다이어그램과 지터, 스펙트로그램, 정밀 모드와 초해상도, 브라우저 UI, sigrok 내보내기 기능을 더한다.
공장 FPGA의 CPU 기반 읽기와 비교해 DMA 경로는 이전 벤치마크에서 원시 전송 처리량을 약 3배 높였다고 프로젝트는 설명한다(11.1 MB/s 대 3.1~3.9 MB/s). DMA는 업체의 워드별 CPU 읽기 루프를 대체하지만 현재 드라이버는 완료 여부를 계속 확인한다. 라이브 표시에서는 2 MiB 원시 기록 대신 8 KiB 최소·최대 엔벌로프를 보내 샘플 데이터 전송량을 256분의 1로 줄인다. 프로젝트 측정치는 약 2초 대신 약 10~30 ms이며, STOP·SINGLE·상세 검토용 전체 기록은 SRAM에 유지된다.
저장소 구조는 app/에 Go·ARMv7 기기 앱과 일곱 FPGA 이미지, fpga/에 Verilog와 Cyclone IV EP4CE10 이미지·빌드, ota/에 기기 에이전트와 otactl, tools/deploy.sh에 빌드·배포 스크립트, model/과 specs/에 설계 문서와 동작 사양을 둔다. 테스트·시뮬레이션·빌드·배포 명령은 다음과 같다.
make test # app and ota test suites
fpga/sim.sh # self-checking RTL testbenches (iverilog)
make -C app app-release # ARMv7 app with the six FPGA images embedded
tools/deploy.sh # build and install on the scope (DEV=192.168.1.209)
node --experimental-strip-types fpga/build.ts --image=general # rebuild an FPGA image (Quartus 21.1 Lite)
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요