다음블로그에 썼던 내용을 옮깁니다. (블로그 통합 중 ㅎㅎ)


gal20v8b-25lpn을 사용하여 4 bit counter를 마련해보았다.
gal20v8의 register mode를 사용하기 위해서는 WinCPUL에서 device type을 20v8ms로 선택해야 한다.
TestCounter.PLD 파일의 내용은 다음과 같다.


Name     TestCounter ;
PartNo   00 ;
Date     2008-11-19 ;
Revision 01 ;
Designer Engineer ;
Company  bro ;
Assembly None ;
Location  ;
Device   g20v8ms ; // 레지스터 모드로 선택

 

pin 1 = CLK;  // 레지스터 모드시 1번 핀은 항상 Clock이다.
pin 2 = RSTn; // 그냥 리셋을 한번 마련해보았다.

Pin [15..18] = ![C0..3]; // 출력을 NOT해서 만들었다.

Pin 19 = En;  // 그냥 19번 핀은 출력 핀을 combinational output으로 특정 카운트 값에서 En이 뜨도록 했다.


C0.d =  !RSTn // 15번 출력 핀 부터 D-FF 출력으로 사용한다. CLK가 high가 되면 동작되는 sequential logic이다.
      #  !C0;

C1.d =  !RSTn
      # (!C1 & !C0 )
      # ( C1 &  C0 );

C2.d =  !RSTn
      # (!C2 & !C1 & !C0 )
      # ( C2 &  C0 )
      # ( C2 &  C1 );

C3.d =  !RSTn
      # (!C3 & !C2 & !C1 & !C0 )
      # ( C3 &  C0 )
      # ( C3 &  C1 )
      # ( C3 &  C2 );


En = !C3 & C0;


 이를 시뮬레이션 해보면 다음과 같다.

 

잘 나오는것이 확인되었다 컴파일하면 testcounter.jed파일이 나온다.
이를 TOP2004 롬라이터를 이용하여 구웠다.

그리고 D-FF 출력 15번핀부터 18번핀 4개를 LED로 연결한 후 , CLK 1번 핀은 DIP switch를 pull down 저항 방식으로 연결하여 손가락으로 수동 클럭을 주도록 마련하였따;

 

 

첫번째 핀을 손으로 OFF시켰다가 ON시키면 CLK이 하나 들어가서 동작된다.

 

 

또 내려따가 올리면 두번째 LED가 켜진다.

 

GAL을 통해서 4비트 카운트 한것을 동영상으로 마련해보았다.

근데 DIP switch로 손으로 하다보니 잡음이 좀 들어가는거 같다. 어쨋든 대충 되는거 같다.

맨 오른편이 PIN 15번 그리고 왼편이 En이다. 이건 빼고 봐야 한다.



'KB > TTL' 카테고리의 다른 글

GAL20v8 를 활용한 4 bit counter  (0) 2009.02.02
dip input, 7 segment, GAL test  (0) 2009.02.02
Combination 74LS181, 74S182  (0) 2009.01.30
7 segment와 DIP switch 사용  (0) 2009.01.20
오실레이터 1Mhz와 4bit 193 카운터 사용  (0) 2009.01.20
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


다음블로그에 썼던 글 통합합니다.

GAL20V8B-25LPN 즉 GAL20v8을 샀다.

 

이것은 Lattice사에서 나온 제품으로 Gate Array Logic이라는 의미며 PAL과 함께 PLD (Programable Logic Device)라고 불린다.

내부에 10개의 Macrocell이 존재하며 한 Macrocell은 한개의 D-Flip Flop과 and, or, not등의 조합회로 뭉치로 구성된다.

특히 GAL20V8B는 24핀 DIP타입 칩으로 아래와 같이 핀이 배열된다. 

 

 

 

 GAL20V8B는 세가지 모드로 동작 가능하다.

 

- Registered mode: IO/Q 핀이 D-FF 출력 핀으로 되며 레지스터를 사용한 순차회로 프로그래밍이 가능하다.

                            이때 1번 pin I/CLK는 D-FF의 CLK로 사용되며 13번 I/OE바는 Register D-FF출력 Output Enable이 된다. (OE바가 0이면 출력되는 중, 1이면 출력 안되지만 내부에 D-FF값은 동작 중을 의미)

- Complext mode: Output only 또는 I/O 모드로 사용된다. 내부는 조합회로 모드와 비슷 (아직 잘 모르겠다. ㅋ)

