2013년 9월 3일 화요일

[예전글] FPGA를 배우기 위해 필요한 사항..

FPGA(or CPLD)를 배우기 위해서는 8051(혹은 비슷한 CPU)를 완벽하게 이해해야 한다.
위 문장에서 가장 중요한 단어는 '완벽하게'라는 단어이다.

8051을 완벽하게 이해한다는 것은 8051의 아키텍쳐, 하드웨어 구조(각각의 I/O핀들의 동작 및 하드웨어 자원-인터럽트,타이머,UART,메모리 Access기능들과 각각의 타이밍), 소프트웨어(Instruction Code의 실행 및 어셈블리언어, C언어 및 C/ASM컴파일러)및 8051 datasheet에 나온 모든 내용을 완벽하게 이해한다는 이해한다는 것이다.
위 문장에서도 가장 중요한 단어는 '완벽하게'라는 단어이다. 8051내부에는 수많은 기능이 있지만, 이들 기능은 마이크로 프로세서의 가장 기본적인 기능에 불과하고, 이 기능들은 FPGA가 대학생 수준이라면 초등학생 수준의 기능이다.(초등학교 수준을 완벽하게 모른다면, 대학생은 커녕 고등학교 과정도 소화할수 없을것이다)

FPGA는단독으로 사용되는 경우는 절대로 없다.
모든 FPGA는외부에 CPU와 연결되며, 해당 CPU가 지원하지 않는 기능을 CPU에게 추가할수 있게 해준다.
FPGA가 단독으로 사용되는 경우에도 FPGA내부에 CPU기능을 담당하는 아주 작은 CPU가 반드시 존재한다.

CPU는 자신이 필요할때 FPGA에게 DATA를 전송하거나(Write) 전달받는다(Read).
따라서 FPGA가 제 아무리 귀신잡는 재주가 있다 해도, CPU없이는 무용지물인 IC일뿐이다.

따라서 CPU가 어떻게 동작하는지 알아야, FPGA내부로직을 CPU가 원하는대로 설계할 수 있다.
CPU가 뭘하는지 모른다면, FPGA는 당연히 필요없는 IC이다.

8051을 모르는 상태에서 VHDL이나 Verilog를 배운다는것은 시간낭비일뿐이다.
자신의 VHDL/Verilog CODE에서무슨 신호가 왜/어떻게 들어오고 나가는지 모르는 상태에서 VHDL/Verilog가 무슨
필요가 있겠는가?
초등학교를 졸업하지 않고, 대학강의를 수강해봐야 시간낭비일뿐이다.

[예전글] FPGA_CPLD 배우기 1 - 들어가면서..


FPGA_CPLD 배우기 1

들어가는 말..
Xilinx FPGA/CPLD의 사용법에 대해서 알아보겠습니다.
reference board가 있다면 좋겠지만 가능하면 reference board에 종속받지 않는 형태로
진행할 예정입니다.

Xilinx의 경우에 FPGA나 CPLD의 사용법은 거의 비슷합니다.
설계자가 FPGA와 CPLD의 차이점을 확실히 알고서 설계한다는 전제아래서
ISE tool에서 처음부터 시작하여 최종목적화일인 bit stream화일을만드는 과정은 100% 같습니다.

FPGA와 CPLD의 주된 차이점은 생성된 bit stream화일을 어떻게 chip에 configure하는가의
차이입니다.

이 강좌에서는 schematic을 위주로 설명할 예정입니다.
VHDL/Verilog는 가능한한 언급하지 않겠습니다.

필자는 작업중에 거의 schematic을 사용합니다.
FPGA경우에는 소스상에서 대략적으로 schematic을 80%정도 사용하고,
20%정도의 VHDL을 사용했던것 같습니다.
VHDL은 주로 bit수가 많아지는 블럭에 적용했습니다.
그리고 합성결과물은 약40%정도가 schematic에서오고, , 60%정도가 VHDL의 결과물인것 같습니다.
CPLD의 경우에는 거의 VHDL을 사용하지 않고 작성합니다.

필자의 주관적인 견해로는 schematic으로 먼저 로직구성법을 공부한후에
vhdl혹은 verilog을 배우는것이 좋을것 같습니다.
기호와 도면은 해당로직의 동작을 직접적으로 알기쉽고 이해하기쉽게표현할수 있으며,
실제 chip 내부의 자원의 할당내용도 확인할수 있습니다.
그리고계층적인 구조에서도 동작내용을 파악하기 쉽게 해주며, 디버깅에서도 해당위치를
빠르게 파악할수 있습니다.
또한 schematic상의 로직처리를 이해한다면, VHDL상의 문법이나 구문들이 가지는
의미들을 아주 쉽게 알수 있습니다.


이 강좌에서는 simulator는 사용하지 않습니다.
사실은 필자는 simulator를 거의 사용할 줄 모릅니다.

필자는 주로 영상처리분야에 CPLD와 FPGA를 사용했었는데,
출력되어보여지는 화면과 오실로스코프를 사용하여 디버깅을 하였습니다.

필자가 잘못생각하는 것일 수도 있는데,
필자는 FPGA/CPLD에 simulator가 왜 필요한지에 대한 의문점을 가지고 있습니다.
FPGA/CPLD는바로 실행결과를 확인할수 있고, 실행결과가 설계의도와 다르다면,
즉시 수정하여 다시 실행할 수 있는데, 왜 simulation을 해야하는지 모르겠습니다.

