BLOG ARTICLE 프로젝트/CPU 설계 | 8 ARTICLE FOUND

  1. 2010.12.08 microcode (2)
  2. 2009.01.15 VGA 테스트 성공! (2)
  3. 2009.01.14 cpu isa design issue
  4. 2008.12.22 address/data bus issue (2)
  5. 2008.12.13 compiler basic phase
  6. 2008.12.09 VGA programming (2)
  7. 2008.12.05 VGA Smile Image!
  8. 2008.12.04 about broneri homebrew computer

아기 보느라 개인 시간이 하나도 없네요.

요새 고민하고 있는 부분이 micro code입니다.

약간의 힌트와 지식을 얻어서 대충 공유(?) 해보려합니다. (지적 및 조언은 감사히 받구요 ^^ )

제가 micro code를 보려는 이유는 ttl로 cpu를 만들려는 개인 취미이고요.

문제 상황은 납땜을 극히 싫어하는 뼈소남 (뼈속 부터 소프트웨어 남자)이기에.. ㅋㅋㅋ

wire wrap방식으로 만들고자 하는 것이고요. ( 왜 있잖아요, homebewcpu.com 아저씨 처럼 ㅎㅎ;; )

isa를 해석하는 control 로직에 interconnect를 줄이기 위한 일환으로 microcode 방식의 control로직을 고민하게 되었고요.

대략적으로 다음과 같더군요. 

먼저 마이크로코드는 isa (instruction set architecture) 의 수많은 명령어를 모두 하드웨어 상에 설계를 하려면 귀찮으니

보다 저급한 프리미티브한 상세 동작으로 나누어보자는 거죠.

이를 구현하기 위해선 micro sequencer로직이 필요하게 됩니다. 한 명령어를 실행하기 위해서 내부적으로는 세부명령어
여러개로 나누기 때문에 한 명령어 당 여러 세부 cycle이 발생하게 되는거죠. 
(현재 x86 아키텍쳐는 내부적으로 이 microcode architecture를 쓰고 있습니다.)

구현측면에서 바라보면 

alu로 부터 결과를 얻은 flag register로 부터 c (carray), z (zero), v (overflow), n(minus) 이전 상태 값을 얻어온 후

micro sequence마다 해당 해야 할 control logic을 내뱉는 동작..

즉.. 예로 아래는 bmow의 microcode입니다.

// BEQ
// Branch if result is zero. If Z bit of the condition codes is 0, then interpret the
// next byte of the program as a signed offset from the next instruction's PC, and jump to that
// address.
opcode: F0
z=0: T <- X // brach taken
z=1: pc++ // branch not taken
z=0: X <- MEM(PC); PC++
z=1: nextop
*: PCLO <- X + PCLO; latchCC // add delta to low byte of PC; latch carry
//if no X7 available:
// *: X <- X; latchCC
//n=0: X <- 0
//n=1: X <- 0 - 1
//c=0: PCHI <- X + PCHI + 1
//c=1: PCHI <- X + PCHI
c=0: PCHI <- X7 + PCHI + 1 // carry flag == 0 means there was a carry
c=1: PCHI <- X7 + PCHI
*: X <- T; nextop

위는 BEQ 명령 (만일 어떤 수행의 결과로 zero flag가 설정될 경우 jump하라는 명령)을 기술한 것이고,
cpu개발자는 위와 같이 microcode를 위한 자체 언어를 만들고 이를 assemble 하는 툴을 만들어서
rom에 굽게 됩니다.

위의 경우 왼편에 flag condition이 존재하고 (z=0이나 c=1이런 것들) 오른편에 실제 마이크로 코드가 보입니다.
즉 첫번째 micro sequence 구간(하드웨어에선 clock이라고 말함) 동안 z=0이면 X레지스터값을 T로 복사합니다.
nextop은 마이크로 sequence를 초기화하고 다음 instruction을 fetch하라는 종결을 의미하는 키워드입니다.
(뭐 bmow개발자가 임의로 만든 언어기 때문에 중요한 것들은 아니지만요)

이렇게 마이크로 코드를 모두 작성한 후 자신의 마이크로코드 컴파일러를 개발하여 rom에 굽게 합니다.

여기서 재미있는 매직을 하는데요. 이를 테면

명령어가 놓여져 있는 메모리에서 한 명령어를 읽어온 후

