2015년 6월 13일 토요일

Electronic Component


Electronic Component
Electronic component는 프로그램 가능 논리 소자(PLD, Programmable Logic Device)와 주문형 반도체(ASIC, Application Specific Integrated Circuit)로 나뉜다. PLD는 다시 PROM(Programmable ROM), PAL(Programmable Array of Logic), PLA(Programmable Logic Array), CPLD(Complex PLD), FPGA(Field Programmable Gate Array)로 나뉜다.
 
PLD (Programmable Logic Device)
기본 소자가 어레이 형태로 배열되고 어레이의 각 격자점에 있는 퓨즈를 접속, 단절함으로써 목적하는 논리 회로를 실현하는 소자이다. PLDAND array가 고정되어있고 OR array는 프로그램 가능한 PROMAND array는 프로그램 가능하고 OR array가 고정되어 있는 PAL, 둘 다 프로그램 가능한 PLA이 있다.
PROM (Programmable ROM)
한 개의 디코더(AND 배열 부분)Memory array의 이차원 배열(OR 배열)로 이루어져 있다.
PAL (Programmable Array of Logic)
PAL의 구조는 AND 배열 부분을 사용자가 프로그램을 할 수가 있고 OR 배열은 고정되어 있다. 이 구조는 생산의 비용이 비교적 적게 들고 속도의 성능이 빠른 편이어서 많은 반도체 회사들이 이와 같은 기본 구조와 유사한 프로그램 가능한 소자들을 만들어 내고 있다.
PLA (Programmable Logic Array)
PLAAND 배열과 OR 배열의 두 구조로 나누어지는데 AND 배열은 입력에 관한 어떤 논리곱을 표현할 수 있고, OR 배열은 앞에서 구현된 논리곱들의 논리합을 구현할 수가 있다. 이것은 논리합(Sum of Product)의 구현에 가장 맞는 이상적인 구조이다. 그러나 이 구조는 두 개의 배열을 통해서 신호가 전달이 되므로 시간의 지연을 가지는 단점을 가지고 있다.
CPLD (Complex Programmable Logic Device)
Complex Programmable Logic Device (CPLD)의 블록은 disjunctive normal form식과 더 특별한 논리 연산을 실행하는 logic이 포함된 macrocell이다.
하나의 (Programmable Interconnection array)PIA가 존재하므로 정확한 타이밍 예측이 가능하다.
FPGA (Field Programmable Gate Array)
일반적인 기본 구조는 configurable logic blocks 어레이와 라우팅 채널로 구성된다. 일반적으로 모든 라우팅 채널은 동일한 폭을 가지고 있다. 응용회로는 적합한 자원을 가지는 FPGA를 반드시 매핑 해야 한다. 일반적인 FPGA의 논리 블록은 4개의 입력 룩업 테이블 (lookup table)과 플립플롭으로 구성된다.
 
ASIC (Application Specific Integrated Circuit)
ASIC은 특정한 종류의 전송 프로토콜이나 휴대용 컴퓨터 등과 같이 특별한 용도를 위해 설계된 칩이다. ASIC은 사용자의 주문 그대로 처음부터 회로를 설계하여 만드는 주문형(custom), 기본적인 게이트들을 여러 개 배열해 놓고 이들 사이의 배선만 이어주는 게이트 어레이(gate array), 그리고 카운터, 타이머, 플립플롭 등 기본적인 부품을 칩에 미리 구성해 놓은 반제품으로부터 이들을 칩 내에서 연결하여 원하는 회로를 만드는 표준 셀(standard cell) 등 세 가지 종류가 있다.
ASICFPGA의 차이점
FPGA같은 경우 회로설계의 앞부분만 끝마치면 보드에 장착된 FPGA상에 바로 회로를 다운로드하여 보드의 동작이 가능하다. 하지만, ASIC은 회로설계의 뒷부분 즉, 웨이퍼 상에 셀(게이트)가 놓일 위치를 정해주고, 그 웨이퍼 상에서 피지컬로 각 셀들을 메탈을 이용하여 Front-End에서 작성된 회로대로 연결하여 주는 작업을 해야 한다. FPGA는 이미 특정 셀들이 FPGA내부에 구성되어 있어서 단순히 선만 연결하거나 끊어서 회로도를 작성하는 반면, ASIC는 셀들이 어느 위치에 놓일지 알 수 없다. , FPGA는 시뮬레이션 할 때 타이밍의 예측이 쉽지만, ASIC은 쉽지 않다. ASICIC를 만들고 나서 그 IC가 제대로 만들어 졌는지 테스트해야 한다. FPGA는 이미 수백 ~ 수만 개의 셀들을 이미 IC안에 만들어 놓기 때문에 쓰지 않는 셀들이 상당히 많이 있을 수 있다. 그만큼 웨이퍼 다이가 커지게 되며, 생산량이 ASIC에 비해서 떨어지게 된다. 그래서 일반적으로 FPGAPrototype 용으로 많이 쓰이고, ASIC은 양산용으로 많이 쓴다.