앞으로 필요한 사항은 그때 그때 언급하며 강좌를 진행하겠습니다.

[예전글] FPGA_CPLD 배우기 2 - ISE Tool 사용법


두번째장은 Xilinx ISE tool 사용법입니다.
아래 링크에서 확인한다.
아래 링크의 예제는 ISE WebPack 7.1i가 기준이지만,
현재의 9.1i도 사용법이 달라진 부분은 거의 없습니다.
http://cgi.chol.com/~kohyc/armcpld/CPLD_Guide.htm
참고로 ISE의 schematic Editor의 사용법은 상당히 어렵고 까다롭다.
사용법이 어려운 가장 큰 이유는 초보사용자에 대한 배려가 전혀 없기 때문이다.
이 Editor는 FPGA/CPLD를 능숙하게 다루는 사람들을 기준으로 만들어져 있다.
이 editor를 익숙해지기 위해서는 먼저 Instance(로직회로)와 net(연결선)에대하여 이해해야 한다.
인스턴스는 해당 FPGA나 CPLD가 제공하는 기본로직회로나 사용자가 작성한 확장로직회로블럭이다.
마우스로 해당인스턴스를 선택한 후 오른쪽 버튼을 눌러 Object properties를 보면 InstName이 있다.
이 InstName이 아주 중요하다. 사용자가 이 인스턴스 이름을 붙이는 경우는 거의 없고, 에디터가
자동으로 이름을 붙인다.
ISE의합성과정중에 발생하는 경고/에러메시지는 이 인스턴스 이름을 기준으로 해당위치를 표시한다.
따라서 어떤 메시지상에 XLXI_형태의 문구가 있다면 해당 인스턴스가 어디 있는지 잘 찾아내야 한다.
네트는 인스턴스와 인스턴스를 연결하는 선이다.
네트는 하나의 선일수도 있고 여러선의 집합인 버스(Bus)일수도 있다.
네트에서 중요한것은 반드시 이름을 붙여야 한다는 점이다.
에디터상에서 네트(선)을 사용하면, 에디터가 자동으로 해당선이 XLXN_형태의 이름을 붙인다.
하지만 사용자는 반드시 해당 네트에 이름(해당 네트가 의미하는 기능에 해당하는 이름)을 붙여두어야 한다.
네트에 별도의 이름을 붙이지 않으면(자동으로 붙여진 이름만 사용하면) 디버깅은 거의 불가능해진다.
schematic사용시에 발생하는 대부분의 문제는 copy&paste를 시도할때 나타난다.
인스턴스는 이동하거나 복사되어도 같은 이름 혹은 새로운 이름이 자동으로 주어져고,
또한 합성결과물에서도 해당 로직이별도로 존재하게 되므로 특별한 문제가 발생되지 않는다.
하지만 NET는 이동하거나 복사될때 이름이 어떻게 될지가 중요한 문제이다.
NET의 이름에 특별한 주의를 기울이지 않는다면, 합성결과물에서 로직과 로직사이에 전혀 엉뚱한
연결이 존재하거나 존재하지 않게 되므로 NET의 이름은 항상 주의깊게 관찰해야 한다.
P.S.
에디터 사용중에 잘 모르는 사항이 있으면 마우스 오른쪽 버튼을 눌러보는것 좋다.

[예전글] FPGA_CPLD 배우기 3 - 입력/출력/입출력 핀


이번장에서는 PLD의 입력/출력/입출력 핀에 대해서 알아보자.
(앞으로는 FPGA와 CPLD를 합쳐서 PLD-Programmable Logic Device로 부른다)


2장에서 나왔던 AND/OR gate 예제는 아주 단순한 예제로 입력핀과 출력핀에 대한
사용법이나와 있다.

2장의 예제는 단지 예제일뿐 실제 PLD에서는 거의 사용하지 않는다.
이제부터 실전예제를 살펴보자.


 IDE_io_144.pdf 이 화일은 참고 자료이다.

A.출력













[그림1]

위의 그림1이 PLD내부의 전형적인 출력예제이다.
위 예제는 BW_Board CD의 CPLD예제에 들어있는 그림이다.
FD8CE는 인스턴스이고, MDI(7:0),MSEL2,MNWE,PRESET,led_out(7:0)은 net이다.
FD8CE의 역할은 schematic editor에 FD8CE를 위치시키고 오른쪽 마우스 버튼을
누른뒤 Symbol Information을 확인하면 알수 있다.
대략적인 역할은 D flip-flop가 8개 있는데, Enable과 Clear가 같이 있는 로직이다.

led_out(7:0)은 CPLD의 외부 핀으로 출력핀이다.

출력핀은A라는 출력값이 한번 write되면새로운 B라는출력값이 write되기전까지
항상 A값을 유지해야 한다.
위의 회로가MSEL2가 1이고, MNWE의 상승에지일때 MDI(7:0)을 led_out(7:0)으로
전달하는 회로이다.
일단 MNWE가 한번 올라가면(한번 write되면), 그 이후에는 MDI(7:0)이 무슨 값을
가지던 led_out(7:0)이 값은 변하지 않는다.
여기서 MSEL2는 led_out(7:0)을 선택하고, MNWE는 MDI(7:0)의 값을 led_out(7:0)을
전달하는 역할을 한다.

flip-flop는 위와 같이 data의 저장역할을 한다.