opcode가 F0 (위 기술상 BEQ에 해당)가 읽히면 해당 opcode 값 F0가 마이크로 코드가 심어져 있는 rom의 
상위비트 주소로 연결되고, 중간 비트에 micro sequence값 0~16 차례로 증가되는 값, 그리고 마지막비트들에
zvcn flag값이 역시 rom의 어드레스로 들어가게 됩니다.

물론 이미 rom에는 해당 opcode에 대해 몇번째 micro sequence step일때 그리고 이전 flag가 무슨 값일때 
어떤 control signal을 생성해야 할지 정해져있는 거고요.

예를 들면, 실행할 opcode가 F0 (BEQ)이고 seq값이 1이고 z=1인 상태이라면 
microcode rom의 입력address pin에 F014 이런 어드레스가 들어갑니다. (상위 F0, 중간 1, 마지막 비트가 zcvn순이라면 ) 
그러면 pc++을 실행하기 위해서 내부적으로는 inc_pc라는 (가정) internal control signal이 발생되어야 한다면,
microcode rom의 F014 주소의 메모리 값을 읽으면 0x0001이라는 값을 얻게 되고 inc_pc 컨트롤 신호는 rom메모리 읽은 값의 
최하위 비트를 쓰는 식입니다.
마치 소프트웨어의 해쉬테이블 처럼 말이죠.

결국 마이크로코드를 지원하기 위해서 해야할 일

- 자신의 isa를 결정
- 지원할 microcode instruction 결정
- microcode 언어 개발
- microcode 컴파일러 개발
- microcode 롬에 굽기

일단 개략적으로 동작이나 만드는 방법이 정리되는 거 같군요..

결혼하고 애낳고 하느라 근 1년 넘게 개인 취미를 못했는데, 다시 시작하려니 설레네요.

'프로젝트 > CPU 설계' 카테고리의 다른 글

microcode  (2) 2010.12.08
VGA 테스트 성공!  (2) 2009.01.15
cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon FreeChild 2012.04.16 23:25 신고  댓글주소  수정/삭제  댓글쓰기

    환상적이군요...^^ 듣던 명성대로 대단하십니다... 저도 이런 경지에 이르고 싶습니다.^^




실 CPU 설계 부터 해야하지만, 뭔가 화면에 보이면 신나고 좋을거 같았다. 그래서 시작한 것이 VGA 잡기..
어차피 목표가 겜이 동작되는 거니까 (-- 일단 목표는 크게.. ) 언젠간 부딪혀야할 주변장치이긴 하다.
원래 VGA는 25.175MHz의 오실레이터가 필요하다만... 구하기 녹녹찮아서 20MHz를 사용하였다.;;;
물론 납땜인두도 없기 때문에 vga 커넥터를 wire wrap으로 하기로 했다.

목표 VGA Mode는 640x480x60Hz 16color (IBM VGA Mode중 12h이다)
실제 Horizontal Blank와 Vertical Blank구간을 합친 Total resolution은 800x525이다.
근데 20MHz밖에 없어서 Horizontal은 800대신 635로 쭐였다. 실제 active 해상도는 524x480정도 된다.

정말 쉬울줄 알았다.
근데 정말 어렵다. 오실로스코프가 없을때 그 암담함이란 ;;;;;;;
결국 오실로스코프를 미리 장만하게 하는 계기가 되었다 ㅡ,.ㅡ;
정말 일주일 넘게 이거만 붙들고 있었다. 정말 많은 삽질을 했다 --;

먼저 VGA 15pin 3열 d-sub female connector를 이쁘게 wire wrap 하였다. 난 땜쟁이가 아니니까..;

LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:43:10

그리고 HSYNC를 위해서 4bit 74LS193P 듀얼카운터 3개를 할당하고; VSYNC를 위해서 역시 4비트 카운터 3개를 마련했다;
그리고 HSYNC, VSYNC및 카운터 리셋을 하는 신호를 20v8 GAL 2개를 사용하여 생성시켰다.
사실 삽질이다. GAL22v10 을 사용하면 4bit 카운터 안써도 된다. 20v8은 매크로셀이 8bit d-ff라서 너무 할것이 없다.
이거 하면서 xc9500 cpld쪽도 한번 발을 담궈야 겠다는 마음이 불끈들었다.;;

LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:26:18

잘 동작하는지 이번에 산 100MHz ReadOut Kenwood 오실로스코프로 프로브를 했다.
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:29:04
음 대충 HSYNC를 위한 scan line인 31.77 us를 맞춘거 같다.
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:27:28