- Simple mode: Combinational 조합회로 모드이다. 1번 pin I/CLK는 Input으로 사용되며 13번 I/OE바도 Input으로 사용된다. IO/Q는 조합 출력으로 사용된다.

 

이런 세가지 모드는 GAL compile할 때 컴파일러 옵션에 디바이스 타입을 다음과 같이 적어주면 설정이 된다.

atmel용 GAL 컴파일러 무료 프로그램 WinCUPL을 사용하면 CUPL이며 simple모드로 사용하려면 장치 타입을 G20V8AS로 하면된다.

 

 

무료 도스용 프로그램 PLDASM 인가 OPALjr21은 뭘로 설정해야 하는지 아직 잘 모르겠다.

 

일딴 WinCUPL로 해봤다. 컴파일 옵션에 보면 atmel GAL만 되지만, 그냥 atmel GAL20V8B로 연결하면 되는거 같다.

GAL 프로그래밍 절차는 다음과 같다.

 

- GAL프로그램 작성 (WinCPUL 사용)

- GAL프로그램 시뮬레이션 테스트 (WinCUPL 사용)

- GAL프로그램 컴파일하여 jed파일 생성 (WinCUPL 사용)

- jed파일을 GAL 프로그래머로 칩에 굽기 (TOP2004 Rom writer 및 TopWinEn을 사용)

 

WinCUPL에서 프로젝트 새로 생성하고 다음과 같이 작성했다.

이번 GAL 프로그램은 simple모드로 작성하였다. 따라서 Device 줄에 g20v8as라는 디바이스 타입을 선택하였다.

 

GALTEST.PLD

-----------------------------------------------------------------------

Name     galtest ;
PartNo   00 ;
Date     2008-11-15 ;
Revision 01 ;
Designer Engineer ;
Company  bro ;
Assembly None ;
Location  ;
Device   g20v8as ;

 

pin [1,2] = [sel_1, sel_2];    /*입력 핀 할당*/
pin [15..21] = [b,a,f,g,c,d,e]; /* 출력 핀 할당 7segment로 들어간다*/
/*
7 segment
 --A--
|     |
F     B 
|--G--|
E     C
|     |
 --D--
anoe type: active low
*/

[a,b,c,d,e,f,g] =    ( (!sel_1 & !sel_2) & 'b'0000001 )    /* 0 1111110 */
                   # ( ( sel_1 & !sel_2) & 'b'1001111 )    /* 1 0110000 */
                   # ( (!sel_1 &  sel_2) & 'b'0010010 )    /* 2 1101101 */
                   # ( ( sel_1 &  sel_2) & 'b'0000110 );   /* 3 1111001 */

-----------------------------------------------------------------------

대충 소스는 입력핀,출력핀을 할당하고 이름을 메겨준다.

그리고 출력핀 = 입력핀 연산자 입력핀 이런식으로 해주면된다.

!는 not, #는 or, &는 and이다.

특히 쉽게 프로그램 하기 위해서 GAL출력 pin15부터 21까지를 7segment의 옆으로 놓았을때의 핀 배열에 맞춰서 이름을 매겨줬다.

 

컴파일했더니 에러 없다.

 

시뮬레이션해봤다.

 

 

sel_1과 sel_2가 00이면 0이니까 7 segment의 각 핀 a, b, c, d, e,f, g들에 대해 0000001로 설정된다. 7 segment anode type이기 때문에 0이 세그먼트에 불이 들어오는것이라 이렇게 설정하게 된다.

 

일단 컴파일하면 GALTEST.JED가 생성된다.

이 텍스트 파일만 있으면 TOP2004같은 롬라이터로 GAL칩을 구울 수 있다.

 

롬라이터로 굽기

이번에 ebay에서 산 TOP2004에는 굽기 프로그램으로 TopWinEn이 들어있다.

TOP2004로는 gal20v8을 구울수 있다. (다행이다. gal20v10을 구울수 있다고 리스트엔 뜨나 어느 러시안 블로거 포스트에서 안된다는 소리도 들린다; 역시 중국제 30달러.. 싸구려라 그런가보다 - 배송료는 37달러였음; )

 

TopWin프로그램을 실행한 후 Load 툴바 버튼을 누르고 아까 생성한 GALTEST.JED파일을 연다.

 

 Type 툴바 버튼을 눌러서 GAL Class를 선택하고 LATTICE사의 GAL20V8을 선택한다.

 

그러면 W/R을 눌렀을때 나오는 창이 자동으로 나온다. Run만 누르면 된다.

