나는 전자 제품에서 시작하고 이미 매료되었습니다. 지난 며칠 동안 Arduino와 함께 연주 한 이진은 + 5V 표시 1
및 GND 표시와 같은 서로 다른 전압을 나타냅니다 0
.
물리적 인 수준에서 마이크로 컨트롤러가 어떻게 이진 전압을이 전압으로 변환하는지 알아 내려고 노력했습니다. 어디에서나 설명을 찾을 수 없습니다. 누구든지 자신의 지식을 공유하거나 이것이 어떻게 작동하는지 설명하는 좋은 장소 / 책을 알려줄 수 있습니까?
나는 전자 제품에서 시작하고 이미 매료되었습니다. 지난 며칠 동안 Arduino와 함께 연주 한 이진은 + 5V 표시 1
및 GND 표시와 같은 서로 다른 전압을 나타냅니다 0
.
물리적 인 수준에서 마이크로 컨트롤러가 어떻게 이진 전압을이 전압으로 변환하는지 알아 내려고 노력했습니다. 어디에서나 설명을 찾을 수 없습니다. 누구든지 자신의 지식을 공유하거나 이것이 어떻게 작동하는지 설명하는 좋은 장소 / 책을 알려줄 수 있습니까?
답변:
KellenJB의 답변 중 일부를 약간 다른 방식으로 다시 말하고 싶습니다.
이진 1과 0에서 5 V와 0 V와 같은 전압으로의 변환은 없습니다. 마이크로 컨트롤러 또는 물리적 회로는 전압에서만 작동합니다.
회로가 어떻게 작동하는지에 대한 우리의 마음에 단순화 된 모델을 형성 할 때 우리의 머리에서이 전압은 이진수 1과 0으로 "변환"됩니다.
실제로 발생하는 "전환"은 없습니다. 이진수 1과 0은 기본 전압의 가상 표현 일뿐입니다. 실제로, 많은 시스템에서 고전압은 0을 의미하지만 저전압은 1을 의미합니다. 이것이 수행되는 몇 가지 이유가있을 수 있지만 아마도 더 일찍 이것으로 뛰어들 수 있습니다.
논리에서 무슨 일이 일어나고 있는지 이해하려면 아마도 트랜지스터를 살펴 보는 것이 가장 좋습니다. 트랜지스터는 많은 용도로 사용될 수 있지만 간단한 수준에서는 스위치로 취급 할 수 있습니다. 개념적으로 벽의 전등 스위치처럼 생각할 수 있지만 스위치를 물리적으로 움직여 제어하는 대신 전류의 변화에 의해 제어됩니다. 조명을 1로, 조명을 0으로 취급 할 수 있습니다. 이제이 스위치를 다양한 세트로 결합하여 AND, OR, NOR 등의 다른 논리 요소를 만들 수 있습니다.
내 답변이 끔찍하게 자세한 것은 아니지만 귀하의 질문에 대한 답변이 되었기를 바랍니다. 더 많은 설명이 필요하면 더 자세한 내용을 기꺼이 추가 할 것입니다. 압도하고 싶지 않습니다.
짧은 대답은 "변환"하지 않으며 전압 은 이진 (또는 그 표현)입니다. 종이에 숫자를 쓰듯이, 마크는 숫자를 나타내거나 주판을 세는 것처럼 돌 위치는 숫자를 나타냅니다.
이진수는 10 진수 (또는 8 진수, 16 진수 등)와 같은 숫자 체계입니다.
10 진수 (base-10)에는 10 개의 기호가 있지만 (0123456789) 2 진수 (base-2)에는 2 개의 숫자 만 있습니다 (01)
10 진법 10은 10 ^ 1 = 10을 의미하고 2 진법은 2 ^ 1 = 2를 의미합니다. 다음에 10 진법의 100은 10 ^ 2 = 100을 의미합니다. 이진수로 2 ^ 2 = 4를 의미합니다.
그들은 단순한 0과 1 (또는 OFF / ON)로 표시 할 수있는 바이너리 선택, 그래서 전자는 가능하지만 복잡 될 사용하여 소수점을 표현하기 위해
시스템의 변화는 원 같은 (3 주),이에 있었다 및 코스의 컴퓨팅 아날로그 . 트랜지스터 이전에는 기계식 펀치 카드 기계가있었습니다 (Google은 시간이 있다면 매우 흥미로운 독서를 많이 알고 있습니다)
초기 바이너리 디지털 컴퓨터는 실제 스위치 (전자 릴레이)로 만들어졌습니다. 추제 Z3는 (1941) 예입니다 :
이 진공관을 릴레이 대신에 사용한 후 (기계식 부품이 없어도 더 빨리 전환 할 수 있음) 릴레이 대신 전환을 수행했습니다. ENIAC은 진공관 만든 초기 컴퓨터의 일례이다.
그런 다음 60 년대에 트랜지스터가 IC에 도착했습니다. 트랜지스터는 릴레이 / 밸브가 초기 기계에서와 동일한 기능을 수행하지만 훨씬 작고 빠르며 전력 소비는 적었습니다.
이진 컴퓨터 회로가 작동하는 기본 방식에 대한 실제 이론은 수학에서 숫자를 조작하는 방식을 변경하지 않은 것처럼 전혀 변경되지 않았습니다. 알고리즘은 개선되지만 기본 규칙은 동일하게 유지됩니다.
따라서 바이너리가 어떻게 작동하는지 알고 있고 1 또는 0을 두 개의 서로 다른 전압 레벨 (예 : 5V 및 0v)로 저장할 수있는 간단한 회로와 AND 및 OR과 같은 간단한 논리 기능을 수행 할 수있는 다른 간단한 회로가있는 경우 더 복잡한 작업을 수행하기 위해 모두 결합 할 수 있습니다. 모든
이후 이진 회로는 가장 기본적인 스위치 일 뿐이 기계식 / 릴레이 / 밸브 / 트랜지스터 /?와 같은 두 가지 상태를 번갈아 가며 사용할 수 있습니다.
숫자를 이진수로 저장하는 예제를 제공하기 위해 8 개의 스위치가 있다고 가정합니다 (중요하지 않은 유형)
1은 5V로, 0은 0V로 표현됩니다.
숫자 123을 저장하고 싶습니다.
십진수에서는 123 = (1 X 10 ^ 2) + (2 * 10 ^ 1) + (3 x 10 ^ 0)
이진수에서는 01111011 = (0 x 2 ^ 7) + (1 x 2 ^ 6) + (1 x 2 ^ 5) + (1 x 2 ^ 4) + (1 x 2 ^ 3) + (0 x 2 ^ 2) + (1 x 2 ^ 1) + (1 x 2 ^ 0)
모두 스위치 0,1,3,4,5,6을 5V로 설정하고 스위치 7과 2를 0V로 설정합니다. 이것은 숫자 123을 이진수로 "저장"합니다. 이 설정을 "등록"이라고합니다.
더 복잡한 회로를 형성하기 위해 스위치를 결합하는 방법에 대해 더 알고 싶다면 디지털 로직에 대한 좋은 책을 얻거나 Google에 문의하십시오.
이 사이트 는 시작하기에 너무 나쁘지 않은 것 같습니다.
전압은 이진법을 나타내는 방법 일뿐입니다. 다른 트랜지스터 구성을 사용하여 이진 논리를 구현할 수있는 매우 효율적이고 실용적인 변환입니다.
바이너리 로직이 일반적으로 전자적으로 구현되는 방식은 CMOS ( http://en.wikipedia.org/wiki/CMOS ) 기술 기술은 두 개의 MOS 트랜지스터가 상보 적 쌍으로 설정되어 CMOS 게이트를 형성합니다. 그래도 TTL ( http://en.wikipedia.org/wiki/Transistor –transistor_logic) 또는 릴레이를 사용하는 다른 전자 이진 논리 구현이 있습니다. 그러나 실제로 종이, 종이 로봇 염소를 사용할 수 있습니다 : http://www.robives.com/category/product_tags/logic_goats . 전자 CMOS 구현은 효율적이고 실용적입니다.
이 간단한 CMOS 게이트 중에서보다 복잡한 로직 게이트를 구축 할 수 있습니다. 표준 게이트가 아닌 NAND 및 NOR이 기본 게이트입니다. 이 중 이진 논리, 가산기, 레지스터 파일, 메모리 등 모든 것을 만들 수 있습니다. 이 중 완전한 마이크로 프로세서까지 ALU를 구축 할 수 있습니다.
더 많은 정보를 원한다면 디지털 로직에 관한 책을 읽을 수 있습니다.
CPU가 어떻게 구축되는지 이해하는 좋은 실용적인 방법은 VHDL과 FPGA를 사용하여 직접 CPU를 구축하는 것입니다. 저렴한 FPGA 개발 보드를 구입할 수 있으며 소프트웨어는 일반적으로 무료입니다 (제한된 라이센스의 경우). 나는 꽤 저렴한 digilent의 몇 가지를 가지고 있습니다 :
간단히 말해서, 주어진 범위 (일반적으로 5 ~ 12 볼트)에서 가장 중요한 비트는 해당 범위의 전반에서 0이고 다른 것에서 1입니다. 다음으로 가장 중요한 비트는 모든 비트가 계산 될 때까지 그 절반을 2로 나누는 식으로 계산됩니다.
따라서 이진은 주기적으로 측정되는 전압을 높이거나 낮추는 것입니다.
다음은 간단한 예입니다. 1V에서 256V의 범위에서 의사 코드를 사용하여 137을 이진 (숫자)으로 변환 (아날로그)합니다.
// used this way: analogToNumeric(137, 256);
function convert(var number, var length) {
if (number > length) { return(ERROR); }
function convert(var half, var binary) {
if (half < 2) { return(binary); }
elseif (number < half) {
return(convert((half / 2), append(binary, 0)));
} else {
return(convert((half / 2), append(binary, 1)));
}
} return(convert((length / 2), list()));
}