출력핀은 상당히 다루기가 쉽다.
문제는 MDI(7:0)과 MSEL2, MNWE 신호를
누가(who) 언제(when) 어떻게(how) 주는가(write)이다.
이 문제는 다음기회에 언급하기로 하자.


B. 입력



[그림2]

위 그림이 입력핀의 예이다.
모든 PLD에서 출력은 [그림1]과 거의 비슷한 형태를 갖지만,
입력핀의 사용법은 용도에 따라서 다르다. 그림2는 단지 하나의 예를 든것 뿐이다.
이 예는 PLD의 입력핀 sw_in(7:0)의 값을 MSEL3이 1일때 MDO(7:0)으로 전달하는 예이다.
BUFE8은 tri-state buffer로 E핀(MSEL3)이 1일때 data가 전달되고, 0일때는 Hi-Z(하이임피던스)이다.
Hi-Z의 뜻은 E=0일때 MDO(7:0)에는 아무것도 연결되지 않은것과 같다는 의미이다.


입력핀은 약간 어렵다.
여기서도 문제는 MSEL3과 MDO(7:0)을
누가(who) 언제(when) 어떻게(how) 가져가는가(read)이다.
이 문제 역시 다음기회에 언급한다.


C. 입출력핀

이제 위의 출력핀과 입력핀을 하나로 합쳐보자.




[그림3-1]

그림3-1은 IO_CTL이 1이면 MDO(7:0)의 값이 IN_OUT(7:0)으로 나가고,
IO_CTL이 0이면 IN_OUT(7:0)의 값이 MDI(7:0)으로 들어오는 회로이다.

하지만 실제 PLD에서는 아래와 같은 회로가 사용된다.


[그림3-2]

PLD의 입출력핀은 다른IC의 입출력핀과 연결된다.

CPU와 PLD를 연결하는 예를 들어보자.
CPU의 어드레스버스와 컨트롤(nCS,nWE,nOE)핀은 CPU의 입장에서 출력핀이다.
이 핀들은 PLD의 입력핀으로 연결된다.
CPU의 데이터버스는 CPU의 입장에서입출력핀이다.
이 핀들은 PLD의 입출력핀으로 연결된다.

하지만 보통의 경우에 CPU의 data bus에는 PLD만 연결되지 않는다.
RAM과 ROM이 연결되며 기타 다른 IC들도 연결된다.
따라서 Data Bus에는 CPU가 data를 출력할수도 있고, PLD가 출력할수도 있으며,
램과 롬이 출력할수도 있다.
하지만 동시에 두개의 IC가 Data Bus에 출력해서는 안된다.
두개의 IC가 출력할 경우에는 해당 IC들끼리 싸우다가 둘다 죽는다
(IC내부의트랜지스터가 파괴된다)

따라서 Data Bus에 Data를 출력할수 있는 IC를지정하는 교통정리가 필요하며
이 교통정리를 CPU가 담당하게 된다.
(물론 CPU가 아닌 PLD가 담당할수도 있지만, 누군가는 반드시 교통정리를 해야 한다.)

시스템 상에서 Data Bus는 여러 IC가 공유하지만, 필요한 시점에서는
단지 Data를 출력하는 IC와 입력받는 IC,
이 두 IC만이 Bus를 점유하고, 다른 IC들은이 점유를 방해해서는 안된다.

BUS를 점유하지 않은 다른 IC들은 Data BUS에 연결되지 않은것처럼 행동해야 하며
이 상태를 Tri-state상태 혹은 Hi-Z(하이 임피던스)상태라고 한다.

DATA BUS를 점유하지 않는 IC들은 해당 핀을 입력상태로 유지하면,
DATA를 입출력하는 IC들에게 방해가 되지 않는다.
이 회로가 바로 [그림3-2] 이다.


그림3-2는 필요한 시점에
IO_CTL을 1로 하면 MDO(7:0)가 IN_OUT(7:0) 으로 출력되고,
IO_CTL을 0으로 하면 IN_OUT(7:0)이 MDI(7:0)으로 입력되는 회로이다.

엄밀하게 따지면 입출력핀은 대부분의경우에 입력상태이다.
하지만 보통의 IC Datasheet는 이 상태를 Hi-Z상태라고 표시한다.

Hi-Z은 그림2의 BUFE8, 그림3-1의 BUFT8, OBUFE8의 출력측이다.
이 버퍼들은enable신호가 없으면 출력선에서 완전히 분리되어
버퍼의 존재자체가 없는것처럼 보인다.
따라서 그림2의 경우에 MSEL3가 0이면 MDO(7:0)의 값은
어떤값이 될지는 전혀 예측할수 없다.


그림3-2에서도문제는 IO_CTL과 MDI(7:0)과 MDO(7:0)을
누가(who) 언제(when) 어떻게(how) 주거나(write) 가져가는가(read)이다.
이 문제 역시 다음기회에 언급한다.

[예전글] FPGA_CPLD 배우기 4 - CPU 인터페이스

지난 3편에서는 입력/출력/입출력 핀의 사용법에 대해서 알아보았다.
이번에는 이핀들을 실제로 제어하기 위하여 PLD와 CPU의 연결방법에 대하여 알아본다.

이번글의 최종 목표는 C언어상에서
특정 어드레스에 DATA를 Write하면 해당 Data가 PLD의 외부출력핀으로 나가고,
특정 어드레스에 DATA를 READ하면 PLD의 입력핀의 값이 읽을수 있게 하는것이다.

