Section 02 덧셈 회로 BCD 덧셈 회로 BCD 코드에서 십진수 (16)BCD = 0001 0101
Section 04 BCD 코드 BCD(Binary Coded Decimal) 코드 2진화 10진 코드라고 함 디지털 회로에서 10진수를 처리 할때 사용 10진수 (100)10을 BCD 코드로 변환하라. Tip) 상위 3비트 ‘0’을 생략하지 않도록한다. = (0001 0000 0000)BCD
Section 03 8진수와 16진수 10진수, 2진수, 8진수, 16진수에 대한 대조표
Section 02 덧셈 회로 2진 덧셈 결과가 16 이상일 경우에는 자리올림수가 ON이 되기 때문에 카르노 맵에서 구한 논리식에 [CY_OUT]을 OR함으로써 보정 조작을 위한 신호를 생성 (2진 덧셈결과의 10-15와 자리올림 16-19) 보정을 위한 신호의 논리식
Section 02 덧셈 회로 Revice : 보정출력단 신호
BCD 덧셈 회로의 VHDL 기술 Section 02 덧셈 회로 첫째단의 4비트 덧셈 회로의 출력(2진 덧셈 결과)은 [S] 첫째단의 4비트 덧셈 회로의 자리올림수 출력은 [CY_OUT] 보정 검출 회로의 출력은 [REVICE] 둘째단의 4비트 덧셈 회로의 B입력은 [ADDER1_BIN]
Section 02 덧셈 회로
Section 02 덧셈 회로 시뮬레이션 결과 (500[ns]부분) BCD 덧셈 회로의 입력 [A]= [9], [B]= [5], [CIN]=‘1’ 첫째단의 4비트 덧셈 회로의 [S]= [15], [CY_OUT]=‘0’ 보정 검출 회로의 출력 [REVICE]=‘1’ 둘째단의 4비트 덧셈 회로의 입력 [A]= [15], [B]= [6], [CIN]=‘0’ BCD 덧셈 회로의 덧셈 결과는, 10진수로 생각하면 [21], 2진수에서는 "10101"이므로, [BCD_COUT]=‘1’, [BCD_SUM]= [5]
Section 02 덧셈 회로
Section 02 덧셈 회로
Section 03 전가산기를 사용한 뺄셈회로 상위 비트에서 빌린 것(빌림수)을 가지고 다음 비트의 값을 뺄셈해 나가기 때문에, 4비트의 2진수 뺄셈 회로는 4개의 전감산기를 사용 4비트 뺄셈 회로의 VHDL 기술 (DIF=A-B-BIN, BR_OUT은 자리빌림)
Section 02 덧셈 회로 전가산기를 사용한 덧셈 회로와 전감산기를 이용한 뺄셈회로 비교
Section 03 전가산기를 사용한 뺄셈회로 600[ns]까지는 B=[0], BIN='0'이기 때문에 [A] 값이 그대로 [DIF]에 출력 600[ns]에서 A=[15], BIN='1'이기 때문에 BOUT='0', S=[14] 700[ns]에서는 [15-5-1(BIN)]로 BOUT='0', DIF=[9] 800[ns]에서는 [0-10]으로 BOUT='1', S=[6]
Section 03 전가산기를 사용한 뺄셈회로
Section 04 보수를 사용한 덧셈 뺄셈 회로 뺄셈 : A-B는 A에 B의 2의 보수를 더해서 구할 수 있음 [2의 보수]는 [1의 보수]에 [1]을 더해서 구할 수 있고, (01101)의 2의 보수는 (10010)+1 = (10011) [1의 보수]는 각 비트 자리의 '1'/'0'을 반전시킴으로써 구할 수 있음 (01101)의 1의 보수는 (10010) 덧뺄셈 동작 선택을 위해 EXOR 회로에서 제어신호인 [SUB]를 사용. 1의 보수의 입력 [SUB]='0' → 덧셈 동작 → 입력 [B]는 반전 불필요 [SUB]='1' → 뺄셈 동작 → 입력 [B]를 반전 2의 보수의 입력 4비트 덧셈 회로 [Adder4]의 [CY_IN]에 '1'을 접속 이 조작은 [B]를 반전했을 때, 즉, 뺄셈일 때만 필요한 조작이기 때문에 [CY_IN]에 [SUB]를 접속
Section 04 보수를 사용한 덧셈 뺄셈 회로
Section 04 보수를 사용한 덧셈 뺄셈 회로 보수를 이용한 덧셈뺄셈 회로의 VHDL 기술
Section 04 보수를 사용한 덧셈 뺄셈 회로
Section 04 보수를 사용한 덧셈 뺄셈 회로
Section 04 보수를 사용한 덧셈 뺄셈 회로 시뮬레이션 결과 300[ns]까지는 A= [0]이기 때문에 [B]값이 그대로 [ANS]에 출력 300[ns]에서는 A= [7], B= [7]이므로 [7+7=14]가 되지만, [ANS]에 표시되는 결과는 [-2]가 되는데 오버플로우가 발생 4비트로 표현할 수 있는 유부호 수치는 최대 +7까지이므로 그 이상의 값은 정상적으로 표현되지 않음 800[ns]에서는 A= [-7], B=[7], SUB='1'이므로 [-7-7=-14]가 되지만, [ANS]에 표시되는 결과는 [-2]가 되는데 오버플로우가 발생 4비트로 표현할 수 있는 유부호 수치는 최하 -8까지이므로 그 이하의 값은 정상적으로 표현되지 않음 1100[ns]에서는 A= [0], B=[-8], SUB='1'이므로 [0-(-8)=8]이 되지만, [ANS]에 표시되는 결과는 [-8]이 되는데 오버플로우가 발생 4비트로 표현할 수 있는 유부호 수치는 최대 +7까지 이므로 그 이상의 값은 정상적으로 표현되지 않음
Section 04 보수를 사용한 덧셈 뺄셈 회로 integer 형 변수에 의한 VHDL 기술
Section 04 보수를 사용한 덧셈 뺄셈 회로 integer 형 변수에 의한 VHDL 기술
Section 05 unsigned와 signed 연산 회로의 VHDL 기술에서는 2의 보수를 사용한 부호를 포함한 수치를 대상으로 할 경우와 부호를 포함하지 않는 수치를 대상으로 할 경우와는 다르기 때문에 주의가 필요 std_logic_vector 형으로 산술 연산을 할 때 부호 비트가 없는 연산을 한다면 use 문으로 패키지 [std_logic_unsigned]를 호출하고, 부호 비트를 추가하여 연산하면 패키지 [std_logic_signed]를 호출하는 것에 주의 2개의 패키지를 양쪽 모두 동시에 호출할 수 없음 부호 비트를 추가한 값과 부호 비트가 없는 값이 혼재할 경우에는 패키지 [std_logic_arith]를 호출
Section 05 unsigned와 signed
Section 05 unsigned와 signed ①: std_logic_vector를 unsigned로 덧셈 및 뺄셈을 할 경우에는 단순하게 비트끼리의 연산 ②: std_logic_vector를 signed로 덧셈 및 뺄셈을 할 경우에도 단순하게 비트끼리의 연산 단, 좌변과 우변의 비트 길이가 다를 경우에는 리스트 9.30의 *2와 같이 부호 확장이 필요 그림 9.31 : std_logic_vector를 unsigned로 덧셈했을 경우와 signed로 덧셈했을 경우 우변의 각 값의 비트수가 다를 경우는 unsigned와 signed로 동작이 다름 unsigned의 경우(그림 9.32) : 가장 큰 값의 비트수가 되도록 비트가 부족하고 있는 부분에 '0'을 부가 signed의 경우(그림 9.33) : 가장 큰 값의 비트수가 되도록 비트가 부족한 부분을 부호 확장
Section 05 unsigned와 signed
Section 05 unsigned와 signed ③,④: integer를 덧셈 및 뺄셈할 경우에는 unsigned에서도 signed에서도 단순하게 비트끼리 연산 ⑤: unsigned의 경우 [-연산자]에 의해 std_logic_vector를 부호 반전하면 오류가 발생 [A]가 std_logic_vector일 때, TEMP <= -A; 라고 기술할 수 없음 ⑥: signed의 경우에는 [-연산자]에 의해 std_logic_vector를 부호 반전할 수 있음 예를 들어, [A], [B]가 4비트이고 [B]가 [-6(“1010”)]일 때 A <= -B; 라고 기술하면 [A]에는 “0110”, 즉 [6]이 대입 좌변과 우변의 비트수가 다를 경우 부호 확장을 기술할 필요가 있음 예를 들어, [A]가 5비트이고 [B]가 4비트일 때 [A <= -B;]라고 기술한 것은 오류 발생 [A <= -('0' & B);]라고 기술하면 [B]가 [-6("1010")]일 때 [A]는 "10110", 즉, [-10]이 됨 부호 확장을 정확하게 기술하면, A <= -(B( 3 )& B); 가 되며, [A]에는 "00110", 즉, [6]이 대입 또, 부호 비트가 있는 값과 부호 비트가 없는 값이 혼재할 경우에 패키지 [std_logic_arith]를 호출했을 때에는, <= - signed (B( 3 )& B); 라고 기술
Section 05 unsigned와 signed ⑦, ⑧: integer의 경우에는, unsigned, signed 모두에서 [-연산자]에 의해 부호 반전 ⑨: unsigned의 경우에는, std_logic_vector, integer 모두에서, if 문 등의 조건식의 literal 값은 +값에 대해서만 유효 예를 들어, [A]가 4비트인 경우, unsigned로 [A]가 취할 수 있는 값은 [0]~ [+15]이기 때문에, if 문으로 아래의 경우 순차문 1은 실행안되고 2만 실행된다. if (A < 0) then 순차문1; else 순차문2; end if; ⑩: 비트가 있는 값과 부호 비트가 없는 값이 혼재할 경우에 패키지 [std_logic_arith]를 호출했을 때 unsigned에서는 if (unsigned (A) < 0) then signed에서는 if (signed (A) < 0) then 와 같이 기술한다.
Section 05 unsigned와 signed conv_integer 함수로 std_logic_vector 형을 integer 형으로 변환하면 부족한 비트에 '0'을 추가해서 변환 integer의 비트 길이는 32비트인 것에 주의 (그림 9-34) ⑫: signed의 경우 conv_integer 함수로 std_logic_vector 형을 integer 형으로 변환하면 부호 확장을 포함해서 변환 (그림 9-35) 부호 비트가 있는 값과 부호 비트가 없는 값이 혼재할 경우에 패키지 [std_logic_arith]를 호출했을 때는, unsigned에서는 TEMP <= conv_integer (unsigned (A)); signed에서는 TEMP <= conv_integer (signed (A)); 로 기술한다. ⑬, ⑭: conv_std_logic_vector 함수로 integer 형을 std_logic_vector 형으로 변환하면 unsigned에서도 signed에서도 정해진 비트 수로 잘라서 std_logic_vecor 형으로 변환
Section 05 unsigned와 signed