음 VSYNC역시 1 frame 인 16.68 ms을 대충 맞춘거 같다.
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:28:37

RGB 중 B를 HSYNC용 카운터의 적절한 비트(?)에 두고 화면에 출력! 오예 드뎌 ㅠㅠ...
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:26:06

신이난 나는 미친듯이 R,G,B를 꽂았다. 오 전혀 촌스럽지 않아..!!
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 01:40:53

이미지를 넣으려면 EEPROM이 있어야 겠다.. 또 사야겠네..;
VSYNC카운터 쪽에도 RGB를 물려봤다. 이 땐 330Ohm저항에 함께 놓았다.
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:02 23:39:08



삽질 내용
- wirewrap이 헐렁하다.. 잘쪼여 놓자 ;;; (이래서 납땜을 해야 하는 건가...)
- VGA Dsub connector 핀을 잘못 연결.. 이건 뭐..커넥터 매뉴얼도 없고 헤매다가 HSYNC 핀 female 구멍에 프로브로 꽂아보고 잘못된걸 알았다. -- 오실로스코프 만세. 이것이 되니까 겨우 일주일동안 본 Disconnected 화면을 벗어나고 행복한 Signal out of range 에러를 볼 수 있었다.. ㅠㅠ
- 나중에 보니 VSYNC카운트를 잘못하고 있었다.... 잘 맞추니 위처럼 나왔다. 근데 역시 25.175MHz 를 사용안하고 근사치로 20MHz로 맞추다보니 몇초 지나니까 VSYNC를 잠깐 잃어서 모니터가 잠깐 꺼져따가 다시 켜진다. ㅋㅋ 뭐... 그래도 넘 좋당..

배운내용
- 삽질한다고 될일이 아니다. 디버그 장비가 필요 ...
- 하드웨어는 타이밍맞는 놈 돈이 들어도 미리 갖고 있는게 정신건강에 좋다.
- 모니터 테스트할땐 전용 모니터 한대쯤은 마련하자. 스펙을 보고 있는 메인 PC의 모니터를 계속 빼따 꼈다하면 대략 정신건강 저하 및 의욕상실을 부른다. --;

더보기

'프로젝트 > CPU 설계' 카테고리의 다른 글

microcode  (2) 2010.12.08
VGA 테스트 성공!  (2) 2009.01.15
cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon 너굴팬더 2008.12.09 07:51 신고  댓글주소  수정/삭제  댓글쓰기

    저도 요즘 디스플레이관련 프로젝트를 준비중인게 있는데 솔직히 아는게 별로 없어서 고민입니다. 검색하면 원론적인 것만 나오고 VGA 출력시 타이밍관계, 신호생성방법, 출력신호레벨, 등등.... 이런 테크니컬한 부분은 찾기가 힘들어서 진도가 안나오네요. 힌트 좀 주시면 나중에 테스트보드 만들때 드리도록 하죠. ^^

  2. BlogIcon broneri 2008.12.09 08:11 신고  댓글주소  수정/삭제  댓글쓰기

    분명 잘하시리라 믿습니다 ^^ 만일 유명한 팬더님의 보드를 주신다면 낼름 받겠습니다 ^^!
    타이밍 관련해서 제가 도움받은 사이트는 다음과 같습니다.
    http://www.epanorama.net/documents/pc/vga_timing.html
    신호레벨은 RGB말고는 TTL 5v그대로 흘리면되고요. 저항은 Rx모니터 딴에 75Ohm termination resistor가 있고요. R,G,B 아날로그 신호는 0V가 검정, 0.7V가 full color intensity입니다 ^^ (약 460Ohm을 달면된거 같은데 안달아도 모니터에 문제되진 않더라고요 ㅎㅎ..)
    아는게 많지는 않지만, 도움받은 만큼 돌려드리고(?) 싶네요.




일단 isa (instruction set archiecture)는 8 bit를 1 word (하나의 최소 명령어 단위)로 잡아보았습니다. (아직은 많은 고민이 있네요.)

역시 아무래도 나중에 wire wrapping의 고통을 줄이기 위해서는 RISC (Reduced Instruction Set Computer) 방식을 사용해야 할것 같습니다.
RISC의 경우 CISC (Complex Instruction Set Computer)와는 다르게 1 instruction은 1 cycle에 끝나게 됩니다. 물론 RISC가 pipe line을 지원하면 총 pipeline stage를 거쳐야 명령어 처리가 되겠지만 말이에요. 뭐, 저에겐 pipe lining은 사치이니까요 ^^;