가끔 Blank configure error라든가 뭐시기 중국제 냄새가 물신 풍기는 에러들이 자주 난다.

PC를 꺼따켜주시거나, USB를 빼따 다시 꼽고, 프로그램은 당연히 꺼논 상태에서.. 등등 잘 해보면 다시 잘될때가 있는거 같다.

 

 이제 GAL안에 내가 짠 로직이 들어가 있다.

 

 

풀다운 저항 로직으로 DIP 입력 발생하기

 

야호. 그럼 DIP switch의 두개를 ON시키면 1을 발생시키고 OFF시키면 0을 발생시키게 한 후 이를 GAL의 pin 1,2 입력으로 연결해주자.

이 때 DIP 스위치는 내부적으로 그냥 ON하면 연결하고 OFF하면 끊어버리는 것이기 때문에 Vcc (1) 선을 DIP에 넣고 ON하면 1이 가지만 OFF하면 0 GND가 가는게 아니라 그냥 끊어진 상태가 된다 -_-... 이때엔 풀 다운 저항 신공을 펼쳐야 한다.

Vcc (1) -- DIP --- 저항 ---- GND 로 연결하고 DIP과 저항 사이의 선을 따다가 쓰면 DIP이 ON되면 1이 되고 OFF되면 0이 나오게 된다.

 

 

 그리고 GAL 출력 pin 15 IO/Q 부터 21까지 7개를 7 segment의 a,b,c,d,e,f,g를 연결한다.

이때 7 segment 태워먹지 않게 저항을 붙여준다. (이게 젤 중요 -0-)

 

 

아래는 DIP 스위치 0번과 1번을 움직이면서 (DIP스위치 쪼그맣고 안움직여서 화가난다 참아야한다. 힘줘 움직이다보면 DIP스위치가 빠진다. ㅋ)

 

 

 

 

 

 

 

'KB > TTL' 카테고리의 다른 글

GAL20v8 를 활용한 4 bit counter  (0) 2009.02.02
dip input, 7 segment, GAL test  (0) 2009.02.02
Combination 74LS181, 74S182  (0) 2009.01.30
7 segment와 DIP switch 사용  (0) 2009.01.20
오실레이터 1Mhz와 4bit 193 카운터 사용  (0) 2009.01.20
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



현재 제가 갖고 있는 4 bit ALU chip은 74LS181N입니다. 이 4 bit ALU 여러개를 연달아 붙이면 12,16,32 bit ALU가 되는데, 그러기 위해서는 CLA (Carray Look Ahead) chip인 74S182가 필요합니다.

다음은 181 몇개 붙이느냐에 따라 추가적으로 들어가는 시간 지연에 대한 표입니다.
당장 8bit ALU는 182없이 그냥 하위 4bit ALU 181의 Cn을 상위 181의 입력 Carry로 넣어주는 ripple carry방식으로 하면 될거 같네요. ㅎㅎ..

아래는 SN74S182의 datasheet에 있는 첫 페이지 핀 배열 그림입니다.


181 ALU에서 발생되는 Carry Propagate와 Carry Generate, Carry를 입력으로 받아서 진짜(?) Carry를 출력합니다.


아래는 Hansen씨가 공개한 74S182 verilog behavioral model 입니다.
CN은 Cn, CNX는 Cn+x, CNY는 Cn+y, CNZ는 Cn+z입니다.
PB는 Carry Propagate input이고 GB는 Carry Generate input인것 같습니다.

/****************************************************************************
* *
* VERILOG BEHAVIORAL DESCRIPTION OF THE TI 74182 CIRCUIT *
* *
* Function: Carry Lookahead Generator *
* *
* Written by: Mark C. Hansen *
* *
* Last modified: Dec 10, 1997 *
* *
****************************************************************************/

module Circuit74182 (CN, PB, GB, PBo, GBo, CNX, CNY, CNZ);

input[3:0] PB, GB;
input CN;

output PBo, GBo, CNX, CNY, CNZ;

TopLevel74182b Ckt74182b (CN, PB, GB, PBo, GBo, CNX, CNY, CNZ);

endmodule /* Circuit74182 */

/*************************************************************************/

module TopLevel74182b (CN, PB, GB, PBo, GBo, CNX, CNY, CNZ);

input[3:0] PB, GB;
input CN;

output PBo, GBo, CNX, CNY, CNZ;