CPU와 PLD를 연결하는 이유는 서로의 데이터 교환을 위해서이다.
데이터의 종류와 데이터의 전송속도에 따라서 다양한 연결방법이 존재한다.
하지만 가장 기본이 되는 연결방법은 PLD가 SRAM과 같이 동작하도록 연결하는 방법이다.
여기서는 이 방법에 대해서 집중적으로 살펴본다.

CPU와 PLD의 연결구성은 대략 다음 그림과 같다.


[그림1] CPU-PLD연결

거의 모든 CPU가외부 ADDRESS BUS와 DATA BUS가지고 있으며,
이들 버스의 용도는 외부메모리 ACCESS이다.
외부 메모리 ACCESS중에서도 SRAM의 ACCESS는 CPU의 가장 기본적인
기능이면서, ACCESS 방법(Protocol)이 통일되어 있는 방법이다.
모든 CPU제조업체와SRAM제조업체는 아래설명하는 통일된 방법으로
자신들의 IC가 동작하도록 제조한다.

모든 CPU Datasheet에는 외부 메모리의 READ CYCLE Timing과 WRITE CYCLE Timing이
도면으로 그려져 있다.
이 timing그림은 거의 모든 CPU가 동일한 그림이다.

또한 모든 SRAM Datasheet에는 CPU Datasheet에 그려져 있는것과 동일한 timing도면이
있다.

CPU와 PLD를 연결하기 위해서는 PLD를 SRAM처럼 동작시키면 되고,
PLD를 SRAM처럼 동작시키기 위해서는 CPU나 SRAM에 있는 timing도면대로
PLD내부를 구성하면 된다.
따라서 PLD로직을 작성하기 위해서는 SRAM timing에 대해서 완벽하게 마스터해야한다.



[그림2] SRAM READ Timing(출처 :삼성 KM62256D datasheet)




[그림3] SRAMWRITE Timing(출처 :삼성 KM62256D datasheet)


위 그림들이 SRAM의 ACCESS timing이다.

[그림1]의 구성으로 PLD를 작성한 예제가 바로 다음 PDF화일이다.


 IDE_io_144.pdf이 PDF파일을 별도의 창에 열어놓고 아래를 보기 바란다.
(참고로 이 PDF파일은 필자가 만든 ARMCPLD보드에서 직접 가져온 pdf파일이다.)

먼저 SW입력과 LED출력은 3장의 입출력을 참고한다.


pdf파일을 보면 CPU쪽 인터페이스는 MA(7:6),MD(7:0),MNCS,MNWE,MNOE signal이 있다.
nRESET와 CPU_CLK,Timer_CLK는 메모리 엑세스와 직접적인 연관은 없다.

먼저 CPU가 led_out(7:0)에 write하는 과정을 살펴보자.

CPU의 DATABUS MD(7:0)은 입력버퍼 IBUF8을 통해 MDI(7:0)으로 항상연결되어 있다.
MDI(7:0)은 FD8CE를 통해서 led_out(7:0)으로 연결된다.
따라서 CPU databus의 값은 항상 FD8CE의 입력단까지 전달된다.
이제 MNWE신호가 0에서 1로 바뀌는 순간에 databus의 값이 led_out(7:0)으로 전달될 것이다.
하지만 CPU의 모든 메모리 write신호에 이 FD8CE가 반응하면 안된다.
FD8CE는 어드레스버스에 특정 값(해당 어드레스)가 set되었을때의 MNWE에만 동작해야 한다.
MSEL2가 바로 이 신호이다.

인스턴스 D2_4E가 MSEL2를 생성해내는 어드레스 디코더이다.
인스턴스 D2_4E는 Add7번과 Addr6번의 상태를 감지해서 MSEL2/MSEL3를 선택한다.
물론 MCS가 1일때만 동작한다.

이제 이 D2_4E와 FD8CE의 동작을 [그림 3]의 write cycle과 연계해서 살펴보자.

CPU는 먼저 자신이 write하려는 번지의 address 버스와 databus를 먼저 set한다.(twc의 왼쪽 화살표부분)
([그림 3]은 SRAM의 datasheet이기 때문에 SRAM의 입장에서 입력데이터의 유효구간-data valid만
표시되어 있다. 하지만 사실은 CPU의 입장에서는 address bus와 data bus를 동시에 set한다).
그다음에 CPU는 nCS를 0으로 만든다.
PLD내부에서는 MNCS가 0이 되면(CPU가 nCS를 0으로 만들면) inv를 거쳐서 MCS가 1이된다.
MCS가 1이 되면 그때의 MA(7:6)의 상태에 따라서 MSEL2나 MSEL3가 1이된다.
만일 MSEL2가 선택되었다면(MA(7:6)=10)이라면 FD8CE가 enable된다.
그리고 CPU는 MNWE를 0으로 만들지만 이때는 아무 변화가 없다.
CPU가 MNWE를 1로 만들면 MDI(7:0)의 값이 led_out(7:0)에 set된다.
그다음에nCS도 1로 올라간다.

이렇게 해서 메모리 write cycle은 끝났다.
이 cycle에서 가장중요한 순간이 MNWE가 0에서 1로 올라가는 순간이다.
MNWE가 1로되는 순간의 데이터버스 값이 FD8CE의 출력값이 된다.

이 순간에 data bus가 안정적이지 못하거나,
CPU의 출력핀에서부터FD8CE의 CLK핀까지 변화하는데 지연시간이 발생하거나,
MNWE signal에 노이즈가 발생한다면 data가 정상적으로 write되지 못한다.