크게 현재는 최소한의 RISC instruction들로 구성한 후 software (assemble coding)에서 많은 구차한 (?) 일을 하도록 할 생각입니다. 아무래도 하드웨어 설계가 복잡해지는 것 보단 차라리 assembler simulator를 Windows용으로 하나 만들어서 거기서 코딩&디버깅 한 후 EEPROM에 올리는게 날것 같아서 말이지용...

대충 크게 one instruction은 다음의 모양을 할것 같습니다.
8bit word = 4bit OPCODE | 4bit register selector
                4bit OPCODE | 4bit #immediate

대충 잡은 최소 필요 Register file입니다.
Data Register : 4bit or 8bit Y, A, B
Addr Register : 16bit or 24bit PC, ADR
Flag Register : 1bit Fcmp

다음은 지원하려고 하고 있는 instruction set입니다. (Logic, Arith 관련 명령어는 74S181N을 이용하기 때문에 오른편엔 Mode, S0~S3, CARRYn, A==B핀의 설정값도 함께 적어보았습니다)

Logic
AND   Y = A & B : M=H, S=HHHL
OR    Y = A | B : M=H, S=HLHH
      Y = ~A    : M=H, S=LLLL

Arithmetic
ADD   Y = A + B : M=L, S=HLLH, Cn=L
SUB   Y = A - B : M=L, S=LHHL, Cn=H

INC   A = A + 1 : M=L, S=HHHH, Cn=H
DEC   A = A - 1 : M=L, S=LLLL, Cn=L
COM   Fcmp <- A == B : A=B


Register Move
MOV_Y2A      : A = Y
MOV_A2B      : B = A
MOV_B2A      : A = B

Immediate
SetADR #addr : ADR = #addr

Memory Load/Store
Load A       : A = [ADR]
Save A       : [ADR] = A

Jump Control
JMP          : PC = ADR
JMP_EQU      : if ( Fcmp ) PC = ADR
JMP_NEQ      : if ( !Fcmp ) PC = ADR

스택 명령을 지원할 것인지. 아니면 arm처럼 함수 호출후 돌아올 링크 레지스터 (lr)을 둘지 결정을 못했네요.  그리고 ~A 명령이나 INC, DEC는 과연 필요한 명령어 인지도 의심이 가네요 --;....

현재 ALU는 4bit 74S181N을 갖고 있어서 이를 활용하려는 계획인데 문제는 8bit ALU가 되기 위해서는 74S181N 두개를 연결해줄 74S182가 필요하다는 것입니다. Carray Lookahead를 지원하는 74칩인데, 이 역시 구하기 하늘에서 별따기 같네요.
그냥 몇 명령어에 대해서 직접 GAL을 이용하여 74S182를 흉내내는 식도 고려해 보고 있습니다.

겨울이 깊어지고 추워지니까 취미활동도 둔화되네요.

어쨋든 저에게 중요한 설계 isa design decision factor는 다음과 같습니다.
1. 가장 최소의 wire wrapping 선을 유지한다.
2. 가능하면 C 언어 지원을 고려한다 (함수 호출을 위한 stack지원, 포인터 지원을 위한 간접 주소 어드레싱 모드 지원)
3. 컴파일러에게 보다 수월한 backend register mapping이 가능토록 instruction들의 폭넓은 register selection 지원

일단 isa를 정하고, 그 후에 실제 timing budget을 계산해봐야 할것 같습니다.

'프로젝트 > CPU 설계' 카테고리의 다른 글

microcode  (2) 2010.12.08
VGA 테스트 성공!  (2) 2009.01.15
cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



Address/Data bus 설계

Big Mess O'Wire의 경우 data bus는 8 bit, address bus는 24bit를 사용하고 있습니다.
Magic1은 역시 address bus 24 bit (device select를 위해 2bit 사용, 한 device는 4M) data bus 8bit를 사용하고 있지요.

broneri cpu는 어드레스 버스는 적어도 24bit 이상은 만들어야 할 것 같군요. data bus는 8bit를 사용하는게 wiring을 줄이는 (wiring == pain ㅎㅎ; ) 방법이 될듯 합니다.

CISC or RISC 설계

BMOW의 경우 EEPROM에 BMOW microcode 실행 루틴이 들어 있습니다. 이렇게 함으로써 타 instruction set을 쉽게 포팅할 수 있게 설계되어 있습니다.


