자일링스

자일링스 FAE로 일하는 동안 종종 각각의 모든 고객들의 디자인 요건에 부합하는 기능을 가진 특정 디지털 시그널 프로세서 코어(DSP)를 제공할 수 있느냐는 질문을 받곤 한다. 어느 경우에는 코어가 너무 크거나 혹은 너무 작거나 충분히 빠르지 않을 수 있다. 만약 DSP 코어가 여러분이 필요로 하는 기능을 완벽하게 갖추고 있지 못하다면, ILUT(Interpolated Lookup Table)를 사용하여 이 갭을 해결할 수 있을 것이다.
글: 다니엘 바그니(Daniele Bagni) DSP 스페셜리스트
자일링스(www.xilinx.com)

자일링스 FAE로 일하는 동안 종종 각각의 모든 고객들의 디자인 요건에 부합하는 기능을 가진 특정 DSP 코어를 제공할 수 있느냐는 질문을 받곤 한다. 어느 경우에는 코어가 너무 크거나 혹은 너무 작거나 충분히 빠르지 않을 수 있다. 언젠가는 개발 단계에서 고객의 요구에 정확하게 부합하는 코어를 제공할 수 있을 것이며, 조만간 CORE Generator™를 통해 제공될 예정이다. 하지만 이러한 시나리오에도 불구하고, 고객들은 현재 특정 DSP 기능 세트를 원하고 있으며, 기다리려고 하지 않는다. 이러한 경우에 DSP 기능을 커스터마이징하도록 자일링스 디바이스에 LUT(Lookup Table) 보간법을 이용하도록 종종 제안한다.
LUT는 메모리 요소로서 출력은 모든 주어진 입력 상태의 조합에 따라 이뤄지며, 모든 입력마다 정확한 출력을 도출한다. DSP 기능을 수행하기 위해 LUT를 사용하면 몇몇 주요 이점을 얻을 수 있다.

MATLAB짋 혹은 Simulink짋와 같은 고도의 추상화 레벨 프로그래밍 언어로 LUT 콘텐트를 변경할 수 있다.
예를 들어 y=log(x), y=exp(x), y=1/x, y=sin(x) 등과 같이 개별 로직 연산으로 에뮬레이트하기에는 상당히 어려운 작업인 연산기능을 수행하는 DSP 기능을 설계할 수 있다.
쪾또한 LUT는 CLB(Configurable Logic Block) 슬라이스와 임베디드 멀티플라이 혹은 DSP48 프로그래머블 MAC(Multiply and Accumulate) 유닛과 같은 상당히 많은 FPGA 리소스가 요구되는 복잡한 수학 함수를 구현하기에도 매우 간단한 방법이다.
물론 이와 같이 LUT를 사용하는 데에도 몇몇 단점이 있다. LUT로 DSP 기능을 구현할 때, BRAM(Block RAM) 요소를 사용해야만 한다. 16bit 입력과 18bit 출력 변수를 위해 y=sqrt(x) 함수를 구현할 경우 각각의 X와 Y는 대략 각각 18Kbit인 64개의 BRAM 유닛을 필요로 한다. 만약 예를 들어, 소형 스파르탄(Spartan짋) 디바이스를 타깃으로 하고 있거나, 구현하는데 너무 많은 연산자가 필요하거나, 각각 64BRAM 유닛을 할당할 수 없다면, 시스템 아키텍처 측면에서 BRAM 용량에 대한 비용 부담이 너무 커질 수도 있음으로 포기하는 것이 좋다.
LUT 보간법은 너무 많은 BRAM을 사용하지 않고도 LUT 기반 기능을 구현할 수 있는 이점이 있다. 이 기법은 보다 작은 LUT(예를 들어 1K 워드 딥)로부터 인접한 출력을 이용하며, 보다 큰 LUT를 에뮬레이트하기 위해 이를 선형적으로 보간한다. 이렇게 함으로써 1K-워드 LUT로 구현하는 것보다 더 우수한 수리적 분해능력을 달성할 수 있다. 또한 오직 하나의 BRAM과 하나의 임베디드 멀티플라이어(혹은 DSP48), 그리고 제어로직을 위한 몇 개의 CLB 슬라이스로 구현되기 때문에 LUT를 이용하는 비용 보다 상당히 합리적이다. 더욱이 SNR(Signal-to-Noise Ratio) 측면에서 보더라도 계산 정확도가 훨씬 더 만족스러울 것이다.
물론 ILUT(Interpolated Lookup Table) 기법은 어느 정도의 노하우를 필요로 한다. 예를 들면, y=sqrt(x) 함수로 이 접근법을 사용하면, 공간 점유 및 타이밍, 수리적 정확성 측면에서 어떻게 ILUT가 실행되는지 분명하게 알 수 있을 것이다. 과제를 통해서, 완전히 서로 다른 요구를 가지고 있는 고객들을 위해 이러한 접근법을 적용해야 하는 몇몇 실질적인 예를 검토하고자 한다. 특별히 비선형 트랜스퍼 기능을 가진 센서의 선형화 및 SAR(Synthetic Aperture Radar) 이미지로부터 스펙클 노이즈(Speckle Noise)를 제거하기 위한 어댑티브 FIR(Finite Impulse Response) 필터 구현 과제를 살펴보고자 한다.

