2015년도 제2학기기초회로실험Ⅱ기초회로실험Ⅱ실험19. 카운터 회로담당교수 : 교수님학 부 : 전자공학부학 번 :이 름 :실 험 조 :제 출 일 : 2015. 10. 28실험제목 : 카운터 회로실험목적 : (1) 비동기식 카운터의 구조와 동작원리를 이해한다.(2) 동기 계수기의 구조와 동작을 이해한다.(3) 임의의 mod 동기 계수기를 설계하는 방법을 익힌다.(4) 증계수, 감계수 및 증/감계수의 논리를 이해한다.실험준비물(1) SN7400(2) SN7404(3) SN7408(4) SN7411(5) SN7421(6) SN7472(7) SN7476(8) SN7490(9) SN74169(10) Power supply, Oscilloscope, Function Generator예비과제(1) 비동기식 카운터(Asynchronous counter)의 원리를 설명하라.⇒ ‘비동기식 카운터’는 첫 단의 플립플롭에 클럭 신호가 인가되어 이 플립플롭의 출력이 다음 단의 플립플롭을 트리거 시키도록 되어 있는 회로를 말한다. 클록 펄스가 플립플롭 A의 CLK에 입력되는데 이 CLK가 falling edge일 때 플립플롭 A가 반전되며, 이때 모든 플립플롭은 J=K=1이 된다. 플립플롭 A의 정상출력이 플립플롭 B의 CLK입력이 되는데 A의 출력이 1→0이 되면 B가 반전될 것이다. 마찬가지로 B가 1→0이 될 때마다 C가 반전될 것이다. 여기서 모든 플립플롭이 CLK입력과 정확히 일치하게 변하지 않으므로 연결된 플립플롭들 간의 응답에 지연이 발생하며, 이러한 시간지연은 보통 플립플롭 당 5~20ns 정도이다.(2) 비동기식 카운터의 장단점을 열거하라.⇒ 장점 : 동기식 계수기에 비해 간단히 만들 수 있다.단점 : 플립플롭의 전파지연시간은 종속 접속된 플립플롭의 수만큼 누적되어 최종 단의 출력에 나타나므로 계수속도가 느리다.(3) 비동기식 카운터에서 클럭펄스의 주파수가 높아지면 어떠한 현상이 일어날 것인가를 예측하라.⇒ 비동기식 카운터의 단점이 플립플롭의 전파지연시간이 누적되어 계 대입하여 2진수라고 생각하고 10진수로 변환하면 그 값이0000 (0) → 0001 (1) → 0010 (2) → 0011 (3) → ... 순으로 바뀌게 되는 것을 확인할 수 있다.(5) JK플립플롭을 이용한 동기식 감산 16진 카운터를 설계하고 각 지점의 파형을 도시하라.⇒ 감산카운터는 입력 신호가 들어갈 때마다 내용이 하나씩 줄어드는 방식의 카운터이다.시뮬레이션 값을 보면, A→B→C→D 순으로 하나씩 줄어드는 것을 확인할 수 있다.(6) 리플캐리 감산 16진 카운터를 설계하라.⇒ 리플캐리 카운터는 플립플롭의 입력과 출력을 모아서 다음 단 플립플롭의 J,K 입력으로 넣어 주도록 구성된 회로이고, 감산 카운터는 입력신호가 들어갈 때마다 하나씩 내용이 줄어드는 방식의 카운터이다.회로에서도 플립플롭 A의 출력이 플립플롭 B의 입력으로 들어가는 것을 확인할 수 있다.(7) 회로에 대해 다음의 입력파형에 대한 FF의 출력 Q[3:0]를 그리고, 기본 ring 계수기에 비해 어떤 장점이 있는지 설명하시오. (단, 입력 CLK의 주기는 100ns이다.)⇒ 링계수기는 두 상태를 선택하는 논리 소자가 여러 개 고리 모양으로 이어진 것이고,JK플립플롭으로 구성된 링카운터는 초기에 1을 첫 번째 플립플롭으로 프리셋하거나, 플립플롭의 나머지를 클리어 시키지 않고, 시동 시 시동펄스를 주는 것이 아니라 모든 플립플롭을 클리어 시킨후 클럭을 주어서 계수하는 회로이다.(8) 8진 비동기식 up카운터를 D플립플롭을 이용하여 설계하라.⇒ UP Counter란 최댓값이 되기 전까지는 Up으로 카운터가 되고, 마지막에는 Carry가 발생하면서 출력 값은 모두 00으로 되는 회로이다.(9) down 카운터에 대해 다음의 입력파형에 대한 FF의 출력 Q[3:0]를 그리고, 출력이 15-0까지 10진수로 감소하도록 나타내어라. (단, MyCad의 ‘시그널 합치기...’를 이용한다. 입력 CLK의 주기는 40ns이다.)⇒ Down 카운터는 최소값(00)이 되기 전까지는 Down 카운터가 되1**************************01**************************0**************************00*************06⇒ JK플립플롭을 이용하여 up카운터를 설계한 것이다. 중간에 B와 D ( ABCD에서 )를 ABCD의 클리어에 연결하여 1010이 되면, 리셋되서 0부터 10까지만 카운터 되도록 설계되어있다.(3) SN7476과 7408을 사용하여 다음의 리플캐리 방식의 4단 병렬 계수회로를 구성하라. 먼저 CLEAR를 시킨 후 push ON/ release OFF S/W(예비지식 “입력신호”참조)로 CLK 신호를 가하라. 이때⇒ JK플립플롭 이용하여 Up카운터를 설계한 것인데, 4개의 플립플롭이 모두 같은 클럭 입력을 받아서 작동하는 동기식 카운터이다.클럭의 수DCBA10진수*************00****************************************************0(4) 다음의 상태 천이표를 가지고 JK플립플롭(SN7476)으로 회로를 구성하고 와 결과를 비교하라.상태CBA10진수00**************************15⇒ Up 카운터이고, 마지막 플립플롭의bar{Q}가 두 번째 플립플롭의 J입력에 들어가기 때문에, 101 (10진수 5)까지만 카운터 된다.(5) 의 회로를 구성하고 CLR을 Low에서 High로 하고, CLK를 16번 인가하여 출력상태를 기록하라.클럭의 수DCBA10진수*************00*******************************************************************************************151600000⇒ JK플립플롭 이용하여 Up카운터를 설계한 것인데, 4개의 플립플롭이 모두 같은 클럭 입력을 받아서 작동하는 동기식 카운터이다.(6) 의 회로를 구성하고, CLR을 Low에서 High로 하고, CLK를 16번 인가하여 출력상태를 기록하라.⇒클럭의 수DCBA10진수0000는 어떤 상태로 변하는가?⇒0DCBA10진수***************************************0****************************************************10*************00JK플립플롭으로 DOWN 카운터를 구현한 것이다. 15→0 까지 차례로 카운트 된다.(9) 다음 회로를 구성하라.CK는 push on/release off, X는 push on/push off(예비지식 “입력회로” 참조)를 사용하고 이때 X, A, B의 출력을 LED로 관찰하라. X=1로 두고 BA=10 될 때까지 증계수하고, 현상태에서 X=0로 두고 BA=00가 되도록 감계수하라. 다시 X=1로 하고 X를 바꾸는 순간 어떤 현상이 생기는가?(10) 은 회로를 클럭에 동기시켜 확장시킨 회로이다. 입력 X 및 클럭의 신호구성은 실험 2와 동일하다. 먼저 회로를 리세트 시키고 X=1로 하여 CBA = 111 까지 증계수하라. X=0로 하고 감계수하여 각각의 상태를 작성하라. 증/감계수 동작 중에 X=1→0로, X=0→1로 변환시키고 결과를 관찰하라.(11) 다음 회로를 구성하라.① CLR을 1Hz로 하고 LED로 QA, QB, QC, QD의 출력을 관찰하라.CLKQDQCQBQA10진수1 HZU/D = 100***************************************0***************************************111151 HZU/D = **************************0**************************1*************0*************100000② U/D의 신호에 따라 계수기의 상태를 결정하고, (U/D를 Q에 연결) 이때의 상태도를 나타내라.⇒ (1) down counter 동작.(2) 클락은 1HZ이기 때문에 빠른 동작으로bar{Q}와 Q의 위치를 바꿔주면 다운카운터로 동작하던 0번째까지 온 상태에서 바꿔주었기 때문에 다음 상태는 1001(9설계하시오. 출력이 3, 6, 9일 때, 출력이 siren=1이 되는 회로를 설계하시오.⇒ Mod-10 counter를 만들고서 3, 6, 9를 만족하는 (0011, 0110, 1001)을 AND로 묶고 다시 OR으로 묶어서 출력 siren을 확인하면 된다.(6) Conveter belt에서 생산되는 모든 제품이 출하 검사된다. 이때, 생산되는 제품수와 불량품 수를 알려주는 카운터를 설계하시오. 이때, 하나의 제품이 출하될 때, X=1인 펄스가 발생하고, 불량품이 발견되었을 때 Y=1인 펄스가 발생한다. 단, 생산제품수와 불량제품수는 최고 15이라고 가정하라. (준비물 : SN7476)(7) 실험 2에서 CLK 입력이 어떤 상태일 때 A=B=C=D=0의 clear가 되는가? 어떤 계수기로 동작하는가?⇒ CLK가 10번째 들어갔을 때 clear되는데, 그 이유는 clear가 B=D=1일 때 동작하므로 ABCD=0101 (10진수로 10)에서 clear가 0이 되므로 그 순간에 각 플립플롭은 모두 0이 되면서 clear가 된다. 그래서 이 회로는 MOD-10카운터로 동작한다. 또한 처음 플립플롭의 입력 클럭 값이 각각의 CLK로 들어가는 것이 아니라 처음 플립플롭의 결과 값이 다음 플립플롭의 CLK로 들어가는 것이기 때문에 비동기식이다.(8) 실험 2의 회로를 변경하여 Mod-8의 회로를 그려라.⇒ Mod-10회로에서는 각각의 클리어에 각자리수의 조합이 10( 1010 )이 되는 값을 넣었을 때 0000으로 set이 되게 하였다. Mod-8회로는 8 (1000) 이되었을 때 0000으로 set이되게 하여 D의 값이 1이 되었을 때 CLR에 값을 넣게 하였다.(9) CLEAR, PRESET은 CLK=0에서 동작시키는 것이 바람직한 이유는? 이들 두 입력간에는 synchronous 및 asynchronous 중 어떤 관계에 있는가?⇒ 기본적인 CLEAR와 PRESET의 동작을 보게 되면 플립플롭을 0 또는 1로 초기화한다.CLK는 1상태로 동작하게 되면, CLK가 0난다.
백준 7568번 (덩치) 문제 풀이 및 소스 코드 - C++◆ 문제우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.◆ 입력첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.◆ 출력여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다.◆ 제한2 ≤ N ≤ 5010 ≤ x, y ≤ 200◆ 예제 입력 1555 18558 18388 18660 17546 155◆ 예제 출력 12 2 1 2 5◆ 풀이덩치 문제는 입력받은 N명의 사람간의 몸무게와 키를 비교하여, 몸무게와 키가 모두 클 경우만 덩치가 크다라고 하였을 때의 덩치 순위를 매기는 문제입니다.우선, 입력받을 수 있는 N의 최댓값 크기 50의 배열 3개를 만듭니다. 몸무게, 키, 그리고 패배점수를 기록 하기위한 배열입니다. 순위를 역순으로 생각하면 승점이 된다는 것을 생각한다면, 순위를 그대로 바라봤을 때는 패배점수라고 이야기할 수 있습니다. 이 부분이 이 문제의 핵심이며, 구현은 어렵지 않습니다. (패배점수가 0일 때, 0위가 아닌 1위이므로, 패배점수의 모든 값에 1을 더해줍니다.)
백준 2231번 (분해합) 문제 풀이 및 소스 코드 - C++◆ 문제어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.◆ 입력첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.◆ 출력첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.◆ 예제 입력 1216◆ 예제 출력 1198◆ 풀이분해합 문제는 처음 문제를 보면 생소할 수 있지만, 예제 입/출력을 보면 이해하기 쉬운 문제로, 출력된 값의 각 자리수와 출력된 값의 합이 입력 값이 되는 값 중 가장 작은 값을 구하는 문제입니다.우선 분해합은 “생성자“ + “생성자의 각 자릿수의 합”으로 이루어져 있습니다. 이 부분을 잘 생각해보면, 생성자의 각 자릿수의 최댓값은 9이므로 1부터 분해합-1까지의 모든 수의 분해합을 계산하며 비교하는 것이 아니라, 생성자의 자릿수 x 9 만큼을 분해합(입력 값 N)에서 뺀 값부터 분해합-1까지의 수에 대하여 분해합을 계산하여 비교하면 비교할 수가 많이 줄어들게 됩니다.이 부분만 생각한다면, 구현은 자릿수를 구하고, 배열에 저장하는 반복문의 구현과 생성자로 분해합을 계산하여 입력 값 N과 비교하는 조건문을 구현하여 문제를 해결할 수 있습니다.◆ 소스 코드#include using namespace std;int main() {int N;// 분해합을 입력받음int a[8] = { 0 };// 생성자의 각 자릿수를 저장할 배열 acin >> N;// 분해합 N 입력int num = 0;// 분해합의 자릿수를 num에 저장for (int i = N; i > 0; i = i / 10) {// 자릿수를 구할 때는 i를 10으로 나누는 형태의 for문을 사용a[num] = i % 10;// 각 자릿수를 배열 a에 저장num++;// for문이 동작할 때마다 num+1}int start = N - num * 9;// N에서 자릿수x9를 뺀 수부터 확인하면 됨
백준 2798번 (블랙잭) 문제 풀이 및 소스 코드 - C++◆ 문제카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.◆ 입력첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.◆ 출력첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.◆ 예제 입력 15 215 6 7 8 9◆ 예제 출력 121◆ 예제 입력 210 50093 181 245 214 315 36 185 138 216 295◆ 예제 출력 2497◆ 풀이블랙잭 문제는 모든 경우의 수를 계산하며 조건에 맞는 값을 출력하는 문제입니다.이런 모든 경우의 수를 계산하는 문제는 for 반복문을 잘 사용하면 됩니다. for문을 사용하기 전에는 입력의 범위를 확인하여, 반복되는 횟수가 너무 많아 컴파일 에러가 발생하지 않는지를 미리 확인하여, 다른 방법으로 구현해야하는 문제는 아닌지 확인해야 합니다.카드의 모든 값을 저장하는 배열 a의 크기는 N의 최댓값 100에 +1을 한 101으로, 선택한 3개 카드의 합을 저장할 배열은 최댓값 100개의 카드 중 3개를 선택할 경우의 수인 100C3+1을 하여 100x99x98/3x2x1 +1 = 161701로 크기를 설정합니다.우선 카드의 합은 카드 3개를 고르는게 고정이니, 3중 for문을 활용합니다. 또한 중복으로 카드를 선택할 수 없으니, 처음 for문은 0에서부터 시작하지만, 2번째 for문은 1, 3번째 for문은 2에서 시작합니다. 즉, 가장 바깥쪽 for문의 시작 값 +1부터 시작해도 된다는 것을 파악해야 합니다. 합의 값은 뒤에서 M과 가장 가까운 값을 구하기 위해 배열 b에 저장합니다.저장된 배열 b는 또다시 for문을 이용하여 어떤 값이 가장 M에 가까우면서도 M보다 작은 값인지 if문으로 조건을 판단하며 계산합니다.이렇게 조건문으로 걸러진 합 sum을 출력하면서 문제를 해결합니다.◆ 소스 코드#include using namespace std;int main() {int N, M;// 카드의 개수 N, 최댓값 Mint a[101];// 입력받은 카드 값을 저장할 배열int b[161701];// 선택한 3개 카드의 합을 저장할 배열 (100C3+1)cin >> N >> M;// N, M 입력 받음for (int i = 0; i < N; i++) {// N개 카드의 값 입력 받음cin >> a[i];// 배열 a에 저장
◆ 문제피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.n=17일때 까지 피보나치 수를 써보면 다음과 같다.0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.