assign PBo = (PB[0]|PB[1]|PB[2]|PB[3]);
assign GBo = ((GB[0]&GB[1]&GB[2]&GB[3]) |
(PB[1]&GB[1]&GB[2]&GB[3]) |
(PB[2]&GB[2]&GB[3]) |
(PB[3]&GB[3]));
assign CNX = ~((PB[0]&GB[0]) |
(~CN&GB[0]));
assign CNY = ~((PB[1]&GB[1]) |
(PB[0]&GB[0]&GB[1]) |
(~CN&GB[0]&GB[1]));
assign CNZ = ~((PB[2]&GB[2]) |
(PB[1]&GB[1]&GB[2]) |
(PB[0]&GB[0]&GB[1]&GB[2]) |
(~CN&GB[0]&GB[1]&GB[2]));

endmodule /* TopLevel74182b */


음 아래 데이터 시트에 각 핀의 진리표 및 로직이 나오는데 대충 비슷한거 같네요.
(사실 선이 많아 제대로 안 보았네요 ㅋㅋ.. 아래 로직의 (7) P 출력은 assign PBo = (PB[0]|PB[1]|PB[2]|PB[3]); 와 같은 정보만 보았네요 ㅎㅎ;;; )



181과 182는 아래처럼 연결하면 될듯 합니다.
예를들어 16비트 ALU를 만드려면 181 4개와 182 하나를 연결합니다.

32비트는 다음과 같이 연결합니다.

다음은 Ripple-Carry과 CLA를 혼합한 예이다.

다음은 64bit ALU예이다. (ㅎㄷㄷㄷ; )



다음은 74181 세 개와 한개의 74182를 이용한 12bit ALU를 애플릿 예제로 보여주고 있습니다.
TTL-series 74181+74182 ALU+CLA demonstration



보다 자세하게 왜 Carry만 있지 않고 Carry Propagate, Generate가 필요한지 등은 Building 32bit ALU by cascading 74181 4bit ALU blocks에서 나젤큐스님의 한글 블로그 포스트로 친철하게 소개하고 있습니다.


저는 181은 eBay를 통해서 불가리아로 부터 구입했습니다;;.. 근데 도저히 182는 구할 방도가 없더군요..
그런데 생각해보니 GAL을 이용해서 182 로직을 생성해서 쓰면 되지 않을까 하는 생각이 문득들더군요.

verilog 소스도 있겠다, 쉽게 GAL 소스로 바꾼 후 테스트 해봐야 할 것 같습니다.
근데 당장은 8bit ALU를 만드는 거니까 182없이 그냥 181을 그냥 ripple carry방식으로 붙여도 될거 같네요; ㅋㅋㅋ
ps. 향후에 곱셈기도 만들어야 할지 모르겠는데...
검색하다보니 An 8-by-8 Bit Multiplier 라는 좋은 웹페이지가 걸려나오네요. 74181과 74183 (dual binary adder)를 활용하였네요.
ps2. 최소한의 TTL 프로세서 관련한 좋은 웹페이지도 있네요. 일단 엮어놔야지.
A Minimal TTL Processor for Architecture Exploration


'KB > TTL' 카테고리의 다른 글

GAL20v8 를 활용한 4 bit counter  (0) 2009.02.02
dip input, 7 segment, GAL test  (0) 2009.02.02
Combination 74LS181, 74S182  (0) 2009.01.30
7 segment와 DIP switch 사용  (0) 2009.01.20
오실레이터 1Mhz와 4bit 193 카운터 사용  (0) 2009.01.20
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


다음 블로그에 포스팅 한 것을 옮깁니다.


http://princess.kongju.ac.kr/digitalmain/dvlec/textbook/chap05/digital05_1.htm

  7 세그먼트는 캐소드와 애노드 방식이 있다. 내꺼는 1056A 끝의 A는 애노드를 의미한다.

 

 

 

애노드 방식은 3번과 8번 핀이 Vcc로 연결되고 나머지는 - GND로 연결되면 된다.

캐소드 방식은 반대로 연결하게 된다.

 

다만 주의할 점은 저항을 잘 붙여줘야 한다.

안붙였더니만 좀 이따가 뜨거워지더니 맛이 갔다...;; 7세그먼트 한놈 사망.. 잘가라... ㅠㅠ

330ohm을 붙였다.

그리고 상위 4개 선들에 대해서는 4 bit DIP switch를 연결했다.

DIP 스위치는 아무것도 없고 그냥 정말 연결했다 땟다 그게 다다. 

모두 온 시키니까 선이 연결되어서 불이 다 들어온다.

 