DSP를 위한 시스템 제너레이터 설계

함수1.jpg

자일링스 FPGA에서 DSP 알고리즘을 구현하기 위해 매스웍스(Mathworks)의 모델 기반 방법론인 시뮬링크(Simulink)에서 동작하는 합성 툴과 DSP 디자인을 위한 시스템 제너레이터(System Generator)를 사용했다.
시스템 제너레이터는 시뮬링크에서 자일링스 DSP 블록세트를 이용할 수 있도록 하며, DSP 빌딩블록에 고도로 최적화된 넷리스트를 생성하기 위해 자동으로 CORE 제너레이터를 불러온다.
시뮬링크는 2배 정밀도를 가진 부동소수점 디자인 툴이며, 반면에 시스템 제너레이터는 고정 소수점 연산 툴이다. 그럼에도 불구하고 이러한 툴을 함께 사용하면 총 비트수와 모든 신호의 바이너리 포지션을 정의할 수 있으며, 이를 통해 고정소수점 연산 분수를 정밀하게 만들 수 있다. 시뮬레이션 결과는 사이클-정확성 및 비트-트루로, 양자화 오차를 체크하기 위해 MATLAB 스크립트나 시뮬링크 블록으로 생성한 부동 소수점 레퍼런스 결과로 이들을 쉽게 비교할 수 있다.
그림 1에 시스템 제너레이터 상의 ILUT 구조의 상단 레벨을 나타냈다. 가능한 일반적으로 접근하기 위해 nx=16bit 입력 변수 x는 0(포함)과 1(제외) 사이로 노멀라이즈 되도록 했으며, 그래서 이 포맷은 '바이너리 포인트의 오른편에 16bit가 위치하는 언사인드 16bit'이며, 이를 Ufix_16_16 포맷이라고 부른다. MSB(Most Significant Bits)와 LSB(Least Significant Bits) 블록은 입력 데이터에서 각각 nb=10 MSB와 nx-nb=6 LSB를 도출한다. 이러한 신호들은 x0 및 x0이라고 부른다. 출력 y=sqrt(x)는 ny=17bit로 나타내며, Ufix_17_17 포맷으로 노멀라이즈 되어 있다.
그림 2는 1K 워드 규모의 소형 LUT 단계를 표현하고 있으며, 듀얼 포트 RAM 블록으로 구현했다. 이러한 블록을 ROM(Read-Only Memory)으로 적용하고 있기 때문에 Boolean 상수 블록, We_const는 제로로 작성할 수 있다. 신호 x0과 x01은 ROM 테이블에 2개의 후속 어드레스로 사용된다. Data_const 블록의 제로 상수는 어떠한 ROM 워드(이 경우에는 ny) 크기로도 정의될 수 있다.
다음의 공식은 x0 MSB의 x로 2개의 알려진 포인트 (x0, y0) 및 (x1, y1) 사이의 좌표(x, y)에서 어떻게 선형으로 포인트를 내삽할 수 있는지를 보여준다:
x1과 x0은 소형 LUT에 인접한 2개의 어드레스이며, 각각 서로 독립된 하나의 LSB이다. 소형 LUT는 nb bit의 어드레스 공간을 가지고 있기 때문에, 이러한 LSB는 2-nb 값을 갖는다. 내삽 단계는 그림 3에 나타내었다.
Reinterpret 블록은 바이너리 표기를 변경할 필요없이 dx=x-x0 신호로 변경된다. 이는 바이너리 포인트(UFix_6_0에서 UFix_6_6 포맷까지)를 재배치하고 nx-nb bit의 분수를 출력하기 때문에 (x-x0)/ 2-nb 값을 계산한다.
하드웨어에서 이 블록은 비용이 들지 않는다. 일반적으로(ILUT 접근법으로 적용한 기능에 따라서), 만약 y1=0 및 y=0이면, 제로 대신에 1/2-nb를 얻기 위해 y1-y0=1을 만든다.
우리는 Mux, Relational, Constant, Constant1 블록으로 이 동작을 수행한다. 남은 Mult, Add, Sub 블록은 선형 내삽법 공식을 실행한다. 이 경우 실험을 위한 전반적인 수리적 정확성은 충분히 좋기 때문에 이론적으로 요구되는 23이 아니라 17bit 분해능을 얻기 위해서 Mult 블록으로부터 출력신호를 가져왔다. 또한 y=sqrt(x) 함수가 단조적으로 증가하기 때문에 모든 결과는 언사인드 타입으로 처리 하였다. 달리 말해서 서로 다른 함수는 서로 다른 데이터 형태의 조정이 필요할 수 있는데, 그림 3에 나타낸 구조의 원리에서 크게 벗어나지는 않는다.
스파르탄-3E 1200(fg320-4)이 타겟 디바이스이고 ISE짋 디자인 수트와 DSP 10.1SP3 버전 시스템 제너레이터 툴을 사용하고 있다면, P&R(Place and Route) 이후에 사용된 FPGA 리소스는 다음과 같다:


타겟 부품 '3s1200efg320-4'를 이용한 설계요약
로직 활용:
플립-플롭 슬라이스 수: 17344 중 198 1
4-입력 LUT 수: 17344 중 086 1
로직 분배:
점유 슬라이스 수: 08672 중 111 1
MULT18X18 수: 00028 중 001 3
BRAM 수: 00028 중 001 3


이 디자인은 완벽하게 파이프라인 되어 있으며, 어떠한 클럭 사이클에서도 새로운 출력 결과를 제공할 수 있다.
레이턴시는 10 클럭 사이클이고, 구현 가능한 최대 데이터 속도는 194.70MSPS (Millions of Samples per Second)이다. 수리적 정확성 측면에서, 부동소수점 레퍼런스 결과의 성능과 DSP 고정소수점 출력을 위한 시스템 제너레이터의 양자화 에러 간의 비율은 각각 1K 혹은 2K 워드 딥을 가진 ILUT에서 71.94dB 혹은 77.95dB의 SNR을 나타냈다.
ILUT 대신에, DSP를 위한 시스템 제너레이터의 자일링스 레퍼런스 연산 블록세트에서 제공되는 CORDIC SQRT 블록을 적용할 수도 있다. 이 경우, 전반적인 레이턴시는 37 클럭 사이클, 최대 데이터 속도는 115.18MSPS이며, 리소스 점유 면적은 940개의 플립-플롭 슬라이스이다. 또한 885개의 4-입력 LUT 및 560개의 슬라이스, 그리고 2개의 MULT18×18 임베디드 멀티플라이어가 사용된다.
SNR은 40.64dB이다. 이러한 결과는 CORDIC이 고정 소수점 연산자를 구현하는데 탁월한 방법임을 보여준다. 하지만 ILUT 접근법은 대부분의 경우 더욱 뛰어나다.

함수2.jpg


비선형 센서의 선형화