Magic1  역시 마이크로 코드 방식으로 동작하며 아래와 같은 블럭 다이어그램을 갖습니다.

저의 경우 RISC 방식 (사실 어떻게 보면 native microcode set)을 사용하기만 하면 될듯하군요. 향후 software 컴파일러 설계 시 risc 컴파일러를 만들게 되면 그만큼 cpu isa는 간단하지만 컴파일러의 컴파일 최적화 복잡도가 올라갈 수 있습니다. 그때 쯤 가면 기존의 micro code와 유사한 risc cpu에 cisc isa 해석기를 두면 될것 같다는 생각도 드네요.

CPU speed

BMOW는 2MHz로 동작하고 있습니다. 다소 느린편이지요. 또한 Magic1 역시 4.09MHz로 동작하고 있습니다. Magic1의 경우 MMU라고 할 수 있는 hardware page table을 지원하고 있어서 보다 소프트웨어에 대한 지원을 한다고 볼 수 있겠네요. 각 소프트웨어는 독립적인 주소 공간을 갖을 수 있으므로 보다 multi-tasking OS나 software flatform을 작성하기 용이 할 것 같습니다.

 저의 경우 VGA화면에서 게임이 동작되길 바라고 있기 때문에 최소 25.175MHz (for Video system)이상이어야 원활한 화면 재생이 될 것 같은데요. 문제는 사용하고 있는 74LS TTL 시리즈는 20MHz이상에 대해서는 동작이 제대로 되지 않기 때문에 cpu speed가 20MHz 이하로 결정된다는데 문제가 있습니다. 특히 ALU 부분은 74LS181N을 사용하고자 하고 있기에 이 speed constraint는 고정이라고 할 수 있겠네요.

만일 정말 제대로 된 화면 전환을 위해서는 video system을 따로 만들어서 accelerator 방식의 가속기 API를 제공함으로써 cpu system의 속도 제약에 대한 보상을 해줄 수 있을것 같습니다. 일단은 간단한 tile API와 sprite API를 제공하면 될것 같은데 뭐 아직 먼 얘기니까 ^^; 그때 가서 한번 해봐야겠지요

요 며칠동안 써든어택을 하면서 --; 놀기만 했네요. 어차피 개인적인 프로젝트니까, 쉬엄쉬엄 필 꽂힐때 천천히 진행해야 겠습니다. ^^


'프로젝트 > CPU 설계' 카테고리의 다른 글

VGA 테스트 성공!  (2) 2009.01.15
cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
VGA Smile Image!  (0) 2008.12.05
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon kkamagui 2008.12.23 12:50 신고  댓글주소  수정/삭제  댓글쓰기

    와우~ 멋지네요 ;)
    CPU라는 놈을 이렇게 만들 수도 있군요. ^^)/~
    기대하겠습니다. 멋진 녀석(?)을 만들어 주세요 ;)




작년에 컴파일러 사외 강의를 듣고 정리한 내용입니다.


frontend
-----------------------------------
lexical analysis
- word check [scanning]
   => fsm (not string tokenizer)

syntax analysis
- sentence(grammer) check [parsing]
   => parsor = fsm+stack

semantic analysis
- type checking 
   => symbol table

intermediate representation
- AST or 3-address code(Text) IR

syntax-directed translation


back end
-----------------------------------
optimization
- formulation (goal:size,speed)
- analysis
- transform, perf. estimation

CFA(Control Flow Analysis)
  - Build CFG (Basic Blocks)
     => DFS (Depth First Search) => DFT 생성 가능(Edge) => Unreachable code elimination 활용
  - Build Dominatance(Dominator Tree, postdominance) => CSE 활용
  - Find Loop (back edge with DFT)

DFA(Data Flow Analysis)
  - DFI
  - Local Data flow Analysis
  - Global Data flow Analysis
  - Def-Use/Use-Def chains

  DFA로 풀수 있는 문제
  1. available expression problem: 이전에 사용한 변수가 변경이 없었는지 확인
  2. reaching definition problem: 값 정의된 변수가 어디서 사용되는지
  3. aliasing problem: 어떤 변수가 같은 메모리를 가리키는지
  4. live variables problem.

대부분 DFA 기술은 DFI (Data)와 DFE (Data Flow Equations, SET의 수학표현, 함수, 필터)로 표현됨

Reaching Definition: Fs(in[S]) = gen[S] ∪ (in[S] - kill[S])
Available Expression: 
for each basic block B do
   out[B] = egen[B] ∪ (Universal - ekill[B])