이제 실제 C언어에서는 다음과 같이사용하면 led_out(7:0)에 write할수 있다.

#define cpld_led_write (*(volatile U16 *)0x06000080)
cpld_led_write = 0xff;

위와 같은 형태로 write하면 0xff가 led_out(7:0)에 set된다.
어드레스의 MA(7:6)=10인 형태가 0x06000080의 8로서 나타났다.

이와 같이 CPU의 write가 이루어진다.
CPU의 write는 read에 비해서 상당히 쉬운편이다.

이제 CPU가 sw_in(7:0)을 읽는과정을 살펴보자.
CPU의 데이터버스는 입출력버스이고, CPU가 제어권한을 가지고 있다.
3장에서 설명한것처럼 데이터버스에 아무 IC나 마구 data를 출력해서는 안된다.
PLD도 마찬가지로 CPU의 제어(명령)에 절대적으로 복종해야 하고,
CPU가 출력하라고 할때만 data를 출력해야 한다.

바로 CPU의 제어컨트롤을 담당하는 부분이 OBUFT8이다.
OBUFT8의 T가 0이면 MDO(7:0)이 MD(7:0)으로 출력된다.
T가 1이면 OBUFT8의 출력측과 MD(7:0)은 연결이 끊어진것처럼 OBUFT8은 동작한다.
이렇게 끊어진 상태처럼 보이는것이 Tri-State혹으 Hi-Z이다.

이제 그림2의 read cycle을 참조하며 CPU의 read과정을 살펴보자.

먼저 CPU는 address를 셋트하고, ncs를 0으로 만든다.
PLD내부에서는 D2_4E에 의해 address가 선택된다.
MA(7:0)=11이라면 MSEL3가 1이된다.

CPU가 nCS를0으로 만드는것만으로도 sw_in(7:0)은 BUFE8을 거쳐 MDO(7:0)을 거쳐서
OBUFT8의 입력단까지도달하게 된다.
CPU가 nOE를 0으로 만들면 OBUFT8의 T에 연결된 NAND2B1의 출력값은 0이된다.
따라서 MDO(7:0)의 값이 MD(7:0)으로 출력된다.
그리고 CPU는 nOE가 1로되는 순간의 MD(7:0)의 값을 읽어들인다.
nOE가 0에서 1로 되는 순간에 CPU내부에있는 flip-flop이 set된다.
따라서 nOE가 nWE와동일하게 flip-flop을set하는역할을 한다.

nOE가 1로 되는 순간 OBUFT8은 tri-state가 된다.
이부분은 아주 미묘한 문제를 발생시킨다.
CPU가 tri-state상태 이전의 값을 가져갈지, tri-state상태 이후의 값을 가져갈지에 따라서
정상값 혹은 쓰레기 값을 가져가게 된다.
실제로는 CPU내부에서 먼저 nOE가 1로 set되고, CPU핀을 통해, PCB거친후에
PLD를 거치고, nand2b1을 거친후에 OBUFT8까지 도달한다.
이때의 지연시간때문에 별다른 문제를 발생시키지는 않는다.

하여튼 위와 같은 과정을 거쳐서 read과정이 이루어진다.

이제 실제 C언어에서는 다음과 같이사용하면 sw_in(7:0)을 read할수 있다.

#define cpld_sw_read (*(volatile U16 *)0x060000c0)
indata=cpld_sw_read;

어드레스의 c가 MA(7:6)='11'을 의미한다.

이상과 같이 3장에서 제기했던 누가, 언제, 어떻게 data를 read/write하는지 알아보았다.

여기서 문제가 되는 부분이 있다.
이 PLD는 본인이 직접 만든 SRAM의 일종이라고 할수 있다.
모든 반도체 메이커가 자신이 만든 반도체에 timing chart를 datasheet에 공개하는것처럼,
위에서만든 PLD의 access속도가 얼마인지를 PLD로직을 만든 사람은 반드시 알고있어야 한다.
즉 그림2와 그림3에서 나온 각각의 timing값들을 계산할수 있어야만
실전에서 CPU와 인터페이스 할수 있다.

Xilinx ISE에서는 합성된PLD의 timing과 관련한 report를 만들어준다.
하지만 ISE가 만드는 timing REPORT는 PLD칩 내부의 동작 timing이지,
PLD칩 외부의 동작 timing을 만들지는 않는다.
따라서 PLD Logic 작성자는 PLD칩내부의 timing report를 바탕으로
PLD칩외부의 timing report를 직접 작성할수 있어야한다.
그래야만 내가 만든 PLD로직이 8051과 붙일수 있는지, ARM CPU와
붙일수 있는지 파악할수 있고,
고성능 CPU과 연결할 경우에 CPU의 RAM(이경우는 PLD) ACCESS CYCLE을 결정할수 있기 때문이다.

이 report를 만드는 일은 본 강좌에서는 언급하지 않는다.
이부분은 여러분들의 숙제이다.

[스크랩] RASPBERRY PI 와 Xilinx FPGA 연결 성공


RASPBERRY PI 와 Xilinx FPGA 연결 성공  나의 관심정보
2013/08/30 21:06  수정  삭제
작성자: fftkrr
출처 카페 > 라즈베리파이 | fftkrr
원문 http://cafe.naver.com/pipc/4920
안녕하세요.

처음인사드립니다.

그동안 이 카페에서 많은 도움을 받았습니다.  


