2. SNN 제어 회로와 RTL 구성
이 글에서는 LIF 뉴런의 상태 갱신을 RTL로 표현하고, 입력부터 네 방향 spike 출력까지 연결한 과정을 설명합니다. 99→32→4 실험망의 계층 구조와 시간 단계 FSM을 먼저 살펴본 뒤, 공개한 4채널 출력 제어 모듈을 코드와 파형으로 읽어봅니다. 막전위를 언제 읽고 갱신하는지, 발화와 reset이 어떤 순서로 일어나는지를 중심으로 정리했습니다.
네트워크와 RTL 모듈
최종 실험 네트워크는 위치 입력 99개, 은닉 뉴런 32개, 방향 출력 4개로 구성했다. 이 계층형 실험망은 weight 파일과 100개 time step을
사용해 계산한다. 공개한 error_encoder.v, lif_neuron.v,
controller_top.v에서는 signed 위치 오차를 네 방향으로 나누고 LIF spike를 생성하는 출력 제어 경로를 살펴볼
수 있다.
- 뉴런
- LIF: 누적 · 누설 · 임계값 · reset
- 시간
- 100 time steps
- 출력
- 방향별 spike count와 X/Y decoding
- 코드
- error_encoder · lif_neuron · controller_top
LIF 뉴런 데이터 경로
Baby Neuron datapath는 입력 spike의 가중합, 막전위 누적, 누설, 임계값 판정, reset으로 구성된다. 누설은 오른쪽 shift로 구현되며, 나눗셈기 없이 시간에 따른 막전위 감소를 나타낸다.
막전위 U는 뉴런이 이전 time step까지 받은 자극을 저장하는
상태값이다. 흥분성 weight는 U를 증가시키고, 억제성 weight는
감소시킨다. leak는 입력이 없을 때도 상태가 무한히 남지 않도록 줄이고,
threshold는 누적된 자극을 1-bit spike로 바꾸는 경계이다. 발화 뒤에는
막전위를 0으로 초기화하거나 임계값만큼 빼는 방식을 사용할 수 있으며,
최종 발표의 Baby Neuron은 reset-to-zero와 shift 기반 leak를 중심으로
설명한다.
| 항목 | 전체 실험망의 Baby Neuron | 공개 lif_neuron.v |
|---|---|---|
| 누설 | 막전위 오른쪽 shift 기반 | 기본값 LEAK=10을 매 clock 차감 |
| 임계값 | 실험 1: 40 · 실험 2: 300 | 기본값 U_THR=2000 |
| 입력 | pre-synaptic spike와 weight | 방향 magnitude X_in과 속도항 v_abs |
| 발화 후 상태 | 발표자료의 reset-to-zero | 임계값만큼 차감하는 subtractive reset |
| 용도 | 99→32→4 실험 네트워크 | 4방향 출력 제어 경로 설명 |
시간 단계 FSM
FSM은 초기화, 입력 처리, 누적 계산, 결과 산출, 표시 상태로 구성된다. 각 상태는 입력 생성과 막전위 갱신의 순서를 고정하며, 실험은 100개의 time step을 순차적으로 실행한다.
software에서는 반복문 하나로 100번 계산할 수 있지만, RTL에서는 어느
clock에 입력 spike가 유효한지, 어느 clock에 막전위가 갱신되는지, 언제
출력 count를 읽을지를 명시해야 한다. 특히 rate encoder의 counter와 LIF의
상태 레지스터가 같은 시간 기준을 공유하지 않으면, 의도한 spike 수와
실제 누적 횟수가 달라진다. FSM은 이 시간 경계를 고정해 done
시점에 방향별 count가 완성되도록 한다.
TIME_STEPS가 끝난 뒤 결과를 확정하는 순서를 나타낸다.
상태 이름은 발표자료의 구현 흐름을 따랐다.
FSM을 읽을 때는 한 time step 안에서 입력 생성과 상태 갱신에 각각 몇 clock이 필요한지 살펴봐야 한다. 이 실험에서 100 time step은 입력 rate와 막전위 반응을 관찰하기 위해 정한 반복 횟수이다.
99→32→4 계층 구조
입력 계층의 99개 뉴런은 보드 위치를 나타낸다. 32개 은닉 뉴런은 위치별 흥분·억제 연결을 시간에 따라 통합하며, 출력 계층은 네 방향을 제공한다. 반대 방향의 spike 수 차이는 X축과 Y축의 순 제어량으로 변환된다.
입력 뉴런은 현재 좌표에 해당하는 weight 행을 선택하는 역할을 한다.
은닉층은 여러 흥분성·억제성 연결을 합쳐 좌표별 반응을 만들고, 출력층은
이를 네 방향으로 모은다. weight는 RTL 안의 상수 몇 개로만 표현되는 것이
아니라 실험 zip의 hidden_*.hex와 output_*.hex로
분리되어 있다. 이 구조는 네트워크 연결과 뉴런 계산을 분리하므로 같은
뉴런 datapath를 유지하면서 weight 조합을 바꿀 수 있다.
| 계층 | 크기 | 받는 정보 | 내보내는 정보 |
|---|---|---|---|
| 입력 | 99 | 11×9 one-hot 위치와 rate 입력 | 위치별 spike |
| 은닉 | 32 | 흥분·억제 가중합 | 시간축 상태와 spike |
| 출력 | 4 | 은닉 계층 spike | +X · −X · +Y · −Y |
| decoder | 2축 | 방향별 spike count | X/Y 제어량과 완료 상태 |
네 방향 출력 RTL
error_encoder는 signed X·Y 값을 부호에 따라 네 방향의 양수 크기로 나눈다.
controller_top은 lif_neuron 네 개를 배치하고 각 spike를 방향 신호에 연결한다. 이 세
모듈을 따라가면 좌표 오차가 출력 이벤트로 바뀌는 과정을 확인할 수 있다.
error_encoder는 중앙 목표가 0이라는 조건을 이용해
ex=-x, ey=-y를 만든다. 양수 오차는 pull 채널,
음수 오차는 push 채널로 보내고 반대 채널은 0으로 둔다. 이 때문에 한
축에서는 정상적으로 한 방향만 자극된다. controller_top은
X축 두 채널에 v_abs_x, Y축 두 채널에 v_abs_y를
연결하고, 네 LIF의 1-bit spike를 각각 motor pull/push
출력에 직접 대응시킨다.
| 모듈 | 입력 | 내부 동작 | 출력 |
|---|---|---|---|
error_encoder | signed x,
y | 중앙 오차의 부호와 크기를 네 채널로 분리 | X/Y pull·push magnitude |
lif_neuron | X_in,
v_abs | leak, 입력 gain, 속도항, threshold, reset | 1-bit spike |
controller_top | 위치와 축별 속도항 | encoder 1개와 LIF 4개 연결 | 4방향 motor event |
공개 lif_neuron의 sequential block에서는 nonblocking
assignment를 사용한다. 따라서 현재 clock의 spike 판정은
갱신 전 막전위 U를 기준으로 하고, 같은 edge에서 다음
U가 계산된다. 파형을 읽을 때 입력 변화와 spike 사이에 clock
경계가 존재하는 이유가 여기에 있다.
| 현재 clock에서 읽는 값 | 조건 | 다음 clock을 위해 저장하는 값 |
|---|---|---|
기존 막전위 U | U > U_THR | spike=1, 막전위에서 threshold 차감 |
기존 막전위 U | U < LEAK | U=0 |
U, X_in, v_abs | 그 외 | U-LEAK+W_GAIN×X_in-K_V×v_abs |
공개 RTL의 lif_neuron은 발화할 때 막전위에서 임계값을 빼는 subtractive reset을 사용한다. 남은 막전위가 다음
clock으로 이어지므로 강한 입력에서는 연속 발화가 가능하다. 발표자료의 계층형 Baby Neuron은 발화 후 막전위를 0으로 초기화한다. 두 reset
방식을 비교하면 발화 뒤 남는 상태가 다음 출력에 어떤 영향을 주는지 이해할 수 있다.
RTL을 읽으며 확인한 핵심
뉴런 출력과 모터 구동 신호
출력 spike는 방향과 반응량을 전달하는 이벤트이다. 이후 모터를 연결할 때는 spike count를 구동 시간이나 PWM으로 대응시키는 규칙이 필요하다.
time step과 상태 갱신 순서
입력 생성, 막전위 갱신, 출력 집계 순서를 FSM으로 나누었다. 파형에서도 이 순서대로 신호를 따라가면 값이 처음 어긋난 구간을 찾기 쉽다.
좌표와 속도항
RTL 입력에는 위치와 축별 속도항이 디지털 값으로 들어온다. 위치 오차의 부호는 방향을 나누고, 축별 속도항은 해당 LIF 채널에 연결된다.
leak·threshold·gain
leak, threshold, gain은 막전위가 누적되는 속도와 발화 빈도에 영향을 준다. 입력 자극이 같아도 이 값에 따라 spike count가 달라지므로 실험 조건과 함께 기록했다.
출력 경로를 살펴보며 signed 오차의 방향 분리, LIF 상태 갱신, 1-bit spike 전달을 하나의 흐름으로 정리했다. 특히 수식의 계산 순서와 레지스터가 갱신되는 clock을 함께 읽어야 파형을 이해할 수 있었다. 다음 글에서는 입력 방식과 뉴런 설정을 바꿨을 때 방향별 출력이 어떻게 달라졌는지 살펴본다.