od
while changes to any out[B] occur do
   for each segment X in DFS order do
     in[B] = ∩ out [Pb]; // all predecessors Pb of B
     out[B] = egen[B] ∪ (in[B] - ekill[B]);
   od
od

Dependency Analysis
- Read After Write: flow dependence(true dependency)
- Write After Read: anti dependence (false)
- Write After Write: output dependence (false)

Optimization
A. Elimination of redundancies
    a. Dead code (mark instruction essential results)
    b. Redundant computations or expressions
       - Value numbering and common subexpression elimination)
       - code motion and hoisting/sinking
       - partial redundancy elimination
       - algebraic transformations
      CSE (Common subexpression elimination)
perform DFA to compute in[B]; // available expression collect
for each expression e in in[B] of every block B do
   locate the evaluation of e at a statement s in B;
   if s = null or // if there is no statement in B that evaluates e
     e has been killed before s then continue;
   R <- a set of statements Si in all predecessors Pi of B
     such that e is evaluated in Si;
   substitute a new temporary Te for e in s;
   for each Si in R do
     insert 'Te = e' immediately before Si;
     substitute Te for e in Si;
   od
  od
B. Progpagation of data
   a. constants propagation
   b. constants folding
   c. copy propagation
C. Peephole Optimizations
   a. DAG(Directed Acyclic Graph)사용
   b. Machine idioms
   c. Peephole of control flow
     - Tail merging
     - Straightening : 불필요한 브렌치 제거
     - Branch simplifications : branch시 안가는 코드, 브렌치 전체 제거
D. Loop Optimizations
   a. Unswitching : loop안 branch를 loop 밖으로
   b. loop elimination: zero count loop 제거
   c. loop inversion: while -> do while
   d. strip mining 
   e. loop unrolling
   f. optimizations of induction variables

code generation
-----------------------------------
Instruction selection
a. macro expansion
b. L-R parsing
c. tree parsing(pattern matching)
d. machine description
Register allocation
a. Web (from DU chain)
b. Register coalescing (맞닿은 copy 변수 변수 없애기)
c. Graph coloring (with Interference graph)
Instruction cheduling

'프로젝트 > CPU 설계' 카테고리의 다른 글

cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
VGA Smile Image!  (0) 2008.12.05
about broneri homebrew computer  (0) 2008.12.04
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



VGA 프로그래밍을 위해서 먼저 VGA Rx인 Monitor와 연결하기 위해서는 VGA D-Sub 3열 female connector의 핀 배열에 대해서 알아봐야 할 것 같습니다.

Pin Description

VGA female pin 번호는 다음과 같습니다. [1]

15 pin highdensity D-SUB female connector layout
실제로는 아래처럼 생겼습니다. [3] (당연한 얘기겠지만요 ^^;)
 


사실 VGA의 핀의 기능은 그동안 조금씩 바뀌어 왔습니다. [2] 그러나 그런 것들은 대부분 Tx (Graphic card)와 Rx (Monitor)간의 DDC (Display Data Channel) 컨트롤 (예를들어 모니터의 메뉴를 누르면 OSD -On Screen Display-가 뜨게 되고 여러 설정을 하면 그것을 Tx에게 보내게 됩니다. 이 때 DDC 채널을 통해서 제어가 되게 됩니다. 또한 초기에 어떤 모니터이고 어떤 해상도와 Display Range를 지원하는지를 Rx가 Tx에게 알려주는데 이것이 EDID 정보입니다. 이때도 DDC를 통해서 조절되게 됩니다.)과 관련된 것들입니다. 


What is important for test

위의 그런 복잡한 핀들이 많습니다만, 사실 OSD나 DDC컨트롤을 위해서 생각할 만큼 초기에는 여유가 없습니다. 가장 기본적으로 동작되어야 할 핀들은 다음과 같습니다.
RED, BLUE, GREEN은 Analog신호로 0.7V가 가장 높은 Intensity로 모든 값이 0.7V라면 흰색이 나오겠죠? 물론 모두 0V라면 검정색이 나오게 됩니다. 
R,G,B의 Ground는 0V를 연결하면 됩니다.
GND도 역시 0V를 연결하고, +5V는 5V VCC를 연결합니다. SGND는 0V로 연결하고, 제일 중요한 VSYNC, HSYNC는 +5V, 0V로 TTL레벨 디지털 신호로 보내면 됩니다. 
VSYNC와 HSYNC는 대부분 1값 (5V)를 갖다가 특정 시간이 되면 0으로(0V)내려가게 됩니다. (active edge가 low라는 말이겠죠?)

