디지털 산술과 연산회로
단원목차 1. 디지털 연산 2. 부호화 이진수 3. 부호화 이진 연산 4. 16진 연산 5. 수와 알파뉴메릭 코드 6. 이진 가산기와 감산기 7. BCD 가산기 8. MAX+PLUS II 에서의 캐리생성
디지털 산술 부호화 이진수: 부호 (+/-) 를 한 비트 (일반적으로 MSB), 나머지 비트를 크기로 하는 고정된 길이의 이진수. 무부호 이진수: 부호비트를 규정하지않는 고정된 길이의 이진수. 모든 비트는 크기이고 부호는 양(+)으로 고려된다.
무부호 이진 연산 합(sum): 둘 또는 그 이상의 이진수(오퍼랜드)의 가산연산의 결과. 캐리(carry): N-비트 가산동작 동안에 다음의 최상위 비트로 자리올림이 발생하는 비트. 만약 결과가 N-비트에서 허용할 수 있는 것보다 클 경우, 캐리비트는 1이 된다.
기본 규칙(무부호) One Bit 무부호 가산 0 + 0 = 0 0 1 + 0 = 0 1 1 + 1 = 1 0 0 + 0 = 0 0 1 + 0 = 0 1 1 + 1 = 1 0 1 + 1 + 1 = 1 1 C_IN A B C_OUT SUM
이진 가산 예 이진 가산 1 Carry to next 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 1 0 + 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 Carry Out Bit
감산 감산 X = A – B에서, A=피감수(Minuend), B=감수(Subtrahend), X =차(Difference). 감산은 마이크로프로세서에서 사용하는 2의 보수 가산과 같은 많은 형태가 있다. (PC에서 처럼)
감산 규칙 1비트 이진 감산 0 - 0 = 0 0 1 - 0 = 0 1 1 - 1 = 0 0 10 - 1 = 0 1 BORROWIN A B
이진 감산 예 빌림이 있는 이진 감산 1110 110(10) Borrow Stage -1001 100 1 010 1 -1001 100 1 010 1 10000 0111(10) Borrow ripples to LSB - 101 10 1 0101 1
부호화 이진수(1) 부호비트: 일반적으로 MSB 비트로, 수가 양일 때는 ‘0’, 음일 때는 ‘1’을 나타낸다 크기비트: 크기를 나타내는 비트 참 크기 형태: 크기비트가 참(TRUE) 크기를 나타내는 부호화 이진형태 (보수형태가 아님).
부호화 이진수(2) 1’s Complement: 모든 비트를 보수화해서 음수를 만드는 부호화 이진수의 형태. 2’s Complement: 모든 비트를 보수화 한 후, 1을 더해서 음수를 만드는 부호화 이진수 형태(1’s complement +1).
참 크기 형태 5 Bit Numbers/ Negative = S=1 +25 = 011001 sign bit = MSB = S = 0 -25 = 111001 Same as +25 with S=1 -12 = 101100 +12 = 001100 True magnitude
1의 보수 형태 8-Bit 1’s Complement (Negative = S = 1) 57 = 0011 1001 57 = 0011 1001 -57 = 1100 0110 All Bits Inverted 72 = 0100 1000 -72 = 1011 0111
2의 보수 형태 MPU(PC) 연산에서 사용 +72 = 01001000 +57 = 00111001 -72 = 10110111 + 1 10111000 +57 = 00111001 -57 = 11000110 + 1 10111111
부호화 이진 가산(8-Bit) 부호화 가산(Positive S = 0) +30 = 0001 1110 +30 = 0001 1110 +75 = 0100 1011 +105= 0110 1001 부호비트를 갖는 이진 가산과 유사
1의 보수에 의한 감산 1의 보수를 더하고 캐리를 더함 +80 = 0101 0000 (+80) = 0101 0000 +80 = 0101 0000 (+80) = 0101 0000 -65 => 0100 0001 (+65) = 1011 1110 (1’s Comp 65) 10000 1110 + 1(end-around carry) 0000 1111 (+15) ‘End around carry’ 가산방법을 사용
2의 보수 감산 피감수에 2의 보수를 가산 +80 = 0101 0000 0101 0000 +65 = 0100 0001 +1011 1111 -65 = 1011 1110 +1 1 0000 1111 Discard Carry Bit from result
음수 결과 만약 감산을 위해 참 크기 형식으로 하면, 결과가 부정확해짐.(p228 참조) 만약 결과가 1의 보수 혹은 2의 보수로부터 얻고, 결과가 음(S=1) 이면, 크기는 결과를 보수화 하여 얻어진다.
음수 결과 예 2’s Complement Negative Result (65-80) +65 = 0100 0001 0100 0001 -80 = 1011 0000 (2’s C.) +1011 0000 1111 0001 Invert 0000 1110 Add 1 + 1 Final Result = -15 0000 1111 = 15(Neg.) 결과의 부호비트가 1이면 그것은 음수이고 2의 보수 형태이다.
부호화 수의 범위 N개의 크기비트를 갖는 양수의 범위는 0 to 2N - 1. 8-Bit 예 8 Bit Number Range is -2N <= X <= +2N - 1 or -128 to +127
부호 비트 오버플로우 Overflow: 합이나 차의 결과가 크기 비트로 표현될 수 있는 것보다 클 경우 부호화 이진수의 부호비트로 캐리가 에러가 되는 현상. 결과는 잘못된 양수나 음수가 된다.
잘못된 음수 오버플로우 8-Bit Addition +75 = 0100 1011 +96 = + 0110 0000 +75 = 0100 1011 +96 = + 0110 0000 1010 1011 Result is Negative (False) 두 양수를 더해서 결과가 +127 보다 클 경우 오버플로우가 발생한다.
잘못된 양수 오버플로우 8-Bit 두 음수의 가산 -80 = 1011 0000 (2’s comp. form) 0110 1111 Result is Positive(False) 두 음수의 가산결과, 8-비트 수의 범위(-128)를 초과하여 그릇된 양수가 얻어짐.
16진 가산 0에서 9 숫자의 범위를 갖는 십진 가산과 유사함. 예 F + 1 = 10 F + F = 1E
BCD Codes BCD(Binary Coded Decimal) 코드: 4-비트 이진 값으로 십진수를 표현하는데 사용하는 코드. 0-9에 대해서는 0000에서 1001가 대응되고, 1010에서 1111는 유효하지 않음. 각 비트 위치가 십진 가중치를 가지므로 일명 8421 코드라 함.
BCD 예 (4987)10 = 0100 1001 1000 0111 (BCD) (84)10 = 1000 0100 각 자리는 4-Bit 이진 그룹이다.
과잉(Excess)-3 코드 참 크기의 4-비트 이진 값에 3(0011)을 더해서 얻어지는 BCD 코드. 과잉-3은 자기보수(self complementing ) 코드이다. 만약, 과잉-3 수의 비트가 반전되면, 등가 십진수의 9의 보수가 된다. 과잉-3 코드는 십진연산을 디지털적으로 수행할 때 유용하다.
Excess-3 예 3 = 0011 + 0011 = 0110 = 6 in E-3. 1 = 0001 + 0011 = 0100 = 4 in E-3 9’s Complement of 1(0100 in E-3) = (9 - 1) = 8 If we take 1’s complement for 1011(8 in E-3 code). => 0100 Self Complement : /(E-3 code) = 9’s 보수)
Gray Code 그레이코드 비 가중치 코드고 연산코드가 아님; 즉, 비트 위치마다 가중 값이 없다. 그레이 코드의 중요한 특징은 한 코드 수와 다음 코드 수 사이에는 단지 한 비트만 변한다. Shaft position encoder(응용) 4-bit Gray code Decimal Binary Gray code Decimal Binary Gray code 0 0000 0000 8 1000 1100 1 0001 0001 9 1001 1101 2 0010 0011 10 1010 1111 3 0011 0010 11 1011 1110 4 0100 0110 12 1100 1010 5 0101 0111 13 1101 1011 6 0110 0101 14 1110 1001 7 0111 0100 15 1111 1000
그레이코드 변환 Binary-to-Gray code conversion MSB in the Gray code is the same as MSB in the binary number. Going from left to right, add each adjacent pair of binary code bits to get the next Gray code bit. Discard carries. Ex) 1 0 1 1 0 (Binary) (For 4-bit code g3 = b3 g2 = b3 xor b2 1 1 1 0 1 (Gray) g1 = b2 xor b1 g0 = b1 xor b0) Gray-to-Binary code conversion MSB in the Binary code is the same as MSB in the Gray code. Add each binary code bit generated to the Gray code bit in the next adjacent position. Discard carries. (For 4-bit code Ex) 1 1 0 1 1 (Gray) b3 = g3 b2 = b3 xor g2 b1 = b2 xor g1 1 0 0 1 0 (Binary) b0 = b1 xor g0)
ASCII 코드 American Standard Code for Information Interchange. 데스트 문자, 수, 구두점, 특수제어를 위해 7-비트의 수문자 코드 확장된 8-bit 형태가 더 넓게 사용된다. Table 6.5 참조
이진 가산기 Half Adder(HA): 두 비트를 가산하여 합과 캐리를 출력하는 회로. Full Adder(FA): 다른 반가산기 또는 전가산기로부터 캐리비트와 두 오퍼랜드 비트를 더하여 합과 캐리를 출력하는 회로.
반가산기 가산 이진 두 비트 가산규칙 Figure 6.1 Half Adder 0 + 0 = 00 0 + 1 = 01 1 + 1 = 10 Figure 6.1 Half Adder
반가산기 회로 기본 식 S = A xor B, C = A and B 여기서 S = Sum, C = Carry. 반가산기의 진리표 Figure 6.2 A B C S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
전가산기 반가산기에 CIN 을 더한다. 식은 다음과 같이 수정된다. C = ((A xor B) and CIN) or (A and B). S = A xor B xor CIN. 전가산기는 두개의 반가산기와 OR 게이트로 구성될 수 있다.
전가산기 회로 두개의 반가산기를 사용한 전가산기 회로 Figure 6.6
병렬 가산기 N-Bit Multiple Adder (FA Stages) A1 A S A2 A S AN A 0 CI CO CI CO CI B1 B B2 B BN B S1 S2 SN
리플 캐리(1) N-비트 병렬 가산기에서(FA Stages) 캐리출력은 마지막 단의 전가산기(FA_N)에서 발생한다. 이것을 리플캐리 가산기라 한다. 왜냐하면, 최종 캐리출력(Last Stage)은 LSB단으로 입력된 캐리입력 CIN이 리플되어 전파해 오기 때문이다. Figure 6.11
리플 캐리(2) 각 단은 CIN 에서 COUT 까지 하나의 AND Gate와 하나의 OR Gate의 전파지연을 가진다. 4-Bit 리플 캐리 가산기는 최종 COUT 까지 8 Gates(4 x 2 = 8)의 전파지연을 가진다. PC의 MPU 에서처럼 32-Bit 가산기는 대략 64 Gates의 지연을 보여준다.
캐리 예견(1) Fast Carry 또는 Look Ahead Carry: 최종 COUT 을 오퍼랜드 비트들(A1 ~ AN, B1 ~ BN) 로부터 직접 발생시키는 조합회로 망. • 리플캐리에서처럼 각 전가산기 단의 동작에 의존하는 것과는 다르다.
캐리 예견(2) 캐리 예견(Fast Carry)은 리플캐리에 비해서 작은 전파지연을 가진다. 4-비트 가산기 경우, 리플캐리는 8 게이트 지연이 있으나, 빠른캐리는 단지 3 게이트 지연이 있다. Cn = AnBn + Cn-1(An + Bn)
4-bit Fast Carry Circuit Fig. 6.12
2의 보수 감산기(1) 2의 보수 가산에 의한 감산의 개념은 병렬 전산기의 사용을 가능하게 한다. 이것은 감산을 위해 MPU ALU (Arithmetic Logic Unit)에서 사용할 수 있다. 감산동작은 감수의 보수에다 1을 더한 후, 피감수를 가산함으로 이루어 진다.
2의 보수 감산기(1) Fig. 6.14 Ex) 0101-0011 2’s comp. of “0011” 0011 +1 1101 0101(+5) + 1101(-3) 1 0010(+2) discard carry
2의 보수 감산기(2) 차 = A - B = A + (!B + 1). 이러한 동작은 B1 ~ BN 을 반전하고, LSB단의 CIN을 +5V에 연결한 N-비트 병렬 가산기에서 수행될 수 있다. 회로는 가산 또는 감산 동작을 선택적으로 수행하기 위해 수정될 수 있다. Figure 6.16
2의 보수 가/감산기 Fig. 6.15
구조적(Structured) VHDL 설계(1) 계층(Hierarchy): 일련의 계층(레벨)과 관련된 설계 엔티티의 그룹으로, 완전한 설계는 하위 부분들로 구성된 상부설계로 이루어진다. Component: 완전한 VHDL Design Entity 는 계층적 설계에서 상위 레벨 파일의 일부로 사용될 수 있다.
구조적 VHDL 설계(2) Port: VHDL 설계 엔티티 또는 컴포넌트에서의 입력이나 출력 Component Declaration Statement: VHDL 설계 엔티티에 사용되는 컴포넌트의 I/O 포트 이름을 정의하는 문. Component Instantiation Statement: VHDL 컴포넌트의 포트이름을 상위레벨의 VHDL 설계 엔티티의 포트이름, 내부신호, 또는 변수들에 사상시키는 문. 다음의 슬라이드는 하나의 전가산기 컴포넌트를 사용하여 4-비트 병렬 이진 가산기 VHDL 설계를 보여준다.
Figure 6.13 (4-bit parallel adder with ripple carry)
전가산기 VHDL 기본적인 전가산기 ENTITY full_adder IS PORT( a, b, c_in : IN BIT; c_out, sum : OUT BIT); END full_adder; ARCHITECTURE adder OF full_adder IS BEGIN C_OUT <= ((a XOR b) AND C_IN) OR (a AND b); SUM <= (a XOR b) XOR c_in; END adder;
계층적 VHDL 설계과정(1) 전가산기에 대한 독립적인 컴포넌트 파일(full_adder.vhd)은 컴파일러가 발견할 수 있는 폴더내에 저장되어야 한다.(말하자면, 라이브러리 경로상에) A component declaration statement 은 설계 계층의 최상위 레벨의 파일에 있어야 한다. A component instantiation statement 은 전가산기 컴포넌트의 각 사례에 대한 것이다. 컴포넌트를 사용한 설계 엔티티의 일반적인 형식은: ENTITY entity_name IS PORT ( input and output definitions); END entity_name; ARCHITECTURE arch_name OF entity_name IS component declaration(s); signal declaration(s);
계층적 VHDL 설계과정(2) BEGIN component instantiation(s); other statements; END arch_name; -- component declaration statement template COMPONENT __component_name GENERIC(__parameter_name : string := __default_value; __parameter_name : integer := __default_value); PORT( __input_name, __input_name : IN STD_LOGIC; __bidir_name, __bidir_name : INOUT STD_LOGIC; __output_name, __output_name : OUT STD_LOGIC); END COMPONENT;
계층적 VHDL 설계과정(3) -- component instantiation statement template __instance_name: __component_name GENERIC MAP (__parameter_name => __parameter_value , __parameter_name => __parameter_value) PORT MAP (__component_port => __connect_port, __component_port => __connect_port); Label(instance_name)는 컴포넌트 사례화문에서는 반드시 사용해야 한다.
4-비트 병렬 이진 가산기 Entity 4-비트 병렬 가산기 I/O Pins ENTITY add4par IS PORT( C0 : IN BIT; A, B : IN BIT_VECTOR(4 downto 1); C4 : OUT BIT; SUM : OUT BIT_VECTOR(4 downto 1)); END add4par; ARCHITECTURE adder OF add4par IS
4-비트 병렬 가산기 컴포넌트(1-Bit FA) 병렬 가산기를 위해 사용된 전가산기 컴포넌트 -- component declaration statement COMPONENT full-adder -- Previous FA Design File PORT( a, b, c_in : IN BIT; c_out, sum : OUT BIT); END COMPONENT SIGNAL c : BIT_VECTOR(3 downto 1) -- Internal signal used for intermediate carries
4-비트 병렬 가산기 컴포넌트로 1-비트 전가산기를 사용하여 4-비트 병렬 가산기를 생성한다. 기본 전가산기는 컴포넌트 사례화를 통해 4번 매핑된다. 예를들면, adder1, adder2, 등. 연결은 컴포넌트의 각 개체에 대해 포트맵(Port Map)으로 정의된다.
4-비트 가산기의 Structured Architecture(1) Mapping Type of Architecture BEGIN -- 4 component instantiation statements adder1: full_adder -- This defines the first component PORT MAP (a => A(1), b=> B(1), c_in => C0, c_out => C(1), sum=> SUM(1)); adder2: full_adder -- This defines the second component PORT MAP (a => A(2), b=> B(2), c_in => C(1), c_out => C(2), sum=> SUM(2)): adder3: full_adder -- This defines the third component PORT MAP (a => A(3), b=> B(3), c_in => C(2), c_out => C(3), sum=> SUM(3)); 복사 개체를 구분하기위해 사용해야 함.
4-비트 가산기의 Structured Architecture(2) Remaining part of the Architecture adder4: full_adder -- This defines the fourth component PORT MAP(a => A(4), b=> B(4), c_in => C(3), c_out => C4, sum=> SUM(4)); END adder; -- another component instantiation statement adder1 : full_adder PORT MAP (a(1), b(1), c0, c(1), sum(1)); adder2 : full_adder PORT MAP (a(2), b(2), c(1), c(2), sum(2)); adder3 : full_adder PORT MAP (a(3), b(3), c(2), c(3), sum(3)); adder4 : full_adder PORT MAP (a(4), b(4), c(3), c4, sum(4)); -- use the correct order originally defined
다른 구조 앞의 예는 4개의 전가산기 컴포넌트에 직접 매핑한 것이다. 다른 방법은 소위 VHDL에서 Generate Statement라 불리는 반복 루프(Repetitive Loop)를 사용한다. 이것은 지수(Index) I를 갖는 FOR Loop 와 유사하다. 양쪽 모두는 여전히 리플 캐리 가산기이다.
Generate Statement(1) 생성문은 하드웨어의 반복되는 부분을 생성하기 위해 사용된다. -- GENERATE statement template __generate_label: FOR __index_variable IN __range GENERATE __statement; END GENERATE; -- 4-bit adder VHDL code using generate statement ENTITY add4gen IS PORT( c0 : IN BIT; a, b : IN BIT_VECTOR(4 downto 1); c4 : OUT BIT; sum : OUT BIT_VECTOR(4 downto 1)); END add4gen; ARCHITECTURE adder OF add4gen IS
Generate Statement(2) -- COMPONENT declaration COMPONENT full_adder -- Previous FA Design File PORT( a, b, c_in :IN BIT; c_out, sum : OUT BIT); END COMPONENT SIGNAL c : BIT_VECTOR(4 downto 0) BEGIN c(0) <= c0; adders : FOR i IN 1 to 4 GENERATE -- easily expandable by changing the range adder : full_adder PORT MAP (a(i), b(i), c(i-1), c(i), sum(i); END GENERATE; c4 <= c(4); END adder;
4-bit 가/감산기(Adder/Subtractor)
4-비트 가/감산기 시뮬레이션
오버플로우(Overflow) 검출 1. 부호비트를 체크한다. - 만약 두 오퍼랜드의 부호비트가 같고, 합의 부호비트가 이들과 다르다면, 오버플로우가 발생한 것이다. - 표 6.9 참조 V = SASBSSUM + SASBSSUM 2. 캐리비트를 체크한다. - V = Cn XOR Cn-1, - 만약 V=1, 오버플로우(Fig. 6.22)
Fig. 6.21 오버플로우 검출기를 가진 8-비트 가산기
BCD 가산기 병렬 가산기의 출력인 합은 BCD(8421) 숫자를 나타내는 4-비트의 그룹이다. 기본 설계 개념은 A + B의 합 4비트를 생성하는 4 비트 병렬 이진 가산기이다. 합은 BCD 코드 변환기(Code Converter)의 4 비트 BIN 입력에 입력된다.
Fig. 6.23 BCD 가산기(1 1/2 Digit Output)
Fig. 6.26 BCD 가산기
BCD 가산기 VHDL -- bcd_add.vhd -- BCD adder, using 2 instances of the component add4par -- See Figure 6.26 for component interconnections. ENTITY bcd_add IS PORT( c0 : IN BIT; a, b : IN BIT_VECTOR(4 downto 1); c4 : OUT BIT; sum : OUT BIT_VECTOR(4 downto 1)); END bcd_add;
BCD 가산기 VHDL(계속) ARCHITECTURE adder OF bcd_add IS -- Component declaration COMPONENT add4par PORT( c0 : IN BIT; a, b : IN BIT_VECTOR(4 downto 1); c4 : OUT BIT; sum : OUT BIT_VECTOR(4 downto 1)); END COMPONENT; SIGNAL c4_bin : BIT; SIGNAL sum_bin : BIT_VECTOR(4 downto 1); SIGNAL a_bcd : BIT_VECTOR(4 downto 1); SIGNAL b_bcd : BIT_VECTOR(4 downto 1); SIGNAL c0_bcd : BIT;
BCD 가산기 VHDL(계속) BEGIN -- Instantiate 4-bit adder (binary sum) add_bin: add4par PORT MAP (c0 => c0, a => a, b => b, c4 => c4_bin, sum => sum_bin); -- Instantiate 4-bit adder (binary-BCD converter) converter: add4par PORT MAP (c0 => c0_bcd, a =>a_bcd, b => b_bcd, sum => sum); -- Connect components c0_bcd <= '0'; b_bcd <= sum_bin; a_bcd(4) <= '0'; a_bcd(3) <= c4_bin or (sum_bin(4) and sum_bin(3))or (sum_bin(4) and sum_bin(2)); a_bcd(2) <= c4_bin or (sum_bin(4) and sum_bin(3))or (sum_bin(4) and sum_bin(2)); a_bcd(1) <= '0'; c4 <= c4_bin or (sum_bin(4) and sum_bin(3))or (sum_bin(4) and sum_bin(2)); END adder;
복수자리(Multiple-Digit) BCD 가산기 Fig. 6.27 4 ½ Digit BCD Adder
BCD 코드 변환기 Code Converter는 표6.10 에서와 같이 4비트 가산기에 기초하여 설계된다. 완전한 설계는 그림6.26에서 보여진다. 코드 변환기에서의 가산기의 Ai 입력은 0000(C4 =0) 또는 0110(C4=1)로 고정된다. 0110은 오버플로우를 교정한다.
MAX+PLUS II 에서의 캐리 생성 - Global Project Logic Synthesis 1. FAST : A fast synthesis but a large gate size 2. NORMAL : A default synthesis 3. WYSIWYG : As synthesis a design without altering design format as possible Refer to Fig. 6.30 & Fig. 6.31 => We do not need to design an adder circuit to have a fast carry function - EXP(expander buffer) : shared logic expander in the same LAB (assign menu)
논리합성(Logic Synthesis) - Normal Device : EPM7032SLC44-5
논리합성 - WYSIWYG Device : EPM7032SLC44-5
SUMMARY I A Hierarchical VHDL Design To use a component in a VHDL design hierarchy, we require a design entity that defines the component declaration and component instantiation statements. For example: ENTITY entity_name IS PORT ( input and output definitions); END entity_name; ARCHITECTURE arch_name OF entity_name IS component declaration(s); signal declaration(s); BEGIN component instantiation(s); other statements; END arch_name; A Simple Port Map If all ports of a component are to be used in the same order as in the component definition in the original component design entity, the port map can simply contain the user names in the same order. For example: Adder1 : full_adder PORT MAP ( a(1), b(1), c0, c(1), sum(1));
SUMMARY II A Explicit Port Map If only a portion of the component ports are to be used or they are not used in the same sequence as they are declared, the port map must be more explicit. For example: adder1: full_adder PORT MAP (a => A(1), b=> B(1), c_in => C0, c_out => C(1), sum=> SUM(1)); A Generate statement can be used to instantiate multiple instances of a component. For example: label: FOR index_variable IN range GENERATE statement; END GENERATE; A Synthesis Strategy If you use ‘normal’ option, MAX+PLUS II will synthesize an adder to minimize carry delays.