안녕하세요
디바이스마트의 스키조프레니아형 인간 표본 솔다입니다
지난시간에는 FND 디코터 '설계'에 대해 알아봤는데요
이번에는 저번에 산출한 결과를 통해
직접 PLD 프로그래밍을 통해 가상으로 구현해보도록 하겠습니다
서문은 개념만 빠르고 짧게 짚고 가겠습니다
Quick! Quick!
-
PLD란?
『PLD(Programmable Logic Device)는 제조 후 사용자가 내부 논리 회로의 구조를 변경할 수 있는 집적 회로이다.』
더이상 설명할 게 없는 문장입니다
논리 회로에는 멀티플랙서, 가산기, 디코더 등 다양한 회로가 있는데요
각 기능에 맞게 디자인된 IC들은 이미 제조되고 있지만
사용자가 커스텀 할 수 있다면 어떨까? 하는 소자가 바로 PLD입니다
AD변환이나 인터럽트등의 편의기능을 생략한 대신
처리속도가 빠른 MCU라고 생각하셔도 됩니다
-
짜잔! 시뮬레이션 될 주인공인 'GAL16V8'입니다
IC야 외관이 다 그게 그거처럼 생겨서 딱히 특정할만한 건 없습니다
이 친구는 PLD 중에서도 'GAL'이라는 분류에 속하는 소자인데
GAL은 Generic Array Logic의 약자입니다
PLD의 하위분류가 너무 많으니 쉽게 생각해서
프로그램을 굽고 지우기가 용이한 소자라고 생각해주시면됩니다
설명 끝!
(개요는 끝났지만 진짜는 이제부터 시작ㅎ)
-
'Microchip'이라는 회사에서 'WinCUPL'라고 하는
PLD프로그래밍을 위한 개발툴을 배포하고있습니다
위 링크를 눌러서 다운로드 페이지로 가봅시다
이런 사이트가 노출 되구요
저기 화살표에 보이는 빨간 글자를 누르면 바로 다운로드 됩니다
다운로드 받은 설치파일입니다
실행시켜줍시다
설치 준비과정을 거치고
설치마법사 시작합니다
다음~
라이선스 관련 내용입니다
다음~
여기에는 이름과 소속을 써줍니다
다음~
설치 경로를 선택합니다
저는 기본경로인 C드라이브의 하위폴더로 했습니다
다음~
설치 타입을 선택하는데요
위에서부터 표준, 최소, 사용자지정입니다
저는 표준으로 설치했습니다
다음~
카피라이팅 파일이라는데 보이지는 않네요
중요하지 않으니 다음~
이제서야 진짜로 설치가 됩니다 ㅎㅎ
컴퓨터 : 나를 재시작 하겠니? 아니면 나중에 할래?
옛날 프로그램이니 어떻게 될지 몰라서 저는 바로 재시작 했습니다
불친절하게도 데스크톱 아이콘(바탕화면)을 생성해주지 않아서
경로로 직접 들어왔습니다
저와 동일한 경로로 설치하셨다면 위와같은 경로로 들어가주셔서
'WinCUPL'를 실행시켜주세요
???
갑자기 켜지다 말고
소속 조직과 시리얼넘버를 쓰라고 나오는데요
당황하지 않으셔도 됩니다ㅎㅎ
다운로드 받은 페이지에 떡하니 시리얼 넘버가 공개되어있습니다
소속과 시리얼 넘버를 쓰고 OK~
드디어 프로그램이 실행된 화면입니다
디코더를 구현하기 위해서는 프로젝트를 생성해야합니다
[File]-[New]-[Project] 경로로 클릭해주세요
디자인 속성을 써달라고 하는데
본인에게 맞게 변경해주실 부분은 변경해주시고
위 내용이랑 동일하게 작성하셔도 무관합니다
단, 맨 마지막 부분인 Device만 'G16V8A'로 채워주시면 됩니다
입력핀 몇개니? 4개요
출력핀은 몇개니? 7개요
그럼 핀 노드는 몇개니? 안써요~
사실 지금 한 설정은 프로그램 작성할 때 수정할 수 있어서
무시하시고 직접 코딩하셔도 됩니다
프로젝트가 생성된 모습입니다
아까 위에 프로젝트 생성할 때 Device를 'G16V8A'로 작성했는데요
이걸 보는 경로는 [Options]-[Devices]입니다.
들어가보시면 패키지타입이랑 제조사, 장치를 선택하실 수 있고
장치까지 선택하셨다면 좌측 하단에 나오는 문자열이
프로젝트 생성시에 기입해야하는 Device명입니다
GAL16V8은 'Lattice'라는 회사의 제품인데
선택할 수 있는 제조사가 'Atmel'밖에 없어서
동일 기능의 제품인 ATF16V8을 선택해준 모습입니다
-
여기서 잠깐!
PLD는 HLD라는 고유한 언어를 사용하는데요
C언어랑 조금 닮아 보이긴 하지만 문법이 조금 다릅니다
주석같은 불필요한 부분을 생략하고
실제로 사용한 두가지 문법만 설명드리겠습니다
1. 핀 선언하기
PIN 핀번호 = 이름;
핀 번호 자리에 이름을 지어줄 핀 번호를 입력하고
'이름'에 원하는 문자열을 넣어서 선언해줍니다
띄어쓰기나 공백으로 구분해주시는게 중요하고
맨 뒤에 ;(세미콜론)은 반드시 찍어주셔야합니다
입력핀/출력핀/입출력핀 모두 선언 방식은 동일합니다
2. 논리연산하기
출력핀 = 논리식;
PLD는 사칙연산을 사용하지 않습니다
오로지 논리식으로만 연산합니다
기호
|
문법
|
의미
|
연산순위
|
!
|
!A
|
NOT
|
1
|
&
|
A & B
|
AND
|
2
|
#
|
A # B
|
OR
|
3
|
$
|
A $ B
|
XOR
|
4
|
위와 같이 정해진 논리 연산자를 사용합니다
논리식에는 위에서 선언했던 핀들의 이름을 변수라고 생각하시고
논리식을 작성해주시면됩니다
-
그런데, 어느 핀을 쓸 것인가??
GAL16V8의 핀맵입니다
왼쪽은 전부 입력핀이고 오른쪽은 입출력 핀입니다
저는 2~5번핀을 입력 A, B, C, D로 사용하고
19번~13번 핀을 출력 a, b, c, d, e, f, g로 사용했습니다
-
다시 프로그램으로 돌아와서
이전에 간소화했던 논리식대로 출력핀에 대입해줍니다
밑에 있는 코드를 그대로 복사하셔서 붙여 넣으셔도 됩니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
Name fnd_decoder ;
PartNo 00 ;
Date 2019-05-28 ;
Revision 01 ;
Designer Engineer ;
Company devicemart_eng ;
Assembly None ;
Location ;
Device G16V8A ;
/* *************** INPUT PINS *********************/
PIN 2 = A;
PIN 3 = B;
PIN 4 = C;
PIN 5 = D;
/* *************** OUTPUT PINS *********************/
PIN 19 = out_a;
PIN 18 = out_b;
PIN 17 = out_c;
PIN 16 = out_d;
PIN 15 = out_e;
PIN 14 = out_f;
PIN 13 = out_g;
out_a = A # C # B&D # !B&!D;
out_b = !B # !C&!D # C&D;
out_c = B # !C # D;
out_d = A # !B&C # !B&!D # B&!C&D # C&!D;
out_e = !B&!D # C&!D;
out_f = A # B&!C # B&!D # !C&!D;
out_g = A # B&!C # !B&C # C&!D;
| cs |
컴파일을 통해 JED 파일을 생성해줍니다
사진과 같은 경로를 눌러주시거나 단축키 [F9]를 누르셔도 됩니다
컴파일하기 전에 프로젝트를 저장할거냐고 묻는데
저장해줍시다 OK~
컴파일 결과입니다
결과에 에러가 있으시다면 문법을 다시 확인해주세요
여기까지 하시면 PLD 프로그래밍까지는 완료 된겁니다
야호~
-
그런데 프로그램이 제대로 구동하는지 어떻게 확인하죠??
좋은 질문입니다!
사실 'WinCUPL'을 설치할 때 시뮬레이션 프로그램도
함께 설치가 되었습니다
'WinSim'이라는 프로그램인데요
이 프로그램을 이용해서 출력 결과를 시뮬레이션 해봅시다
[Utilities]-[WinSim]을 선택해 실행해줍니다
WinSim을 실행한 화면입니다
[File]-[Open]을 통해 아까 컴파일한 프로젝트를 열어줍시다
컴파일이 정상적으로 되었다면 JED파일과 함께
SIM파일도 생성되었을 겁니다
위에서 만든 프로젝트는 해당 경로에 저장되는데요
파일이 보이지 않습니다
모든 확장자 보기로 변경합니다
확장자가 SIM인 컴파일된 파일을 열어줍니다
이런 격자모양의 화면이 보이는데요
여기에 입출력 신호를 볼 수 있게 추가해줘야합니다
[Signal]-[Add Signal]으로 들어가주시면
이런 창이 뜹니다
아까 WinCUPL에서 선언했던 핀 이름들이
목록에 있을건데요
어짜피 다 노출시킬거기때문에 OK를 눌러줍니다
아래처럼 빈칸이 나올때 까지요
(엔터를 꾹 누르셔도 됩니다)
이 상태가 되면 더이상 추가할 수 있는 선언된 핀이 없는 상태입니다
[Cancel]이나 [Done]을 눌러 빠져나와줍니다
ABCD의 네개의 입력과 out_a~out_g의 7개의 출력이
모두 추가되된 모습입니다
0부터 9까지 입력의 경우의 수는 10가지인데
현재 1phase밖에 볼 수 가 없기때문에
나머지 경우의 수 9단계를 추가해줍시다
[Signal]-[Add Vector]를 눌러줍니다
경우의 수가 0부터 9까지 총 10가지인데
이미 1phase는 기본으로 있으니 나머지 9단계를 추가해줍니다
각 phase는 나중에 추가하고 제거할 수도 있습니다
각 phase마다 입력을 정해줘야하는데요
ABCD 4개의 입력을 BCD코드 0~9에 대응하도록 세팅해줬습니다
설정방법은 원하는 칸에 우클릭해서 LOW나 HIGH로 세팅할 수 있습니다
위와 같이 입력 10가지 경우의 수를 모두 세팅하고나면
드디어 시뮬레이션이 가능해집니다
[Simulator]-[Run Simulator]를 눌러줍니다
에러 유무가 나올텐데요 에러가 있다면 하단의 로그를 보고
정정해주시면 됩니다
Warning은 무시하셔도 좋습니다
OK를 누르면?
짠~..?
한줄밖에 보이지가 않네요???
이 현상은 WinSim의 작은 버그인 것 같습니다
격자의 간격을 조절해주면 모든 phase가 다 잘 보이게 됩니다
상단 빨간 네모부분이 격자 간격을 조절할 수 있는 버튼입니다
여기서 아무 버튼을 눌러 주시면?
짜잔~ 모든 결과가 표시됩니다
파란색이라 구분하기 좀 힘들긴 하지만
ABCD 입력이 0000일 때 out_g만 LOW로 보입니다
설계했던 그대로의 결과네요 대성공입니다!
-
여기까지 FND 디코더의 프로그래밍 및 시뮬레이션을 해봤습니다
기초적인 부분만 다뤘기 때문에 그렇게 어렵지 않으셨을 겁니다
이제 간단한 회로는 직접 설계 및 시뮬레이션이 가능하실건데요
다음시간에는 실제 GAL 소자에 프로그램을 write해서
회로에 적용(!)해보도록 하겠습니다
감사합니다~
1 댓글
좋은 정보 감사합니다.
답글삭제