제가 이번에 라즈베리파이와 Xilinx spartan3E FPGA (XC3S500E PQ208)를 연결하는 보드를 만들었습니다.

아래 사진처럼 생긴 보드인데요.. 

FPGA Configuration은 라즈베리파이의 GPIO를 통해서 slave parallel모드나 slave serial모드로 설정합니다.

설정이 끝나면 라즈베리파이에서 GPIO를 External Memory Interface를 읽고쓰는것처럼 흉내내서 FPGA의 내부 register나 IO핀들의 상태를 읽고 쓸수 있게 만들었습니다.

방금 작은 보드의 스위치와 LED상태를 라즈베리파이에서 읽거나 쓸수 있는 테스트를  끝냈습니다.

라즈베리파이는 관련자료가  풍부하고, 컴파일러가 내장되고 네트웍 연결이 있어서 개발하기가 정말 편했습니다.






2013년 9월 2일 월요일

[예전글] [RE] 앞으로 돌팔이 백신 관련 글은 삭제합니다.

예전글 - 천리안 게시판에서 가져온 글입니다.

제목 : [RE] 앞으로 돌팔이 백신 관련 글은 삭제합니다.
등록자 : 고영창 등록일 : 2011-06-14 01:55:35 PM
조회 : 240
진짜만세력에 바이러스가 있는게 아니라,
알약이 돌팔이 의사라서 그렇습니다.

제가 올린 파일 날짜가 2008년 12월 8일인데,
이 당시에는 없던 바이러스가  시간이 지나서 바이러스가 생길리는 없지요.

최근 들어 수많은 바이러스 방지 프로그램들이 등장하고, 서로 경쟁하면서
정상적인 멀쩡한 기능을 바이러스로 오진하는 백신프로그램들이 많이 등장하고 있습니다.
(이와 관련한 기술적이고, 구체적이고 복잡한 내용이 아주 많지만,
이 게시판에서 일반인을 대상으로 설명하기에는 어울리지 않습니다.)

멀쩡한 프로그램을 바이러스로 오진하는것도 문제지만,
아주 중요한 프로그램과 데이터를 사용자의 동의없이 삭제해버리는 것은 더 큰 문제입니다.

이런 돌팔이 백신 프로그램은 절대로 사용하면 안됩니다.
다른 백신 프로그램을 사용하는것을 강력히 추천드립니다.

알약은 공짜라는것과 기존의 인지도때문에 컴맹들이 사용하고 있지만,
실제로는 절대 사용해서는 안되는 돌팔이 백신입니다.

사회에서도 멀쩡한 의사면허 가진 돌팔이 의사만나면
패가망신은 물론, 목숨까지 위태롭습니다.

앞으로 돌팔이 백신과 관련된 글은 무조건 삭제합니다.

[예전글] 서기 622년 - 회회력/칠정산외편

예전글 - 천리안 게시판에서 가져온 글입니다.

제목 : 서기 622년 - 회회력/칠정산외편
등록자 : 고영창  등록일 : 2009-09-11 11:57:50 PM
조회 : 669
칠정산 외편을 보면...

회회력의 역원은 622년 7월 17일(진짜만세력, 그레고리력 날짜)이고,
진짜만세력에 의하면 이날 일식(JD=1948437.765)이 있었고. 한달뒤인 8월 16일에도 일식(JD=1948467.178)이 있었다.
 나사(NASA)의 일식 사이트를 보면 이 두번의 일식이 실제로 일어났지만, 관측지역은 남극주변에서만 가능했었다.

그리고 622년은 춘분날에 합삭시각이 있었다.(JD=1948319.487)

그냥 사실이 이렇다..

이것은 너무 재미있는 사실인데..
그당시 회회력을 만든 사람들은 심혈을 기울여서 이 사실을 알아냈을텐데..
그 이후에 이 사실은 아무에게도 전달되지 않았고..
아직까지 전세계에 아는 사람이 아무도 없다..
이제 내가 공개했으니.. 모두가 알게 되었다..

근데.. 이 내용이 무슨 의미인지 아는 사람이 있으려나??




[예전글] 일식의 예측

예전글 - 천리안 게시판에서 가져온 글입니다.
제목 : 일식의 예측
등록자 : 고영창  등록일 : 2009-07-27 03:25:03 AM
조회 : 583
일식의 예측 방법은 크게 관측에 의한 예측과 계산에 의한 예측으로 구분할수 있다.

