회로의 제작 방법
회로의 제작 방법
이 글은 ALH Advent Calendar 2019 16일째 글입니다.
개요
이 기사는 컴퓨터의 가장 기초적인 부분이지만 평소 잘 인식하지 못하는 요소인 디지털 회로와 아날로그 가능한 HDL을 소개했다.
사전 준비
디지털 회로를 이해하기 위해 원래 디지털 회로를 직접 조립하거나 FPGA를 사용해 실험하는 것이 좋을 수 있었으나 이번에는 예산과 시간 관계로 앞서 설명한 휴대용 PC로 간단하게 재현할 수 있는 HDL과 하드웨어 시뮬레이터를 사용해 아날로그 조립을 했다.
나중에 HDL 및 하드웨어 에뮬레이터에 대해 설명합니다.
먼저 PC에서 Java를 실행 가능하게 만듭니다.
이후 하드웨어 시뮬레이터 등이 장착된 Nand 2Tetris를 사용 가능한 상태로 변경합니다.
링크 페이지의 Download the Nand 2tetris Software Suite에서 파일을 다운로드하고 적절한 위치에서 펼치면 됩니다.
PC 환경에 따라 tools 디렉터리 바로 아래HardwareSimulator.sh
또는 HardwareSimulator.bat
를 실행하면 다음과 같은 화면이 나타납니다.이것은 HDL 언어의 시뮬레이터입니다.
상기 파일에는 컴파일러, 가상 기기 시뮬레이터 등도 포함되어 있지만 본 보도의 범위 내에서 사용되지 않는다.
이른바 디지털 회로
디지털 회로는 어떤 이산값의 전위를 정보로 표시하는 전자 회로의 일종이다.
그 목적은 특정한 한도값에 따라 주어진 전위의 높낮이를 판단하여 L/H, 0/1, 가짜/진으로 표현하고 입력한 값에서 회로의 연산을 통해 출력을 얻는 것이다.
내용은 반도체로 만들어졌지만 물리적 구조가 본 원고의 범위와 떨어져 있기 때문에 설명하지 않는다.AND
,OR
와NOT
는 기본 논리 회로이며 디지털 회로를 구성하는 기초 부품이다.
진리치표로 각 회로의 입력값에 대응하는 출력값을 표시하다.AND回路
입력 1
입력 2
출력
0
0
0
0
1
0
1
0
0
1
1
1OR回路
입력 1
입력 2
출력
0
0
0
0
1
1
1
0
1
1
1
1NOT回路
입력
출력
0
1
1
0
nannd 2 tetris에서 이러한 기본 논리 회로는 특별히 설계하지 않아도 사용할 수 있습니다.
HDL
위에서 말한 바와 같이 디지털 회로는 배선 반도체 등을 통해 제작해야 하지만, 이 경우 실제 제작하지 않으면 제대로 작동하는지 알 수 없다.따라서 컴퓨터 언어로 이런 디자인HDL(Hardware description language)
을 설계할 수 있다.
프로그래밍 언어와 유사성은 있지만 실제로는 다르다.
HDL에서 설명하는 회로 구조를 시뮬레이터로 확인할 수 있습니다.
HDL에도 다양한 언어가 존재하지만, 지금은 VHDL과 Verilog HDL이 주류로 자리 잡고 있다.
이루어지다
HDL 및 Nand2Tetris를 사용하여 예제 회로를 소개합니다.
XOR
다음은 XOR 회로를 HDL로 나타낸 것입니다.
위에서 말한 바와 같이 AND, OR, NOT의 기본 논리 회로는 처음부터 사용될 수 있기 때문에 그것들을 잘 연결하여 목적 회로를 설계할 수 있다.
XOR.hdlCHIP Xor /*(1)*/{
IN a, b; //(2)
OUT out; //(3)
PARTS: //(4)
Not(in=a, out=nota); //(5)
Not(in=b, out=notb);
And(a=a, b=notb, out=w1);
And(a=nota, b=b, out=w2);
Or(a=w1, b=w2, out=out);
}
번호 매기기
개요
1
설계된 회로 이름 선언
2
링크 입력
3
링크 출력
4
다음은 회로의 내부 구조PARTS
를 설명한다.
5
기본 논리 회로로 전달되는 입력을 표시하고 출력을 적절하게 연결하여 회로를 설계한다
이번 회로는 회로도로 표시하면 다음과 같다.
또한 대응하는 테스트 스크립트는 다음과 같다.
XOR.tstload Xor.hdl, \\(1)
output-file Xor.out,\\(2)
output-list a b out;\\(3)
set a 0, set b 0,\\(4)
eval, output;\\(5)
set a 0, set b 1,
eval, output;
set a 1, set b 0,
eval, output;
set a 1, set b 1,
eval, output;
번호 매기기
개요
1
테스트 회로 선언
2
출력 테스트 결과를 설명하는 파일
3
출력 테스트 결과의 내용 성명
4
입력 값 선언
5
주어진 입력값에 회로도를 적용하여 출력하다.
테스트의 실행 절차는 다음과 같다.
번호 매기기
개요
1
로드 테스트 회로
2
테스트 스크립트 불러오기
3
실행
이 테스트를 실행하면 다음 출력 파일을 얻을 수 있습니다.
XOR.out| a | b |out|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
이 결과는 XOR 회로와 동일하기 때문에 회로가 정확하게 실현되었음을 알 수 있다.
다중 복용기
マルチプレクサ
는 두 개 이상의 입력에서 하나의 출력을 얻을 수 있는 회로로 선택기를 사용하여 어떤 입력 값을 출력 값으로 제어한다.
두 입력의 단순 복용기가 기대하는 진리 값표는 다음과 같다.
in a
in b
선택기
out
0
0
0
0
0
1
0
0
1
0
0
1
1
1
0
1
0
0
1
0
0
1
1
1
1
0
1
0
1
1
1
1
HDL로 표시하면 다음 코드를 사용할 수 있습니다.
여기에 국한되지는 않지만 설치 방법은 하나가 아니다.
multiplexer.hdlCHIP multiplexer{
IN a, b, sel;
OUT out;
PARTS:
Not(in=sel, out=notsel);
And(a=a, b=notsel, out=sela);
And(a=sel, b=b, out=selb);
Or(a=sela, b=selb, out=out);
}
반가법기
반가법기는 두 자리의 합을 구하여 마지막 자리와 이전 자리의 두 출력을 얻는다.
진리 값표는 다음과 같다.
in a
in b
디지털 상승
마지막 비트
0
0
0
0
0
1
0
1
1
0
0
1
1
1
1
0
반가법기가 HDL로 표시될 때 다음과 같은 코드가 된다.
halfadder.hdlCHIP halfadder{
IN a, b;
OUT carry, sum;
PARTS:
Or(a=a, b=b, out=sum);
And(a=a, b=b, out=carry);
}
또 반가법기 두 개를 사용해 전가법기를 만들 수도 있다.
총결산
우선 간단한 조합회로만 소개했고, 당연히 순서회로도 실현할 수 있다.
평소에는 깨닫지 못했지만 이런 것들에 눈을 돌리면 새로운 발견이 있을 수 있어 흥미롭다.
참고 문헌
Noam Nisan, Shimon Schoocken 저, 사이토 강이역, (2019) "컴퓨터 시스템의 이론과 실장-현대 컴퓨터의 제작 방법"Oray Japan
Reference
이 문제에 관하여(회로의 제작 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haseesah/items/84355faaa8fb6f6e2cba
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
CHIP Xor /*(1)*/{
IN a, b; //(2)
OUT out; //(3)
PARTS: //(4)
Not(in=a, out=nota); //(5)
Not(in=b, out=notb);
And(a=a, b=notb, out=w1);
And(a=nota, b=b, out=w2);
Or(a=w1, b=w2, out=out);
}
load Xor.hdl, \\(1)
output-file Xor.out,\\(2)
output-list a b out;\\(3)
set a 0, set b 0,\\(4)
eval, output;\\(5)
set a 0, set b 1,
eval, output;
set a 1, set b 0,
eval, output;
set a 1, set b 1,
eval, output;
| a | b |out|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
CHIP multiplexer{
IN a, b, sel;
OUT out;
PARTS:
Not(in=sel, out=notsel);
And(a=a, b=notsel, out=sela);
And(a=sel, b=b, out=selb);
Or(a=sela, b=selb, out=out);
}
CHIP halfadder{
IN a, b;
OUT carry, sum;
PARTS:
Or(a=a, b=b, out=sum);
And(a=a, b=b, out=carry);
}
Reference
이 문제에 관하여(회로의 제작 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/haseesah/items/84355faaa8fb6f6e2cba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)