Logisim에 간단한 16 비트 CPU를 구축 중이며 ALU를 준비하고 있고 원하는 opcode를 가지고 있습니다. 이제 다른 하위 회로 (예 : 논리, 산술)에 모든 제어 와이어 (코딩을 구성하는)가 입력으로 필요하지는 않지만 가능한 한 적게 명령에 적합한 코딩을 찾기가 정말 어렵습니다. 효율적인 opcode 디자인에 도움이되는 전략이나 방법이 있습니까?
미리 thx
Logisim에 간단한 16 비트 CPU를 구축 중이며 ALU를 준비하고 있고 원하는 opcode를 가지고 있습니다. 이제 다른 하위 회로 (예 : 논리, 산술)에 모든 제어 와이어 (코딩을 구성하는)가 입력으로 필요하지는 않지만 가능한 한 적게 명령에 적합한 코딩을 찾기가 정말 어렵습니다. 효율적인 opcode 디자인에 도움이되는 전략이나 방법이 있습니까?
미리 thx
답변:
다른 명령어 세트를 연구하는 것이 좋은 방법이라고 생각합니다.
작은 것은 TI의 MSP430이고 약 22 개의 명령어가있는 16 비트 프로세서입니다.
http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf
Atmel AVR을 살펴보면 아주 작은 명령어 세트가 있습니다.
작은 프로젝트에서 VHDL에서 간단한 명령어 세트 (14 명령어)로 간단한 32 비트 프로세서를 개발하려고했습니다.
현재의 자유 시간으로 인해 완전히 완료되지 않았습니다. 명령어는 구현되었지만 두 개는 테스트되지 않았으며 일부 상태 플래그가 누락되었을 수 있습니다.
명령어 코딩에 대한 ARM 접근 방식을 연구하십시오 (그러나 복제하지는 마십시오). 접두사 방향이 무겁고 (Dzarda가 권장하는 허프만 트리 접근 방식과 같음) 레지스터의 명령 선택 부분의 위치가 매우 균일합니다.
상상력이 없지만 신뢰할 수있는 접근 방식은 16 비트가 넘는 모든 제어 신호 를 열거 한 다음 Karnaugh-map 스타일 논리 최소화를 시도하는 것입니다.
일단 Logisim에서 8 비트 명령 길이 코어로 4 비트 CPU를 시도했습니다. CPU보다 단순한 상태 머신으로 끝났습니다.
찾아야 할 임의의 것
허프만 나무에 관한 Computerphile의 훌륭한 비디오 :
내가 수업을 위해 작성한 ISA는 다음과 같이 4 비트 op 코드를 가졌습니다.
1XXX ALU instructions
01XX jump, jump register, call etc
001X branch not equal, branch equal zero
000X 0 - load, 1 - store
이것은 단일 비트의 입력 신호가 어떤 로직 경로를 제어 할 수 있기 때문에 게이트를 구성 / 설계하기에 가장 쉬운 스타일 중 하나입니다. 또는 가장 많이 사용되는 기호를 허프만 코딩하고 고정 길이 연산 코드를 얻기 위해 제로 패드를 사용할 수 있습니다.
한 가지 고려해야 할 것은 모든 형태의 다중 단어 명령어를 허용 할 것인지 아니면 다중 단어 명령어처럼 "동작"할 수있는 것을 허용 할 것인지입니다. 그럴 경우, 주 명령어 다음에 추가 명령어를 사용할지 또는 앞에 접두어를 사용할지를 고려할 수 있습니다. 접두사 및 후속 단어를 허용하면 인터럽트 처리의 복잡성이 증가 할 수 있지만 일반적으로 사용되는 것과 동일한 opcode 공간에 거의 사용되지 않는 명령어를 맞출 필요가 없습니다.
명령이 실행되기 전에 사이클에서 명령을 가져 오는 경우 다음 명령 단어를 건너 뛰거나 내용을 프로그램 카운터로 직접 전송하는 "조건부 분기"명령이있을 수 있습니다. 이러한 설계는 시퀀싱을 중단하기 위해 약간의 복잡성을 추가 할 수 있지만 훨씬 더 넓은 범위의 분기 조건을 허용하면서 "분기", "점프"및 "호출"명령에 대해 많은 양의 opcode 공간을 사용할 필요가 없습니다. 그렇지 않으면 가능한 것보다. 가져 오는 브랜치는 일반적으로 주소의 출처에 관계없이 명령어 자체를 실행 한 후 데드 사이클을 필요로하기 때문에 가져 왔지만 실행되지 않는 다음 단어에서 주소를 가져 오는 데 추가 비용이 들지 않습니다. 시각.
분기 명령어에서 대상 주소를 옮기면 얼마나 많은 opcode 공간을 차지하더라도 16 비트 opcode 형식은 여전히 빡빡합니다. 접두사 지침을 사용하면 도움이 될 수 있습니다. 예를 들어 32 개의 레지스터를 원한다면 레지스터를 source1, source2 및 대상으로 독립적으로 지정할 수 있으므로 opcode에 15 비트가 필요하므로 총 2 개의 명령어를 사용할 수 있습니다. 별로 유용하지 않습니다. 반면에 세 피연산자 각각에 대해 32 개의 레지스터 중 하나를 사용할 수 있다면 좋을 것입니다. 접두사가 앞에 오는 ALU 연산이 8 개의 비트를 사용하여 두 개의 1 개의 레지스터를 선택하지만 접두어 바로 뒤에 오는 ALU 연산이 접두어의 일부 비트를 사용하도록하여 두 목표의 균형을 맞출 수 있습니다. 다음 지시에서 8 개로 상위 레지스터를 사용하는 명령어는 하나가 아닌 두 단어 / 사이클을 사용하지만 경우에 따라서는 그러한 트레이드 오프가 가치가있을 수 있습니다. 접두사를 사용하는 데있어 가장 큰 어려움은 접두사와 다음 명령어 사이에 인터럽트가 발생하는 것을 방지해야합니다. 그렇지 않으면 인터럽트가 발생하는 경우 접두사 이후의 명령어가 올바른 레지스터를 계속 사용해야합니다 (예 : 프로그램을 통해) -카운터 저장 로직은 마지막으로 실행 된 접두사가 아닌 명령어의 주소를 저장합니다]. 그러나 어떤 경우에는 그러한 상충 관계가 가치가 있습니다. 접두사를 사용하는 데있어 가장 큰 어려움은 접두사와 다음 명령어 사이에 인터럽트가 발생하는 것을 방지해야합니다. 그렇지 않으면 인터럽트가 발생하는 경우 접두사 이후의 명령어가 올바른 레지스터를 계속 사용해야합니다 (예 : 프로그램을 통해) -카운터 저장 로직은 마지막으로 실행 된 접두사가 아닌 명령어의 주소를 저장합니다]. 그러나 어떤 경우에는 그러한 상충 관계가 가치가 있습니다. 접두사를 사용하는 데있어 가장 큰 어려움은 접두사와 다음 명령어 사이에 인터럽트가 발생하는 것을 방지해야합니다. 그렇지 않으면 인터럽트가 발생하는 경우 접두사 이후의 명령어가 올바른 레지스터를 계속 사용해야합니다 (예 : 프로그램을 통해) -카운터 저장 로직은 마지막으로 실행 된 접두사가 아닌 명령어의 주소를 저장합니다].
여러 단어로 된 명령을 사용하면 디자인의 일부 측면이 더 어려워 지지만 다른 어려운 결정을 내릴 필요성이 줄어들 수 있습니다.
이 사람은 하드 코딩 된 CPU의 제어 라인을 설명하는 디코더의 하드 코딩 된 부분의 하드 배선 이해에 대한 가장 자세한 정보를 가지고 있습니다 . http://minnie.tuhs.org/CompArch/Tutes/week03.html보다 시피 Opcodes에서의 선택은 디코드 로직의 복잡성에 실제로 영향을 미칩니다.