관측에 의한 예측은 관측계기를 이용하여 삭망이 있기 1달 전부터 삭망 바로 1일 전까지의 황도(태양이 지나가는 길)와 백도(달이 지나가는 길)를 잘(?) 관찰하면, 다음번 삭망시에 일식이 발생하는지를 알수 있다.
 좀 더 구체적으로는 황도상의 태양의 위치와 백도상의 달의 위치가 다음 삭망일에 같은 지점(황백교점)에 위치한다면 일식이 발생한다.  좀더 정확하게 따지면, 삭망일자를 아는 것만으로는 불완전하고, 삭망시각을 정확하게 알야야만, 일식의 발생여부를 알수 있다.
 그런데, 그믐날과 초하루날에는 달이 전혀 보이지 않기 때문에 삭망시각을 정확하게 알 수 있는  방법은 전혀 없다. 일식이 일어나는 시점이 정확한 삭망시각이지만, 이 시각은 일식이 일어나야지만 알수 있고, 일식이 일어나지 않는다면 삭망시각을 아는것은 관측에 의해서는 불가능하다.
 이렇게 관측에 의해서 일식이 예측되었다 해도, 삭망시점을 정확히 모르기 때문에 실제 일식이 관측지점에 발생할지, 발생하지 않을지는 누구도 알수 없다.
 조선시대의 사서나, 고려시대, 삼국시대의 사서에 보면 간혹 일식을 예측하였으나, 일식이 실현되지 않은 이유가 바로 이 때문이다. 사실은 일식이 실현되었지만, 한반도 주변에서 실현된 것이 아니라, 남반부의 어딘가에서나 혹은 한반도가 밤일때 일식이 실현되었다.
 백제의 역사기록에 일식을 예측하였는데, 이 일식이 우리나라에서 나타나지 않았다 해서 백제의 역사기록이 틀린것이 아니다. 백제의 천문학자는 관측을 올바르게 했고, 올바르게 예측했지만, 정확한 삭망시각을 몰랐을 뿐이고,  단지 이 일식이 남아메리카에서 발생하것 뿐이다. (어쩌면 남아메리카도 백제의 영토였다고 주장할수 있을지도 모르겠다.)

 일식을 계산으로 예측할수 있게 된것은 1800년대 후반무렵부터이다.
 이 때부터 과거에 있었던 모든 일식/월식과 미래에 발생할 일월식을 모두 계산하여 일식이 발생했던, 혹은 앞으로 발생할  시각과 위치를 계산할수 있게 되었다. 1800년대 말에 계산했던 합삭 시각의 정밀도는 그다지 정확하지 않았지만(합삭시각 오차 대략 30~40분정도), 그래도 일식의 시각과 위치를 꽤 정확하게 예측할수 있게 되었고, 인류는 이때부터 일식의 발생구조를 완벽하게 이해하게 되었다.
 계산으로 예측이 가능하게 된 이유는 케플러가 발견한 타원궤도 법칙과 속도면적일정법칙이 가장 큰 공헌을 했으며, 타원궤도로 움직이는 두물체(태양/지구)의 해석과 타원궤도로 움직이는 세물체(태양/지구/달)의 해석 방법, 삼각함수의 미분적분 계산법등이 모두 동원되어 가능하게 되었다.
 계산에 의한 일식 예측을 하기 위해서 가장 필요한 사항은 정밀한 삭망시각을 계산하는 것이다. 삭망시각을 계산한다해도, 그 시각이 정확하게 맞는지의 여부를 아는 것은 지구 내에서는 불가능한 일이다. 그 이유는 일식이 벌어지는 날을 제외하고는 삭망시각에 지구에서 달은 보이지 않기 때문이다. 따라서 삭망시각 계산의 정확성은 일식이 있는 시각에나 확인이 가능하다.
 정확한 삭망시각을 계산 할 수 있다면, 마찬가지 계산방법으로 황도와 백도의 교점의 위치도 정확하게 계산할 수 있고, 교점시각과 삭망시각의 거리를 계산하면 일식의 여부를 알수 있다. 삭망시각과 교점시각의 거리가 일식 범위이내이면, 삭망시각의 태양의 위치, 달의 위치, 태양과 지구와의 거리, 달과 지구와의 거리를 계산하면,  일식을 볼수 있는 지역을 알수 있게 된다.

 일식 예측의 핵심은  관측에서나 계산에서나 양쪽 모두 정확한 삭망시각을 아는 것이 가장 중요하다.
 정확한 삭망시각을 계산해 낸것은 서양천문학에서 먼저 이루어 졌지만, 중국과 한국의 천문학자들도 정확한 삭망시각을 알아내기 위해서 엄청난 노력을 기울였었다.
 국가적으로 달의 움직임을 관측하였고, 관측에 의해서 일식을 예측하였지만, 때로는 그 예측이 적중하였고, 때로는 그 예측이 실패하였다.
 동양의 천문학에서 태양의 운동(지구의 공전)은 기원전부터 아주 상세하게 밝혀져 있었지만, 달의 운동은 끝내는 정확하게 밝혀지지 못했다.

 서양천문학이 삭망시점을 정확하게 계산하기 전까지는 동양천문학에 비해서 한 참을 뒤떨어져 있었다.
이 당시에 청나라와 조선에서는 시헌력을 사용하여 태양과 달의 위치를 계산하였는데, 서양의 태양과 달의 위치를 계산하는 역법(그레고리력이 아니다)은 시헌력에 비해 한참 못 미치는 역법이었다. 시헌력이전에 중국에서는 수시력(대통력이라는 이름도 있지만, 수시력과 전혀 다를바가 없다)을 사용했고, 조선에서는 수시력과 칠정산내외편을 사용했는데, 수시력과 칠정산내외편에는 지구의 공전을 타원궤도로 해석하는 내용이 있다.
 중국과 한국의 천문학자들은 정확한 삭망시각을 계산하려고, 수백년 아니 거의 천년에 가까운 달의 움직임과 관련된 기록을 사용하였다. 하지만 구체적인 달의 운동상태를 알지 못했기 때문에 천년에 가까운 기록자료가 실제 예측에는 별도움이 되지 못했다.
 그리고, 현재의 우리들은 이 자료들을 가지고만 있을뿐, 이 자료들을 사용하려는 시도조차하지 않고 있다.



[예전글] 부활절에 관하여

예전글 - 천리안 게시판에서 가져온 글입니다.