Finite State Machine


Finite State Machine
유한개의 상태를 천이하는 디지털 시스템이다.
Moore machineMealy machine으로 구별된다.
- 유한 수의 상태를 가진다.
- 그 자신의 상태를 시험할 수 있다.
- 외부로부터 입력을 받아들인다.
- 이산된 시간의 단계에 그 자신의 상태를 변화시킬 수 있다.
- 그 자신의 상태와 외부로부터의 입력에 근거한 규칙에 따라서 그 자신의 상태를 변화시킬 수 있다.
 
Moore machine
출력이 현재 상태에 의해 결정된다.






 










Mealy machine 
출력이 현재 상태와 입력에 의해 결정된다.
 













[Velilog] Combinational Logic, Sequential Logic, Latch, Flip-flop


Combinational Logic
clock의 영향을 받지 않고 sensitivity list에 값 변화에 영향을 받는다.
always@(b, c)
begin
a = b & c
end
sensitivity list에 값 변화에 관여하는 모든 변수 포함 시켜야 한다. b, c 값의 변화가 일어나면 a의 값이 변경된다.
Sequential Logic
clockrising/falling edge에서 작동한다.
always@(posedge Clock)
begin
a = b & c;
end
sensitivity listclockreset, enable을 포함한다. b, c 값 변화와 상관없이 Clock이 상승할 때 a가 변경된다.
 
Latch
enable=1인 동안(또는 0인 동안) 값을 받아들이고 그 반대의 경우 현재 상태를 유지한다. 제어에 어려움이 있기 때문에 보통 사용하지 않으며 의도하지 않은 latch가 생기는 것을 방지해야한다.
Flip-flop
clock이 변화하는 순간(0 1 또는 1 0)에만 입력 신호를 받아들인다.
 






Unintentional Latch Inference
if/case에서 모든 branch에 대해 정의되어 있지 않을 때, clockedge 부분에서 일어나지 않을 때 발생한다.
If
Latch 발생
해결 방법
Always @(Enable, In_A)
begin
if(Enable)
begin
Data_Out = In_A;
end
end
if(Enable)
begin
Data_Out = In_A;
end
else
begin
Data_Out = In_B;
end
end
Data_Out = In_B;
if(Enable)
begin
Data_Out = In_A;
end
end
Enable0일 때 정의되지 않았다.
else문을 적어 모든 경우에 대해 정의 해 준다.
If 문 앞에 현재 상태를 정의 해 준다.
 
Case
case(Data_In)
2’b00 : Data_Out = In_A;
2’b01 : Data_Out = In_B;
default : Data_Out = In_A;
endcase
 
case(Data_In)
2’b01 : Data_Out = 2’b10;
2’b10 : Data_Out = 2’b01;
endcase
Data_out = In_A;
case(Data_In)
2’b00 : Data_Out = In_A;
2’b01 : Data_Out = In_B;
endcase
default를 사용하여 모든 경우에 대해 정의해 준다.
Data_In2'b012'b10 밖에 없는 경우 모든 경우에 대해 정의 된 것이다.
Case 문 앞에 기본 값을 넣어 준다.
 
D type Flip-Flop
Flip-flop 사용법
rising edge
falling edge
always@(posedge Clock)
begin
end
always@(negedge Clock)
begin
end
Synchronous
Asynchronous
always @(posedge Clock)
if(!SynReset)
Data_Out <= 0;
else
Data_Out <= Data_In;
end
always @(posedge Clock or negedge AsynReset)
if(!AsynReset)
Data_Out <= 0;
else
Data_Out <= Data_In;
end
ClockHigh로 변하는 순간에만 Data_Out 값이 변한다.
Clock의 값과 관계없이 AsynResetLow로 변하는 순간 Data_Out 값이 변한다.
event list 극성과 edge condition이 일치해야 한다.
always@(posedge clk or negedge AsynReset) if(!AsynReset)
always@(posedge clk or posedge AsynReset) if(AsynReset)
Enable
Reset
always @(posedge Clock)
if(Enable)
Data_Out <= Data_In;
end
always @(posedge Clock)
if(!Reset)
Data_Out <= 0;
else
Data_Out <= Data_In;
end
EnableHigh일 때만 동작한다.
ResetLow일 때 Reset 시키고 그 외에는 입력 값이 출력 값으로 나온다.