VSYNC, HSYNC timing
VGA는 오실레이터를 25.175MHz를 쓰면 딱 맞습니다. [4]

먼저 HSYNC신호를 위한 타이밍은 아래와 같습니다.
Horizonal Dots         640     640     640        
Vertical Scan Lines    350     400     480
Horiz. Sync Polarity   POS     NEG     NEG
A (us)                 31.77   31.77   31.77     Scanline time
B (us)                 3.77    3.77    3.77      Sync pulse lenght 
C (us)                 1.89    1.89    1.89      Back porch
D (us)                 25.17   25.17   25.17     Active video time
E (us)                 0.94    0.94    0.94      Front porch
         ______________________          ________
________|        VIDEO         |________| VIDEO (next line)
    |-C-|----------D-----------|-E-|
__   ______________________________   ___________
  |_|                              |_|
  |B|
  |---------------A----------------|

그리고 VSYNC를 위한 타이밍은 아래와 같습니다.

Horizonal Dots         640     640     640
Vertical Scan Lines    350     400     480
Vert. Sync Polarity    NEG     POS     NEG      
Vertical Frequency     70Hz    70Hz    60Hz
O (ms)                 14.27   14.27   16.68     Total frame time
P (ms)                 0.06    0.06    0.06      Sync length
Q (ms)                 1.88    1.08    1.02      Back porch
R (ms)                 11.13   12.72   15.25     Active video time
S (ms)                 1.2     0.41    0.35      Front porch
         ______________________          ________
________|        VIDEO         |________|  VIDEO (next frame)
    |-Q-|----------R-----------|-S-|
__   ______________________________   ___________
  |_|                              |_|
  |P|
  |---------------O----------------|

Put it all

전체적인 흐름은 다음과 같이 볼 수 있습니다.
저 같은 경우는 VGA connector를 wire wrap을 했지만 납땜을 해도 되겠죠?

보드 상 VGA (RGB신호 핀) --> wire wrap ---> 460 ohm --> D-Sub 15F (connector) ---> VGA cable ---> LCD Monitor

Rx단에 75Ohm이 있기 때문에 Tx 5V 신호를 0.7V로 맞추기 위해서
          V1*R2
V2 = ---------
          R1+R2
이기 때문에
   5V
--------- => 0.7V 정도
460 + 75
즉 RGB 신호에 460Ohm를 달아야 0.7V가 Rx로 전달되겠죠? (사실 이부분은 제가 확실치는 않네요.. ^^; )

RAMDAC
RAMDAC 칩이 있다면 RGB Analog신호로 변환 할 수 있습니다.
RAMDAC는 다음에 리스트를 참고하여 골라야 합니다. [5] 만일 RAMDAC가 없다면 R,G,B 디지털 신호레벨을 R2R resistor ladder를 활용하여 DAC를 통하게 해야 할것입니다.

Example

제가 진행한 부분에 대해 블로그를 참고하시면 됩니다. [6]


Reference

[1]. VGA (VESA DDC) pinout, http://pinouts.ru/Video/VGAVesaDdc_pinout.shtml

[2]. Old VGA Pin description, http://pinouts.ru/Video/VGA15.shtml

[3]. VGA connector, http://en.wikipedia.org/wiki/VGA_connector, Wikipedia
[4]. VGA Timing, http://www.epanorama.net/documents/pc/vga_timing.html
[5]. ramdac list, http://www-user.tu-chemnitz.de/~kzs/tools/whatvga/ramdac.txt

[6]. VGA example, broneri.tistory.com

'프로젝트 > CPU 설계' 카테고리의 다른 글

cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
VGA Smile Image!  (0) 2008.12.05
about broneri homebrew computer  (0) 2008.12.04
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon kkamagui 2008.12.10 01:30 신고  댓글주소  수정/삭제  댓글쓰기

    완전 멋지군요. @0@)-b
    깜짝 놀랐습니다. ;) 기대할께요 ㅎㅎ




VGA 화면에 Image를 출력하기 위해서는 비디오 메모리가 필요하다.
현재 내가 갖고 있는 것 중에 쓸 수 있는 부품은 저번에 롬라이터를 살때 공짜로 딸려온 M27C256B UV EPROM 뿐이었다.

