1. Simplification
1-1. two-level simplication
<Definition of terms for two level simplification>
Implicant : subcube를 이루는 on-set이나 dc-set을 칭하는 말.
Prime implicant : 더 큰 subcube로 묶을 수 없는 implicant
Essential prime implicant : prime implicant 중에 다른 prime implicant로 포함되지 않는 on-set을 가진 것
목표 : implicant를 prime implicant로 만들기
on-set을 적은 수의 prime implicant로 커버하기
Algorithm : K-map으로 가장 적은 term의 SoP 만들기
1. On-set의 엘리먼트 선택
2. 해당 on-set의 가장 큰 그루핑하기 : prime implicant로 만들기
3. on-set들을 방문하며 essential하다면 꼭 포함시키기
4. 가장 적은 수를 가진 term 조합으로 선택
SoP는 편하게 NAND gate로 이뤄진 회로로 바꿀 수 있음
마찬가지로 PoS를 NOR로만 구성하기도 쉽다.
1-2. Multi-level logic
input에 가능한 literal 개수가 정해져있을 때, 사용된다.
<이득>
회로가 작아질 수 있다.
게이트들이 적은 fan-in(# of input literals)
회로가 더 빨라질 수 있다.
<불이득>
디자인하기가 힘들다
optimization skill이 two-level에서 가장 좋음
분석이 더 복잡하다.
2-3. AOI gates(AND-OR-invert gates)
실제 구현을 보면 트렌지스터가 8개 밖에 들지 않는다!(NAND, NOR이 각각 4개)
A XOR B = A'B + AB' => (A'B' + AB)' => AOI gate로 표현 가능!
3x2 AOI => 3개의 input literals를 가진 2개의 and stack을 가진 AOI
2. Time behavior of combinational networks
combination 회로에 시간 정보를 확인하는 법 = Waveform
이에 고려해야하는 사항들
gate delay = input의 변화가 output의 변화로 되는데 걸리는 시간
rise time = output의 변화가 low에서 high로 가는데 걸리는 시간
fall time = output의 변화가 high에서 low로 가는데 걸리는 시간
pulse width = high나 low에서 신호가 유지되는데 걸리는 시간
이를 이용한 회로!
pulse shaping circuits
pulse 모양으로 waveform이 나타나게 된다, => A가 D로 가는 동안 걸리는 delay를 활용한 회로
이를 좀 더 이용하면 Oscilatory behavior로 나타낼 수 있다. => 반복적인 파도 모양의 회로가 만들어짐
3. Hardware Description Languages
Hardware Description Language = 여러가지 종류가 있지만 우리는 Verilog를 사용할 예정
Verilog는 원래 simulation만을 위한 언어였지만 synthesis에서도 사용 되고 있다.
Verilog를 작성하는 방법은
1) Structural
=> 모듈 내에서 모듈이 어떻게 구성되어 있는지를 나타내는 디자인법
2) Behavioral
=> 논리식이 어떻게 이루어지는지를 알려주는 디자인법
우리는 Behavioral를 주로 사용할 예정
3-1. always block
always @(a or b) begin
#6 out = a ^ b;
end
@( ~~~ ) : sensitivity list라고 하며 안에 있는 변수가 변할 때마다 수행된다.
@(*) : 모든 변수가 안에 있는 것을 말한다.
always block 내에서는 코드가 순차적으로 수행된다.
always block에서 assign 해주는 변수는 항상 reg나 integer로 선언해야 한다.
3-2. case
: 항상 always block 안에서만 수행된다.(casex, for, if 등 마찬가지)
: combination logic은 항상 모든 인풋이 always의 sensitivity list에 들어있어야 한다.
3-3. casex
: dont care set을 x로 선언 가능
3-4. assign
always 없이
assign을 할 때는 wire type으로 선언해줘야 한다.
hardware는 병렬적으로 동작한다. => 이러한 특성을 살려 디자인 해줘야 함.
4. Adder for lab
:
Full Adder는 두개의 Half Adder로 만들어줄 수 있다.
Multi bit adder를 구현하는 두가지 방법
4-1. Ripple carry adder
병렬적이지 못함. 캐리가 전달될 때까지 수행을 기다려야 함.
4-2. Carry Select Adder
Carry가 1일 때, 0일 때의 결과를 각각 수행해두고 mux로 이를 선택하는 방식
Mux : n개의 control inputs로 2^n개의 data input 중 하나를 선택하는 device
5. Quine-McCluskey Method
알고리즘적으로 적당히 좋은 minimized term을 선택하는 방법
1. Find all prime implicants
1) Implication Table에 term 개수로 column를 나눈다.
column 안에서는 1의 개수별로 나눠서 적는다(인접한 implicant를 찾기 쉽기 때문)
2) 그 다음 한 번도 묶이지 않은 implicant를 별표 쳐준다,(prime implicant)
2. find smallest set of prime implicants that cover the ON-set
1) 이후에는 prime implicant chart를 만들어서 cover된 minterm을 체크해준다.
=> cover해야하는 minterm에 아까 찾은 Prime implicant를 넣어서 cover하는 것들을 체크 해줌.
2) minterm 중 하나의 prime implicant에만 cover 되는 것이 essential prime implicant가 됨
=> 밑의 예시의 경우 4, 15가 하나의 prime implicant로만 cover됨.
3) 이 이후에는 전체 다 순회하며 minimized term을 구해줘야 함.
전체 prime implicant를 다 구하지 않고 적당히 구하는 것이 Espresso 방법
Expand와 Reduce를 iteration하면서 좋은 답을 구해간다.
'Computer Science > 논리설계' 카테고리의 다른 글
Sequential Logic Design (0) | 2020.12.08 |
---|---|
Case Studies in Combinational Logic Design (0) | 2020.10.27 |
Combinational Logic Technology (0) | 2020.10.13 |
Combination logic (0) | 2020.09.15 |
Introduction (0) | 2020.09.06 |