제목 : 부활절에 관하여
등록자 : 고영창  등록일 : 2008-11-14 03:07:54 PM
조회 : 677
1.    부활절에 관하여
부활절은 춘분 후에 보름달이 뜬 다음 일요일이다서양에서는 순태양력인 율리우스력과 그레고리력을 사용하였는데순태양력에 들어있지 않은 달의 운동을 반영한 것이 부활절이다그러므로 그레고리력(율리우스력)에 들어 있는 음력성분이 바로 부활절이다.
동양 천문학에서는 1년의 계산 기점을 동지에 두고 계산하지만이와 달리 서양 천문학에서는 1년의 계산 기점을 춘분에 두고 계산한다그리고 서양에서는 음력을 사용하지는 않지만, 1년의 첫 번째 보름날만큼은 기념하여 축제를 벌이고보름날이 지나고 첫번째 일요일이 부활절이다.
부활절 날짜 계산은 실제 춘분의 입기 시각과 달의 망 시각에 의해서 계산되지 않는다. AD(기원후) 4세기 무렵로마의 수도사들이 19 7윤월법에 따라 만들어낸 월령 변화표에 의해 보름날의 날짜가 계산되어 있고이에 따라 수천년분의 부활절 날짜가 결정되었다.필자가 직접 춘분과 보름달의 시각을 정밀하게 계산하여 부활절 날짜를 계산해 보았지만서양 사람들이 사용하는 부활절 날짜와 많이 틀렸다특히 춘분과 달의 망 시각이 같은 날인 년도와 달의 망 시각과 일요일이 같은 날인 년도는 부활절 날짜가 다른 경우가 많았다확인해 보니 19 7윤월법에 따라 수천년분의 음력 망 날짜가 AD4세기 무렵 이미 결정되어 있었다.
그런데, AD4세기부터 1200여년이 지난 AD16세기 무렵이 되자 율리우스력의 오차(율리우스력은 100년에 하루씩 실제보다 계산값이 길어지는 오차가 있다)가 누적되었고, 19 7윤월법의 오차( 218년에 하루씩 실제보다 계산값이 짧아지는 오차가 있다역시 상당히 누적되었다따라서 AD4세기 무렵에 결정해 놓은 부활절 날짜가 AD16세기 무렵에는 춘분이나 보름달과는 전혀 상관없는 날짜가 되어 버렸다이 때문에 1582년에 율리우스력을 그레고리력으로 변경하고부활절 날짜를 다시 계산하여 결정해 놓았다.
그레고리력은 약 3300년에 하루의 오차를 갖지만, 19 7윤월법은 여전히 약 218년에 하루의 오차를 가진다따라서 그레고리력으로 변경 후 500여년이 지난 현재는 망시각이 약 2~3일정도 달라지게 되었다이 때문에 춘분과 망이 같은 날인 년도나 망과 일요일이 같은 날인 년도는 AD16세기에 결정한 부활절 날짜와 현재의 절기와 망을 이용하여 계산한 부활절 날짜가 다르게 된다.
하지만 부활절 결정 공식은 AD4세기에 결정한 계산방식과 AD16세기에 수정하여 결정한 날짜를 (현재의 해와 달의 위치와는 전혀 상관없이) 여전히 사용하고 있다.

[예전글] 진짜만세력의 오차관련 사항 - 음력 날짜가 다른 달

예전글 - 천리안 게시판에서 가져온 글입니다.

제목 : 진짜만세력의 오차관련 사항 - 음력 날짜가 다른 달
등록자 : 고영창 등록일 : 2008-04-02 05:29:12 PM
조회 : 1504
최근에 한국천문연구원의 공식 음력 날짜와 진짜만세력의 음력날짜를
비교했습니다.

표준시를 동경 135도로 바뀐뒤(1912년 이후)부터 2050년까지 천문연구원의 날짜와
진짜만세력의 날짜가 다른 음력월은 아래 표의 6달뿐입니다.

다른 이유를 알기 위해서 정밀하게 검토한결과
미해군성 천문대가 발표한 합삭시간을 알수 있게 되었고,
아래 표와 같습니다.

진짜만세력상의 합삭시간과 미해군천문대의 합삭시간의 차이는
최대 30분이지만,  합삭시간이 0시에 걸쳐있게되면서 날짜가
바뀌게 되었습니다.

아래 표에 나와 있는 음력월은 표에 나와 있는것처럼
진짜만세력과 천문연구원의 날짜가 하루씩 앞뒤로 밀리게 되므로,
주의해서 사용해야 합니다.

미해군성천문대 합삭시간과 진짜만세력의 합삭시간중에 어느 것이
더 정확한지를 검증해줄 만한 사람이 있었으면 좋겠습니다.


진짜만세력의                        미해군성천문대              한국천문연구원
합삭시간                               계산합삭시간                   공식날짜
(한국시간)                              (한국시간)      차이
1976/11/21(음력10/1)- 23:53     11/22-00:11      18분       1976/11/21음력09/30
2015/08/15(음력07/1)- 00:00     08/14-23:53     -07분       2015/08/15음력07/02
2016/02/09(음력01/1)- 00:09     02/08-23:39     -30분       2016/02/09음력01/02
2017/02/27(음력02/1)- 00:23     02/26-23:57     -26분       2017/02/27음력02/02
2019/11/26(음력11/1)- 23:41     11/27-00:05      24분       2019/11/26음력10/30
2044/11/20(음력10/1)- 00:02     11/19-23:57     -05분       2044/11/20음력10/02