아무것도 모르던 난 ㅎㅎ EEPROM을 두개 사긴 했는데 serial interface를 사버린 것이었다. SCL, SDA 두핀으로 시리얼하게 어드레스를 줘야 하기 때문에 소프트웨어적인 컨트롤이 아니면 하드웨어로 설계하기 힘들다..

어쨋든, M27C256B를 TOP2004 Universal USB rom writer에 꽂고 TopWin을 실행하였다.
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:05 20:37:45

TopWin에서 Type을 눌러서 EPROM 타입을 선택하였다. ST사의 EPROM M27C256B를 선택하고 OK!

그리고 bin파일에 아래처럼 한번 만들어봤다. 작은 스마일이다.
음. 역시 중국제 프로그램 ㅋㅋ 폰트가 후져서 이건 스마일인지 알수가 없네.

딱 이렇게 그려보았다. 위와 아래에 한줄 나오고 동그라미 안에 웃는 얼굴.. (쩝 잘안보이네)

M27C256B는 UV EPROM이다. UV (Ultra Violet) 타입이기 때문에 칩 중간의 동그란 윈도우에 자외선을 쐬어주면 패턴이 지워져서 다시 쓸 수 있다. 근데 난 자외선 기가 없다. 듣기로는 형광등이나 날씨 좋은날 햇볕에 오래 두면 지워진다는데 나중에 한번 해봐야 겠다. ㅎㅎ;

아래는 DIP타입 M27C256B의 칩 핀 배열이다.

중요한 것은 Operating mode를 잘 설정하는 것인데 사용법은 무척 쉽다. Read 모드이니까 E핀과 G핀에 low를 연결하고 Vcc만 연결하면 된다. 그리고 어드레스 핀들인 A0~A14까지 주소를 주면 아까 내가 적어 놓은 메모리 내용이 Q0~Q7에 출력되게 된다.

저번에 만들어두었던 VGA test logic에서 Horizontal counter와 Vertical counter로 부터 4 bit씩 받아와서 EPROM의 A0~A3, A4~A7에 연결하고 나머지 주소들은 low로 연결해주었다.
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:05 20:28:22
그리고 Q0를 VGA의 R에 연결하였다.
실제는 너무 작아서 Horizontal/vertical counter의 두번째 자리비트 부터 연결했다. (2배 커진것이다)
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:05 20:28:39

오 이미지 나온다. ㅎㅎ...
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:05 20:27:36

음 이 기세를 몰아서 스마일을 키워봤다. 카운터의 상위비트들을 이용했다. ㅎㅎ
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:05 20:30:42
LG CYON | LGE LH2300 | Normal program | Center-weighted average | 2008:12:05 20:31:40

음. 어서 EEPROM을 사야겠다. EPROM은 한번 쓰고 다시 못쓰니까 HELLO라고 써보고 싶었는데.. ㅡㅡ... 못해봤다. 어쨋든 이것으로 VGA에서 ramdac를 제외하고는 대충 사용방법을 익힌것 같다.

'프로젝트 > CPU 설계' 카테고리의 다른 글

cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
VGA Smile Image!  (0) 2008.12.05
about broneri homebrew computer  (0) 2008.12.04
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


동기.
소프트웨어 프로그래머로서 나의 로망은 나만의 cpu isa (instruction set architecture) 상에서 나의 os를 동작시키는 것이다. 이것이 뽀대나는 로망(?)이 될지 삽질의 노망이 될지는 아직 모르지만, 일단 시작해 보려고 한다.

개발 범위.
크게 cpu설계와 os설계, compiler(?) 설계로 나뉜다.

현재개발수준
2008-12-01 - vga video 12h simple test 

specification
brocpu
- bus: 8 bit data bus, 24 bit address bus
- clock: 20MHz system clock, 25.175MHz for video system
- almost 74LS TTL, and GAL and cpld
- support peripheral: clcd, ps/2 keyboard, vga monitor

broos
- console mode dos style os
- windows mode (?)
- multi-tasking, simple round robin

brocc
- assembler
- c complier
- debugger
- simulator

application
- video game

'프로젝트 > CPU 설계' 카테고리의 다른 글

cpu isa design issue  (0) 2009.01.14
address/data bus issue  (2) 2008.12.22
compiler basic phase  (0) 2008.12.13
VGA programming  (2) 2008.12.09
VGA Smile Image!  (0) 2008.12.05
about broneri homebrew computer  (0) 2008.12.04
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


티스토리 툴바