최근 수많은 기업들이 소형화, 저전력 소모, 고성능은 물론 가능한 저렴한 가격으로 개발기간을 단축하기 위해 '스마트 센서'를 산업용 제어시스템에 사용하고 있다.
일반적인 스마트 센서는 그림 4에 나타낸 것처럼 센서와 이를 위한 시그널 컨디셔닝 회로, ADC(Analog-to-Digital Converter), 그리고 관련 DSP 서브시스템(추가적인 임베디드 프로세서를 갖추고 있거나 없거나)으로 구성된 하나의 기능 유닛으로 볼 수 있다.
스마트 센서는 최신 전자모터와 같이 물리적 질량을 디지털 전자 회로가 처리할 수 있도록 디지털 신호로 변환해야만 한다. 오프셋, 게인, 비선형성 등과 같은 에러 때문에 정확한 기능의 부품 및 기술이 이러한 센서를 범용으로 구성하기 위해 사용된다.
이러한 에러는 대부분 선형적이지 않은 전송 기능 전반에서 발생한다.
종종 고객들은 이러한 에러를 해당 제품에서 동작하고 있는 DSP 서브 시스템 내에서 수정한다. 만약 y=f(x)가 센서와 ADC를 통과해서 나온 디지털 출력 신호라면, DSP 서브시스템은 총체적인 출력 z가 슬로프 m과 수직 인터셉트 b를 가진 직선 공식이 되도록 이의 역함수 g(y)=f-1(y)를 수행하여 비선형 함수를 보상해야 한다.
가장 간단한 선형화 방법은 ROM에 저장된 센서 측정 포인트를 이용한 LUT 접근법이다. 그러나 16bit ADC는 64BRAM 유닛이 필요함으로 ROM 사이즈가 너무 커지게 된다. 따라서 이 경우에는 ILUT가 좋은 솔루션이 된다.
예를 들어, 비선형 전송 함수가 포물선이라고 가정해 보자. 다음 MATLAB 프래그먼트 코드(Fragment Code)는 어떻게 최종 직선 m과 b 파라미터를 생성할 수 있는지, 그리고 어떻게 g(y), 역함수 f(x)를 연산하는지 보여준다.
그림 5에 서로 다른 컬러로 3개의 커브를 나타내었다. 반전 프로세스 f(x)는 g(y) 손실값을 유발할 수 있다는 점을 알아야 한다. 완전히 다른 x 포인트에 상응하는 동일한 y 값을 가진 몇몇 포인트가 있을 수 있기 때문이다. 따라서 g(y)는 모든 가능한 손실을 채울 수 있도록 조정되어야만 한다.(여기에서는 지면 문제로 해당 MATLAB 프래그먼트 연산 부분을 포함시키지 않았다.)

ny = 18; ILUT의 워드당 18bit가 센서 선형화를 위해 적용되었다.
nx = 16; 센서 ADC 출력 코드의 비트 수 센서 비선형 전송 함수의 에뮬레이션
x = -1.5 : 3 / 2^nx : 1.5 -3/2^nx;
y = -0.196 x 0.1 * (x.^2);
포물선 y=f(x)
min_x = min(x); max_x = max(x); min_y = min(y); max_y =max(y);
ADC 비트에서 제공 가능한 모든 2^N을 사용하기 위해 y 커브의 히스토그램 스트래칭
yy = ((y-min_y) .* (2^nx-1))/(max_y-min_y);
yq = round(yy); 완전한 정수 전송 함수를 구현하기 위해
figure; plot(x, yq, 'k', 'LineWidth',2); title '포물선 y=f(x)';
슬로프 및 y-인터셉트를 결정하기 위한 선형 회귀 y = f(x)
직선 공식 y = m*x b; 최종적으로 얻게 되는:
m = 2.184494117400677e004 및 b = 2.952424998204837e004
상관계수 r = 0.997036366735360 (값이 1에 가까울수록 선형 회귀의 안정성이 우수함)