마지막거 off씨키니까 그에 해당하는 라인이 꺼진다.

 

 

'KB > TTL' 카테고리의 다른 글

GAL20v8 를 활용한 4 bit counter  (0) 2009.02.02
dip input, 7 segment, GAL test  (0) 2009.02.02
Combination 74LS181, 74S182  (0) 2009.01.30
7 segment와 DIP switch 사용  (0) 2009.01.20
오실레이터 1Mhz와 4bit 193 카운터 사용  (0) 2009.01.20
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


Daum 파워에디터

다음 블로그에 포스팅한 것을 옮깁니다.

오늘 드뎌 오실레이터를 포함하여 나머지 TTL들이 입수되었다.

 

간단하게 (하지만 또 헤매는 ㅋㅋ) 1MHz 오실레이터와 74139 (4bit counter)를 이용하여 사람 눈에 보일정도의 깜빡임의 LED를 만들었다.

 

먼저 sunny SCO-020 1MHz오실레이터는 아래처럼 발이 세개 있는 DIP타입으로

검은 점이 있는 걸 기준 1번 핀으로 해서 (이건 연결안한다)

검은점 오른편을 핀7 GND -선에 연결

검은점 위쪽을 핀14 VDD +에 연결

검은점 대각선 오른편 위 핀8을 CLK 출력이 된다.

 

 

 

 

그리고 이 클럭은 1MHz 즉 1초에 1024 * 1024 번 깜빡이는거라 눈에 안뵌다.

따라서 카운터를 이용해서 분주하도록 하였다.

카운터는 193 4bit counter를 사용하였다.

 

 

Vcc는 +로 연결하고 GND는 -로 연결하고

초기값은 관심없으니까 Load 를 항상 +연결한 후 Input Data A, B, C,D는 연결안했다.

0으로 초기하는 Clear핀도 그냥 -로 연결하였다.

Count Up은 오실레이터 CLK를 연결하고

Count Down은 사용안하니까 연결안하고 Borrow도 안생기므로 연결안했다.

출력 QB, QA등 QC QD도 안사용하니까 연결안했다.

Carry는 다음 139카운터의 Count Up CLK로 연결하였따.

 

 

따라서 193 4bit counter를 계속 값을 올린 후 carry가 발생하면 그 케리를 다음 193 카운터의 CLK으로 입력하는 식으로

연결해서 (cascade) 1MHz를 16으로 나눈 값으로 분주 (느리게) 클럭을 발생시키도록 하였다.

 

 

 

이렇게 쭈욱 연결하고 마지막엔 대충 값을 맞추기 위해서 출력 QD, QC, QB, QA 중 두번째 자리수  QB 값을 마지막 139카운터의 CLK로 연결하였다.

 

 

 

다연결한 화면이다.

 

 

카운터 대따 많이 들어갔다.

첫번째 카운터 Carry로 1024*1024 = 1048576 (1MHz) 의 16분주 인 65536Hz가 되고

다음 것 16분주로 4096Hz 그리고 다음거로 256Hz 그리고 또 다음거 네번쨰 카운터는 QD로 연결했네.; (그런지도 몰랐네)

QD니까 ;;

0000
0001
0010
0011
0100
0101
0110
0111
1000 <- 이때 바뀜

1001

 ...

결국 2분주한거가 되네.

즉 네번째 카운터의 QD는 128Hz CLK가 나오고 이를 다섯번째 193이 받아서 QB를 내주니까;;;

0000 0값
0001
0010 1값
0011
0100 0값
0101
0110 1값
0111
1000 0값

8분주 한 것이 되니까 128 /8 = 16Hz가 다섯번째 193의 QB로 나오고 이를 마지막 카운터가 받아서;;

마지막카운터의 QA는 16Hz (1초에 16번 꺼따켜짐) QB는 8Hz, QC는 4Hz QD는 2Hz, (꺼다켜지는게 1Hz 1초가 됨)

Carry는 1Hz 꺼따켜지는건 2초

맞나..

 



 

'KB > TTL' 카테고리의 다른 글

GAL20v8 를 활용한 4 bit counter  (0) 2009.02.02
dip input, 7 segment, GAL test  (0) 2009.02.02
Combination 74LS181, 74S182  (0) 2009.01.30
7 segment와 DIP switch 사용  (0) 2009.01.20
오실레이터 1Mhz와 4bit 193 카운터 사용  (0) 2009.01.20
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST


티스토리 툴바