p = polyfit(x, yq, 1); m = p(1); b = p(2);
y 커브에 근사한 라인을 만들어보자: z = b m * x;
z2 = b m .* x; 일반적인 직선은 b와 m으로 정의된다.
zq = z2 abs(z2(1)); 포물선 f(x)와 동일한 인터셉트를 얻기 위해 수직으로 변환된다.
zq = round(zq);
hold on; plot(x, zq, 'g', 'LineWidth',2); grid;
title 'parabola y=f(x) and line y=m*xb'; hold off;
x_of_y = -1 * ones(2^nx, 1); g(y)를 위한 메모리 할당
addr = uint32(yq(1:end));
이것은 비선형 센서 커브 y=f(x)에 대한 역함수 g(y)이다
x_of_y(addr(2:end)) = ( (x(2:end)-min_x).*2^ny)/(max_xmin_x);
x_of_y(1)=0; addr(1)=0 is forbidden in MATLAB
x_of_y는 적용되기 전에 조정되어야 한다.(여기에는 나타내지 않음)
figure; plot(yq, (x_of_y), 'b', 'LineWidth',2); title
'original x=g(y)'; grid
센서의 비선형 전송 함수를 선형화하기 위한 값을 가진 레퍼런스 LUT
refLUT = round( m .* (min_x smoothed_x_of_y*(max_xmin_
x)/2^ny) b abs(z2(1)) );

고정소수점 사이클 기반 시뮬레이션을 DSP를 위한 시스템 제너레이터에서 구동함으로써 비선형 센서의 전체 출력 범위에서 92.48dB SNR을 얻었다(이 디자인은 그림 1-3에 나타낸 것과 상당히 비슷하다.).

스펙클 노이즈 감소

고속으로 이동하는 시스템, 즉 미사일과 같은 타깃 대상을 추적하는 것은 고도의 복잡한 DSP 알고리즘과 SAR(Synthetic Aperture Radar) 센서와 같은 서로 다른 타입의 수집 미디어가 요구되는 까다로운 작업이다.
전형적인 모든 전자기 간섭원처럼(레이저와 같은), SAR 이미징 디바이스는 스펙클 노이즈의 영향을 받는다.
따라서 모든 SAR-기반 DSP 체인의 첫 번째 단계는 2D(bidimensional) 어댑티브 FIR 필터로 노이즈를 감소시키는 것이다.(이것은 완벽하게 제거되지 않을 수 있다.) 그림 6은 스펙클 노이즈에 대한 MATLAB 시뮬레이션을 보여주고 있다. 노이즈는 좌측 이미지를 종합적으로 훼손시켰으며, 우측 이미지는 2D FIR 필터 골든 모델로 출력된 것이다.
스펙클 노이즈는 기하급수적 확산되는 증식성 노이즈이며, 편차값 σ로 완벽하게 정의된다. 광범위하게 적용되는 안티-스펙클 노이즈 방법은 Frost 필터로, 이는 1981년 이에 대한 논문을 작성한 V.S. Frost 저자의 이름을 딴 것이다. 3×3 블록 사이즈의 경우 다음과 같은 공식으로 모델링될 수 있다:


함수3.jpg

xij 및 yij는 각각 Frost 필터의 입력과 출력 샘플을 나타낸다. K는 필터 강도를 제어하기 위한 게인 요소이며,(간단하게 아래에서 K=1로 가정했다.) μ1 및 σ는 각각 2D 커널의 평균값과 편차값이고, Tij는 중심부의 출력 픽셀(인덱스 ij=22의)과 모든 주변 픽셀로부터의 차이를 나타내는 매트릭스이다. 다음 공식은 이러한 필터를 구현하는 핵심 요소인 R1, 즉 3x3 블록에서 1차 및 2차 μ1, μ2 모멘텀 간의 비율을 나타낸 것이다:


함수4.jpg

R1은 0과 1 사이의 범주에 있으며, 양호한 수리적 정확성을 얻기 위해 16과 20bit로 나타낼 수 있다는 것을 경험적으로 확인할 수 있었다.
DSP를 위한 시스템 제너레이터에서 R1을 연산하는 단계를 설계할 때, ILUT를 통해 노멀라이즈 된 필터 계수를 구현하기로 결정했다. LUT 콘텐트는 아래의 MATLAB 코드에 나타나 있다:

nb = 10; LUT를 어드레스하기 위한 비트 수
LUT를 위한 입력 어드레스
R1 = 0 : 1/(2^nb) : 1-1/(2^nb);
R = 9*R1 - 1; R = N * R1 -1 with N=9
ind_R = (R<0); R(ind_R)=0; 항상 R >= 0이 되도록 한다
x = R*sqrt(2);
M11_LUT = exp( -x ); 대각인덱스를 위한 계수
ij=11, 13, 31, 33
M12_LUT = exp( -R ); vert. & horiz. 인덱스를 위한 계수
ij=12, 21, 23, 32
tot = 4*(M11_LUT M12_LUT) 1; 인덱스 ij=22를 포함한 모든 계수의 총합
norm_M11_LUT = M11_LUT ./tot; 대각(ij=11, 13, 31, 33)을 위한 노멀라이즈된 계수
norm_M12_LUT = M12_LUT ./tot; vert. & horiz. (ij=12, 21, 23, 32)를 위한 노멀라이즈된 계수
M22_LUT = 1 ./ tot; 중심 포지션(ij=22)를 위한 노멀라이즈된 계수
figure; plot(x, norm_M11_LUT, 'r', x, norm_M12_LUT, 'g', x,
M22_LUT, 'b');
grid; title 'normalized M11 (red), M12 (green), M22 (blue)'

R1 입력 신호에 따른 노멀라이즈된 계수 커브를 나타낸 것이다. 여기에는 3개의 커브가 있는데, Tij 매트릭스는 대략 인덱스 ij=22 중심부 픽셀과 대칭적이다.
수치결과는 완전한 부동 소수점 레퍼런스 모델과 비교한 커브에 따라 81.28에서 83.38dB에 이르는 SNR 값을 나타낸다.
아래의 MATLAB 프래그먼트 코드는 2D 필터 프로세싱을 보여준다.(간소화하기 위해 ILUT 함수는 포함하지 않았다.)

function [out] = synth_frost3x3(inp) 입력은 9개 샘플의 벡터이다
mu1=0; mu2=0;
for k = 1 : 9
mu1 = mu1 inp(k); 1차 모멘텀(혹은 평균값)
mu2 = mu2 inp(k)^2; 2차 모멘텀
end
R1 = mu2 / (mu1^2 1); if (tmp_R1<0) R1=0; end since R1>=0 always
MATLAB 어레이 인덱싱은 1에서 1024이다(HW에서처럼 0에서 1023이 아니다)
if (R1 >=1024) addr=1024; elseif (R1==0) addr=1; else addr=R11; end
ILUT 함수는 여기에 나타내지 않았다
M11 = M11_ILUT(addr); M12 = M12_ILUT(addr); M22 = M22_ILUT(addr);
reg11 = inp(1) inp(3) inp(7) inp(9); 인덱스 11, 13, 31, 33의 pre-add 픽셀
reg12 = inp(2) inp(4) inp(6) inp(8); 인덱스 12, 21, 23, 32의 pre-add 픽셀
out11 = M11 * reg11; 인덱스 11, 13, 31, 33의 필터링된 픽셀 총합
out12 = M12 * reg12; 인덱스 12, 21, 23, 32의 필터링된 픽셀 총합
out22 = M22 * inp(5); 3x3 블록에서 인덱스 22의 중심 픽셀
out = out11 out12 out22; 필터 출력 픽셀

간단한 이러한 사례를 통해, 자일링스 FPGA에서 DSP 기능을 구현하는데 있어 ILUT가 여전히 간단하면서도 강력한 방법이라는 것을 알 수 있다. 매우 탁월한 수리적 정확도(SNR)와 고속 데이터 전송속도를 달성하는데 도움이 되며, 또한 상대적으로 적은 공간 만을 사용할 수 있다.

감사의 글
3년 전 자일링스에 입사했을 때, DSP를 위한 시스템 제너레이터 상에서 자신의 감마 정정 설계를 위해 ILUT(Interpolated Lookup Table) 접근법을 어떻게 적용했는지를 필자에게 처음으로 알려준 마이클 페콧(Michel Pecot)에게 감사를 드린다.
회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지