아두이노 – 나도 해보는 LED 깜빡이기

 

[아두이노 강좌] 02. LED 밝기 변경하기

 

회로를 다음과 같이 구성합니다.

스케치툴을 키고 다음같이 입력 후

 

void setup() {

// put your setup code here, to run once:

pinMode(13, OUTPUT);

}

 

void loop() {

// put your main code here, to run repeatedly:

digitalWrite(13, HIGH);

delay(1000);

digitalWrite(13, LOW);

delay(1000);

}

 

 

1번 버튼과 2번 버튼을 차례로 누른 뒤

 

아두이노를 보니까 LED가 잘 깜빡이네요..

 

 

여기서 함수 설명

 

pinMode() : 디지털 핀의 모드를 출력 또는 입력으로 설정하는 함수입니다.

digitalWrite() : 디지털 핀의 전압을 HIGH또는 LOW로 설정하는 함수입니다. 이 함수를 사용하는 핀은 꼭 pinMode 함수를 이용해 출력 모드로 설정해야 합니다.

delay() : 아두이노 보드를 일정 시간 멈추는 함수입니다.

 

 

두 번째 해본 것

 

회로도

 

다음과 같이 하면 LED가 조금씩 밝아졌다가 다시 어두워진다. 이때 9번핀을 사용해야 함을 유의하자.

 

 

 

여기서 함수 설명

 

analogWirte() : 아날로그 출력 핀의 전압을 설정하는 함수입니다. 전압을 0~5v까지 설정할 수 있습니다. 반드시 ~표시가 있는 핀을 사용해야합니다.

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

 

 

 

 

 

흔히 찾을 수 있는 LDO나 일반 레귤레이터의 데이터시트를 보면,

대부분 저런 형태의 모습을 하고 있는 구조를 볼 수 있다.

정전압회로에는

1.기준전압

2.비교기

3.출력단

이렇게 3단계로 크게 분리할수 있습니다.

실제로 저렇게 구성하여 PWM,PFM방식, 스위칭 방식등을 이용해서

Step-up, Step-Down DC to DC Converter를 제작 할 수 있다.

위의 경우 기준전압은 나와 있지 않지만 Vref(Voltage reference)부분으로 기준전압을 인가하면 비교기(opamp)는 두 입력단자(반전입력및 비반전입력)이 똑같은 전압이 되기 위해 출력단(2개의 TR)을 제어하게 됩니다. 그렇게 되면 결국 Vo x R1/(R1+R2) = Vref 가 되는 것입니다. 달리 표현하자면 Vo = Vref(1+R2/R1)이 됩니다.

여기서 일반 레귤레이터와 LDO의 차이점은 위의 Q1 소자와 회로구성입니다.

일반레귤레이터는 대부분 Common Collector 방식을 사용합니다. 이런 경우 Ve = Vb - 0.7V가 되고, opamp에서 아무리 높은 전압을 줘도 출력은 입력보다 0.7V이상 떨어집니다.

반면에 위와 같은 경우는 Common Emitter 방식을 사용합니다. 이때는 Vce(sat) 전압의 차이와 있으면 되는데 Vce(sat)은 약 0.1~0.2V이므로 위의 CC방식보다 0.5V이상 유리해 지죠.

실제로 일반 레귤레이터는 입출력 전압차가 2V이상을 요구하는 반면LDO는 0.5~0.8V전압차만 있으면 정상동작을 합니다.

다만 입출력전압차가 적은 경우는 LDO가 유리하지만 입출력 전압차가 3V이상인경우는 LDO나 일반 레귤레이터 방식이다 둘다 같은 손실이 발생합니다.

 

출처 : http://cafe.naver.com/deepcore/55

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

위는 제가 사용하는 LCD입니다.


그리고 다음은 Pin 연결 방법입니다.


? LCD Pin #1 VSS 또는 그라운드 <-> GND

? LCD Pin #2 파워 서플라이<-> +5V

? LCD Pin #3 LCD 밝기<-> 가변저항 ( LCD Pin #3은 글자의 밝기를 조절하는 Pin입니다. 가변저항 없이 GND에 연결하니 최대 밝기로 글자가 나타납니다.)

? LCD Pin #4 레지스터 선택<-> GPIO Pin #25 wiringPi 6

? LCD Pin #5 리드라이트 컨트롤 버스<-> GND

? LCD Pin #6 인풋 레지스터에 쓰기가 가능하게 함<-> GPIO Pin #24 wiringPi 5

? LCD Pin #7 ~ #10 은 연결하지 않음 ( 8개 Line으로 제어할 때 사용되는 Pin 입니다.)

? LCD Pin # 데이터 11 <-> GPIO Pin #23 wiringPi 4

? LCD Pin # 데이터 12 <-> GPIO Pin #17 wiringPi 0

? LCD Pin # 데이터 13 <-> GPIO Pin #21(Rev B. : gpio 27) wiringPi 2

? LCD Pin # 데이터 14 <-> GPIO Pin #22 wiringPi 3

? LCD Pin # 백라이트 15 <-> +5V

? LCD Pin # 백라이트 그라운드 16 <-> GND

Register select (RS)핀 : 이 핀은 출력중인 data가 LCD 메모리에서 어디로 가야 할지를 결정한다. 2가지 장소가 있다. data register와 instruction(명령) register가 있다. data register는 화면으로 갈 정보를 담아두는 장소이고 instruction register는 LCD controller가 담에 할 일에 대한 지침,명령을 찾는 장소이다.

Read/Write (R/W) pin : 말 그대로 입력인지 출력인지를 결정하는 핀이다.

Enable pin : 문자그대로 레지스터에 쓰기가 가능하게 하는 핀이다.

 

8 data pins (D0 -D7) : 쓰기를 할때 레지스터에 입력하고 있는 것은 이 핀들의 상태 즉, HIGH or LOW이다. 읽기를 할때는  이 핀들의 값 즉(high,low) 이다.

 

Display constrast pin (Vo), power supply pins (+5V and Gnd) and LED Backlight (Bklt+ and BKlt-) :

LCD에 대한 전원 입력 핀이고, 대조도를 조절하는 핀 그리고 LED 백라이트를 키고 껴는 핀이다.



LCD 라이브러리 참조 https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/


LCD Library


Part of wiringPi is a library to allow access to parallel interface LCD displays (Those that use the popular Hitachi HD44780U or compatible controllers)



Two LCD displays connected to a Raspberry Pi


LCD Connected to Pi in 4-bit mode

LCD connected to Pi in 8-bit mode


LCD 8-bit 모드로 Pi로 연결 방법

  라이브러리는 사용하는 것이 간단하다. 하지만 LCD를 전선 연결 시키는 것은 약간 복잡할 수도 있다. 그리고 이것은 LCD 하나 말고 여러 개를 연결 시키는 것도 가능하다.

8비트 모드에서는 10개의 GPIO 핀이 필요하고 각 추가적인 LCD마다 단지 한 개의 핀이 더 필요하다. 그래서 17개의 GPIO 핀이면 최대 8개의 LCD를 연결 할  수 있다.

만약 4비트 인터페이스 모드를 사용한다면 12개의 LCD를 연결 할 수 있다. 근데 와이어링이 상당히 복잡해 질 것이다.

  LCD 디스플레이는 5V 또는 3.3V로 할 수 있다. 그러나 만약 우리가 5V 디스플레이를 사용하면 우리는 라즈베리파이의 데이터를 디스플레이에 출력 할 수 없다. 그래서 5V는 쓰지않는 것을 추천한다.

 그리고 항상 디스플레이에 있는 R/W 핀을 그라운드에 연결해야한다 이유는 디스플레이를 read-only로 하기 위해서이다.


LCD 라이브러리를 사용하기 위해서 다음의 include를 반드시 해야한다.


#include <wiringPi.h>

#include <lcd.h>


  첫 번째 wiringPi를 초기화 해야 한다. 그리고 LCD 라이브러리는 pinMode 함수를 부를 것이다. 그러나 이거는 만약에 이미 gpio 프로그램을 사용하고 wiringPiSetupSys() 메카니즘을 사용하면 pinMode 함수를 부를 필요가 없다.


? int  lcdInit (int rows, int cols, int bits, int rs, int strb,
        int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7) ;


  이것은 주요한 초기화 함수 이다. 어떤 LCD 함수를 사용하기 전에 반드시 호출해야한다.


  rows와 cols는 디스플레이의 행과 열의 수이다.(예를 들어 2, 16, 4, 20). Bits는 인터페이스의 비트수이다. (4 또는 8). rs와 strb는 디스플레이 RS pin 숫자와 strb는 Strobe (E) 핀의 숫자이다. (Strobe 는 E 라고도 함 data enable) . 라즈베리파이의 d0~d7은 data핀을 뜻한다. 4비트 모드를 쓰면 오직 d0~d3까지만 쓸 수 있다.

  핀 숫자는 GPIO 핀 숫자에 맞는 wiringPi 핀 숫자를 의미한다. 이것은 wiringPiSetup 함수를 사용해서 그렇다.

  리턴 값은 ‘handle’이고 추후에 모든 LCD 라이브러리에 관련된 call에 사용된다.  만약 -1이면 잘못 파라미터가 쓰여진 것이다.








4비트짜리 인터페이스를 쓰는 LCD의 예제이다.


fd = lcdInit (2, 16, 4,  11,10 , 0,1,2,3,0,0,0,0) ;


8비트짜리 인터페이스를 쓰는 LCD의 예제이다.

fd = lcdInit (2, 16, 8,  11,10 , 0,1,2,3,4,5,6,7) ;


? lcdHome (int handle)

? lcdClear (int handle)


These home the cursor and clear the screen respectively.

? lcdPosition (int handle, int x, int y)

Set the position of the cursor for subsequent text entry.

? lcdPutchar (int handle, uint8_t data)

? lcdPuts (int handle, char *string)

? lcdPrintf (int handle, char *message, …)



이러한 싱글 ASCII 캐릭터 출력, 스트링, 또는 포맷이 있는 스트링은 일반적인 printf 포맷팅 명령어를 사용할 수 있다.

지금까지 인풋 커서 조절과 스크롤링 디스플레이를 위한 데이터 래핑은 다루지 않았다. 이것은 디스플레이를 다루기 위해서 알아야할 것이다.


이것은 wiringPi안에 있는 예제를 참조하면 된다.


만약 2번째 3번째 디스플레이가 있으면 전선 연결시 E pin만 제외하고 병렬로 연결해야한다. 각각 디스플레이는 E핀은 다른 GPIO 핀에 연결해줘야한다.


LCD_test.c 파일


#include <stdio.h>
#include <wiringPi.h>
#include <lcd.h>


int main (void)
{
   
int disp1;

   
if (wiringPiSetup () == -1)
   
return 1;
 
    disp1 = lcdInit (
2, 16, 4, 6, 5, 4, 0, 2, 3, 0, 0, 0, 0);
    sleep (
1);

    lcdPosition (disp1,
0, 0);
    lcdPuts (disp1,
"Hello World");

    lcdPosition (disp1,
0, 1);
   
//lcdPuts (disp1, "01010101");
    lcdPrintf(disp1, "good job");
   


   
return 0 ;
}



라즈비안에서 컴파일 방법은 다음과 같다.


gcc -o LCD_test LCD_test.c -lwiringPi -lwiringPiDev



그리고 실행 방법


sudo ./LCD_test















잘 뜨죠?






전체 연결도입니다. 다음에는 늘솜 커넥터를 써야겠네요.







블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

라즈베리파이 GPIO 강좌

라즈베리파이 GPIO 강좌 : 04. Output 테스트 (LED 출력, C언어)

 

 

1. 학습내용

: 라즈베리파이 GPIO 를 다루어보기로 하겠다. 이번 강좌에서는 GPIO의 Output 기능을 테스트하기로 하자. 이를 위해서는 간단히 LED를 연결하고 LED를 키고 끄기는 프로그램을 해 볼 것이다. 사용언어는 C 언어이다.

 

2. 개발환경

: 개발환경은 하드웨어적으로는 라즈베리파이 모델B 버전2 512RAM 환경에, 소프트웨어적으로는 라즈베리파이의 공식 OS라고도 할 수 있는 데비안 리눅스계열의 Raspbian “wheezy”의 “2013-02-09-wheezy”버전을 사용하기로 하겠다. Raspbian “wheezy” 설치방법은 이전 강좌 “05. Raspberry Pi 퀵스타트 (OS 설치 및 테스트 구동)” 을 참고하기 바란다. 또한, 사용되는 언어로는 C언어를 이용할 생각이다. 이는 Raspbian “wheezy”의 “2013-02-09-wheezy” 버전을 설치하면 기본 설치되어 있다. (GCC)

그리고 이번에는 “Gordons Projects” 라는 블로그를 운영하는 곳에서 C언어를 지원하는 “wiringPi” 라이브러리를 이용할 예정이다. 설치 방법은 아래와 같다.
1) 일단, 라즈베리파이의 업데이트 및 업그레이드를 실시한다.

sudo apt-get updatesudo apt-get upgrade

 

2) 소스관리툴 git 를 다운로드한다.
(오픈소스 https://github.com/WiringPi/WiringPi 의 소스를 체크아웃하기 위해서)

sudo apt-get install git-core

 

3) “wiringPi” 프로젝트를 통째로 받아온다.

git clone git://git.drogon.net/wiringPi

 

4) 빌드 및 설치를 진행한다.

cd wiringPi./build

 

5) 설치가 잘 되었는지 아래의 명령어로 확인해 본다.

gpio -v gpio readall

 

wiringPi 라이브러리 설치 완료!

 

3. LED 회로

: 이번 GPIO Output 테스트에 사용될 GPIO는 GPIO 23번, 24번이다. 이는 각각 P1 헤더핀의 16번, 18번핀에 해당된다. 회로도는 아래와 같이 구성하도록 하자. 브레드보드에서 작업해도 되고, 별도의 기판에 납땜을 해도좋다.

우선, LED 2개, 저항 220~330옴을 아래와 같이 라즈베리파이의 P1 헤더핀의 16번, 18번핀에 연결해주도록 하자. 아래의 회로도는 GPIO의 Output 값을 High 로 설정해 주면 LED가 On, Low로 설정해 주면 Off가 되는 구성이다.

(※ 참고로 LED는 아래 그림과 깉이 다리가 짧은 쪽이 Cathode – , 긴 쪽이 Anode + 이다. )

 


4. 프로그램 작성

: 이번LED 테스트는 C언어로 작성해 보고자 한다. 매우 간단하니 천천히 따라해 보자. 우선, 위와 같은 회로를 구성한 후 전원을 넣고, 라즈베리파이를 구동하자. 자~ 그럼 쉘에서 아래의 명령을 실행하며 프로그램을 작성해 보고 LED를 켜보도록 하자.
1) 자신의 작업 폴더 생성 및 이동 (이전 강좌에서 생성하였다면 생략)

mkdir gpio-testcd gpio-test

 

2) 프로그램 작성 (편집기는 vi, nano, Leafpad 등 원하는 것을 사용한다. )

: 프로그램 주의사항으로는 “wiringPi” 의 라이브러리의 경우 자체적인 핀맵을 가지고 있다. 따라서 위에 첨부한 핀맵 중 wiringPi pin 이라고 적혀진 녹색핀에 맞게 프로그램을 짜야한다.

nano

#include <stdio.h>#include <wiringPi.h>#define LED1 4 // BCM_GPIO 23#define LED2 5 // BCM_GPIO 24int main (void){  if (wiringPiSetup () == -1)  return 1 ;  pinMode (LED1, OUTPUT) ;  pinMode (LED2, OUTPUT) ;  for (;;)  {    digitalWrite (LED1, 1) ; // On    digitalWrite (LED2, 1) ; // On    delay (1000) ; // ms    digitalWrite (LED1, 0) ; // Off    digitalWrite (LED2, 0) ; // Off    delay (1000) ;  }  return 0 ;}

위 내용은 GPIO 23번, 24번핀을 출력핀으로 설정해주고 두 LED를 모두 ON 시킨 후, 1초 대기한다. 그 후 다시 Off 시키는 내용이다. 이 내용을 전부 입력해주고, “gpio-test1.c” 라는 이름으로 저장해주자.

3) 프로그램 컴파일

gcc -o gpio-test1 gpio-test1.c -lwiringPi

: 위의 컴파일 명령을 실행해 주면 gpio-test1 이라는 실행 파일이 생성된다.

 

5. 프로그램 실행

: GPIO 관련 프로그램 실행은 항상 루트 권한으로 실행해줘야 한다. 이를 실행해 주면 GPIO23, 24번에 연결된 LED가 모두 켜진 후, 1초 대기, 그리고 두 LED가 모두 꺼지는 작업을 반복 수행하게 된다. 프로그램 종료는 Ctrl + C 로 종료하면 된다.

sudo ./gpio-test1

이로써 간단히 라즈베리파이의 GPIO 기능을 이용한 LED 제어를 해보았다.

다음 강좌에서는 스위치를 이용하여 입력 신호를 받아 보도록 하자.






참고자료

[1] “라즈베리파이 공식 사이트”, http://www.raspberrypi.org/
[2] “라즈베리파이 위키미디어 설명”, http://en.wikipedia.org/wiki/Raspberry_Pi
[3] “Embedded Linux Wiki”, http://elinux.org/
[4] “공식 판매점 Element14″, http://downloads.element14.com/raspberryPi1.html?COM=raspi-group
[5] “공식 판매점 RS Componts”, http://uk.rs-online.com/web/generalDisplay.html?id=raspberrypi
[6] “공식 판매점 Allied Electronics”, http://www.alliedelec.com/lp/120626raso/
[7] “element14의 레즈베리파이 커뮤니티”, http://www.element14.com/community/groups/raspberry-pi
[8] Embedded Linux 커뮤니티의 “RPi Tutorials”, http://elinux.org/RPi_Tutorials
[9] “RASPBERRY PI INFORMATION AND VIDEOS”, http://raspi.tv/
[10] “Raspberry Pi Spy”, http://www.raspberrypi-spy.co.uk/
[11] “RaspiHub”, http://www.raspihub.com/
[12] “Adafruit Blog”, http://www.adafruit.com/blog/category/raspberry-pi/
[13] “Raspberry Pi Pod”, http://www.recantha.co.uk/blog/
[14] “bcm2835″, http://www.open.com.au/mikem/bcm2835/
[15] “Gordons Projects”, https://projects.drogon.net/raspberry-pi/wiringpi/

 

End.

written by Yoonseok Pyo
http://robotpilot.net/

http://cafe.naver.com/openrt

http://www.rasplay.org/


이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 Unported 라이선스 에
따라 이용할 수 있습니다.



저도 한번 해보았는데 잘되네요.


유의할 점은 반드시 저항을 좀 작은거 쓰셔야되요.


전 저항 330옴짜리 썼답니다.



블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

라즈베리파이 GPIO 강좌

라즈베리파이 GPIO 강좌 : 01. GPIO 소개 및 핀배치

2013.03.01

 

1. 라즈베리파이 GPIO 소개

소형 PC 라즈베리파이는 USB, 이더넷, HDMI 출력, 영상출력, 사운드출력 등의 기능을 갖고 있는 하나의 작은 컴퓨터이다. 가격이 저렴하고, 작은 크기이지만 그 성능은 간단한 OS를 돌리고 동영상을 보고, 인터넷 서핑을 하는 목적에는 전혀 문제가 없는 완전한 컴퓨터인 것이다.

더욱이, 재미있는 점은 단일 마이크로세서와 같이 입출력 신호를 제어할 수 있는 포트가 있다는 것이다. 범용적인 목적으로 입/출력을 담당하는 GPIO (General Purpose Input / Output) 를 가지고 있으며, SPI 통신, I2C 통신, UART 통신 등도 갖추고 있다. 이는 마이크로프로세서를 다루는 사람들에게는 흥미로운 일이 아닐 수 없다. 왜냐하면 일반적으로 마이크로세서는 간단한 리얼타임OS(RTOS) 정도 올리던 것을 전부였는데 라즈베리파이는 데비안계열의 기능 축소판이긴 하지만 리눅스 OS를 올릴 수 있으며, 더욱이 자신이 원하는 포트 제어를 할 수 있기 때문이다. 물론, 제어전용 마이크로프로세서에 비해 리눅스를 기반으로 하고 있기에 시스템 부하에 따라 프로그램 실행 속도가 늦어지거나 실행 지점이 다르다는 등 실시간 제어가 안된다는 것이 문제 이기는 하지만 그런 제약이 없는 프로젝트라면 사용할 만 할 듯 싶다. 추가로 ADC, PWM, 인터럽트 기능이 없는 것도 조금 아쉽지만 제한된 범위에서의 제어에는 문제 없을 듯 싶다.

 

 

 2. 라즈베리파이 외부핀

현재 라즈베리파이 모델B (버전2, 512RAM) 의 경우, 외부핀은 26핀으로 구성되어 있다. (별도로 P5 헤더 및 카메라핀 등 헤더핀이 삽입되어 있지는 않지만 공간을 할당해 놓은것은 제외한다.) 이 중, UART, SPI, I2C 관련핀들은 GPIO 목적으로도 사용되기도 하고 각 관련된 특수 기능을 수행하기도 한다. 아래는 각 핀을 배치에 따라 나열해 본 것이다.

 

위 그림에서 알 수 있듯이 라즈베리파이의 P1 헤더핀에는 전원과 관련하여 9핀이 사용되고 있고, UART 관련 총2핀, I2C 관련 총2핀, SPI 관련 총5핀이 사용되고 있다. 또한, GPIO 전용으로 총 8핀으로 총 26개 핀으로 구성되어 있다. 물론, UART 관련 총2핀, I2C 관련 총2핀, SPI 관련 총5핀 는 각 주어진 기능을 수행하기도 하지만, GPIO로도 이용가능한 핀들이기에 GPIO는 총 17핀이다.

? 5v : 총 2핀

? 3.3v : 총 2핀

? GND : 총 5핀

? TXD, RXD : UART 관련 총2핀

? SDA, SCL : I2C 관련 총2핀

? MOSI, MISO, SCKL, CE0, CE1 : SPI 관련 총5핀

? GPIO 4, 17, 18, 22, 23, 24, 25, 27 : GPIO 전용 총 8핀


더욱이, 위의 그림의 빨간 동그라미의 부분은헤더핀이 삽입되어 있지는 않지만 헤더핀을 삽입하면 별도의 8개핀을 추가로 이용가능하다. 이는 핀번호 순서대로 5v,3.3v, GPIO28, 29, 30, 31, GND, GND 로 구성되어 있다. 본 강좌에서는 별도로 다룰 예정은 아니지만 필요한 사람은 헤더핀 납땜 후 사용하면 크기도 작도 간단히 사용하기 좋을 듯 싶다.

그 이외에도 리셋을 달 수 있는 P6 헤더, JTAG 과 관련된 P2, P3 헤더 등도 있지만 GPIO 강좌와는 관련이 없으니 설명은 생략하도록 한다.

마지막으로, 종합하면 라즈베리파이에서 사용할 수 있는 GPIO는 2, 3, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 22, 23, 24, 25, 27, 28, 29, 30, 31 으로 총 21개의 핀이다. (라즈베리파이 모델B 버전2, 512RAM)

 

3. 라즈베리파이 주의사항

1) 전원구성
: 라즈베리파이의 외부핀의 전원관련으로는 3.3v, 5v 의 두 개의 전원핀이 존재한다. 허나~ GPIO 관련하여 사용할 때는 3.3v 의 회로만을 구성해야한다. 이는 라즈베리파이의 동작 전원이 3.3v 이고 그 이상의 전원에 보호하는 기능이 없다. 즉, 5v는 단순히 microUSB 선으로 들어오는 5v 전원을 연결했을뿐 실제 라즈베리파이는 3.3v 범위안에서 작업을 해야한다. 예를들어 스위치, LED를 달더라도 3.3v 에 회로를 맞춰야 한다.

2) 전류사용
: 3.3v 의 핀은 최대 30mA이 전류를 사용할 수 있다. 그 이상의 전류가 필요한 회로를 구성하게 되면 라즈베리파이의 메인 회로에 문제가 있을 수 있다.

3) 과전압, 과전류
: 라즈베리파이는 각 외부핀에 대해 전원 보호 회로를 구성하고 있지 않다. 즉, GPIO 핀에 과전류, 과전압을 주게 되면 내부 라즈베리파이 회로에 영향을 주고 동작하지 않을 수도 있다.

4) 버전별 핀배열
: 라즈베리파이 모델 B 는 출시된 시점에 따라 버전이 1, 2로 나뉜다. 이 두가지 버전은 P1 헤더핀 26개가 서로 다르게 설정되어 있어서 사용함에 있어서 주의해야 한다. 본 강좌에서 설명한 핀 배열은 라즈베리파이 모델B 버전2의 512RAM 버전이다.

 

[ 참고자료 ]

[1] “라즈베리파이 공식 사이트”, http://www.raspberrypi.org/
[2] “라즈베리파이 위키미디어 설명”, http://en.wikipedia.org/wiki/Raspberry_Pi
[3] “Embedded Linux Wiki”, http://elinux.org/
[4] “공식 판매점 Element14″, http://downloads.element14.com/raspberryPi1.html?COM=raspi-group
[5] “공식 판매점 RS Componts”, http://uk.rs-online.com/web/generalDisplay.html?id=raspberrypi
[6] “공식 판매점 Allied Electronics”, http://www.alliedelec.com/lp/120626raso/
[7] “element14의 레즈베리파이 커뮤니티”, http://www.element14.com/community/groups/raspberry-pi
[8] Embedded Linux 커뮤니티의 “RPi Tutorials”, http://elinux.org/RPi_Tutorials
[9] “RASPBERRY PI INFORMATION AND VIDEOS”, http://raspi.tv/
[10] “Raspberry Pi Spy”, http://www.raspberrypi-spy.co.uk/
[11] “RaspiHub”, http://www.raspihub.com/
[12] “Adafruit Blog”, http://www.adafruit.com/blog/category/raspberry-pi/
[13] “Raspberry Pi Pod”, http://www.recantha.co.uk/blog/
[14] “doctormonk”, http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html
[15] “bcm2835″, http://www.open.com.au/mikem/bcm2835/

End.

written by Yoonseok Pyo
http://robotpilot.net/

http://cafe.naver.com/openrt

 


이 저작물은 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 Unported 라이선스
따라 이용할 수 있습니다.


출처 : http://www.rasplay.org/?p=2049



블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그


1. 바이어스


  능동소자인 트랜지스터나 FET를 찌그러짐이 없는 증폭기로 사용하기 위해서는 각 소자에 바이어스를 인가해 주어야 한다. 그 이유는 능동소자들의 전체 정 특성 곡선이 선형이 아닌 비선형 특성을 일부 갖고 있기 때문이다. 즉, 능동소자를 선형증폭기에 이용한다는 것은 특성 곡선상의 선형인 부분을 사용하는 것이다. 따라서 비선형 부분을 제외한 선형 특성인 부분만을 사용하기 위해 능동소자에 입력신호를 가하기 전에 미리 전압이나 전류를 흘려준다. 이것을 보통 바이어스전압, 전류라 한다. 특별한 경우를 제외하고는 거의 모든 능동소자를 사용하기 위해서는 이러한 바이어스전압, 전류를 가해 주어야 한다.

  이 항에서는 바이어스의 방법에 대해서 논한다. 능동소자를 동작시키려면 능동소자의 정 특성 곡선상의 선형영역 중에서 적당한 위치에 동작점(operating point)을 설정하는 것이 필요하다. 이를 위한 전류 또는 전압을 바이어스전압(bias voltage) 혹은 바이어스전류(bias current)라고 한다. FET에는 바이어스전압을 인가하는 방법이 비교적 간단한 반면 트랜지스터의 경우 동작점을 설정하는 작업이 또한 아주 번거롭다. 이것은 트랜지스터마다 정 특성 곡선이 아주 불균일하고 설계시 고려해야 할 사항이 많기 때문이다.


  트랜지스터회로


  트랜지스터는 전류제어 소자이기 때문에 필요한 동작을 행하기 위해서는 적당한 바이어스 전류를 흘려주지 않으면 안 된다. 실제로 트랜지스터에 전원 1개를 가하지만 내부적으로는 2개의 전원이 필요하다. 따라서 전원의 전압을 이용해서 입력회로에 바이어스전류 또는 전압을 인가한다.

  트랜지스터의 바이어스회로에서는 동작점이 외부의 요인, 즉 주위온도 등이 변화하여 동작점이 이동하지 않도록 트랜지스터의 동작을 안정화하는 목적도 있다. 트랜지스터의 바이어스법에는 고정바이어스, 전압궤환바이어스, 전류궤환바이어스의 세 가지가 있으며, 다음에서 바이어스 안정화에 대하여 논한다.


  ⑴ 고정바이어스회로


  그림 1-1에서 고정바이어스회로(fixed bias circuit)라고 하는 가장 간단한 회로를 소개한다. 이 회로에서는 컬렉터전류와 베이스전류가 전원과 병렬로 인가되어 가해진다.

그림 1-1 고정바이어스회로


 라 하면 베이스전류

              (1-1)

로 주어진다. 이미터접지 증폭회로의 컬렉터전류

이며, 또 컬렉터전류 및 컬렉터전압 는 근사적으로

                      (1-2)

                      

        (1-3)

와 같이 된다.

 

 여기서 고정바이어스회로의 동작을 살펴보면 기본적으로 트랜지스터가 활성영역에서 동작하기 위해서는 베이스 - 이미터 간의 순방향, 컬렉터 - 베이스간에는 역방향의 조건을 만들어주는 것으로써 바이어스저항 가 전원 전압과 병렬로 인가되어 베이스에는 바이어스 저항값에 따른 베이스전류가 흐르고 이 전류는 이미터로 흘러가며, 이 과정에서 베이스와 이미터에는 바이어스전압 가 생성된다.


  다시 말해서 바이어스전압이 만들어지는 것이다. 그런데 여기서 주의해야 할 것은 트랜지스터를 선형으로 동작시키기 위해서는 보다 작아야 한다. 그 이유는 가 전원 전압인 보다 적어야 하기 때문이다.

  그리고, 특성곡선의 선형영역에서 주어지는 컬렉터전류의 크기 에 의한 값보다 작아야 한다. 이 컬렉터전류의 크기가 선형부분을 넘어서 포화영역으로 동작하게 되면 특성곡선에서의 최대치로 주어지므로 선형동작을 할 수 없게 된다. 증폭기 설계시에 중요하게 고려되어야 할 사항이다. 만약 트랜지스터를 스위칭(포화영역 - 차단영역) 동작으로 사용한다면 포화영역에서 사용해도 무방하다.

  이 회로는 가장 간단한 회로로서 전력소비는 적지만 안정도는 그다지 좋지 않다. 그 때문에 이 회로는 전압 및 전류가 크지 않고 다소 바이어스점이 이동해도 문제가 없는 회로의 용도에 한정되어 사용되고 있다.


  (2) 전압궤환바이어스회로


  그림 1-2와 같이 를 컬렉터와 베이스 사이에 접속해서 바이어스를 인가하는 회로를 전압궤환바이어스회로(voltage feedbace bias circuit)라고 한다.

그림 1-2 전압궤환바이어스회로


  이 회로에서는 가 어떤 원인에 의해서 증가하면 에서 전압 강하가 증대되어 가 저하되고, 바이어스전류 가 감소해서 컬렉터전류 의 증가를 억제시킨다. 이와 같은 작용은 뒤에서 기술하는 부궤환의 일종이기 때문에 전압궤환바이어스라고 한다.

  전압궤환바이어스회로는 고정바이어스회로와 같이 간단하지만 고정바이어스보다도 안정도와 트랜지스터의 에 의한 영향 등이 개선되었다. 그러나 부궤환작용은 신호주파수에 대해 작용하기 때문에 입․출력임피던스가 저하하며, 증폭기의 이득이 감소한다. 그림 1-2에 대해서

       (1-4)

의 관계가 성립한다. 일반적으로 이기 때문에 식 (1-4)에서

                     (1-5)

  식 (1-5)와 같은 근사식을 얻을 수 있다.

그림 1-3 전압궤환바이어스회로 이득의 감소를 피하는 방법


  이 회로에서도 바이어스저항 가 전원 전압과 직렬로 연결된 컬렉터저항 바로 다음에 병렬로 연결되어 있으므로 이 전압강하에 의해서 베이스전류는 흐른다. 이 흐르는 전류가 베이스 - 이미터 사이에 바이어스전압이 생성된다.

  이 전압궤환바이어스회로는 결합회로와 같이 가 큰 경우에 유용하다. 그러나 변성이 결합과 같은 부하가 변성기로 결합된 경우 컬렉터회로위 직류저항이 적기 때문에 바이어스 안정화의 효과가 적다. 이러한 바이어스회로를 사용하기 위해서는 그림 1-3과 같이 바이어스 저항 를 적당히 나누고, 그 사이에 궤환신호 성분을 바이패스 하기 위한 콘덴서 를 삽입한다. 여기서 어느 정도 이득의 감소는 피할 수 있다.


  그림 1-2는 전압분배 바이어스(voltage-divider bias)회로를 나타내고 있다. 이 방법이 선형회로에서 가장 널리 사용되는 바이어스방식이다. ‘전압분배’라는 용어는 저항 로 구성된 전압분배기에서 나온말이다. 이때 저항 에 걸리는 전압은 이미터 다이오드로 순방향으로 바이어스시킨다.

  그림 1-2에서 출력측에 키르히호프의 법칙을 적용시켜 직류뷰하선의 식을 유도 한다.

    이므로

  

    이 회로는 컬렉터 귀환 바이어스회로와 마찬가지로 온도변화에 따라 컬렉터 전류 의 변화를 입력쪽(VBE)에 귀환시켜 항상 컬렉터전류 Ic를 일정한 값으로 유지하는 작용을 갖고 있다. 이 관계는 다음과 같이 된다.


  온도변화 → Ic의 증가 → IE의 증가 → VRE의 증가 → VBE의 감소 → IB의 감소 → IC의 감소


  전압분배 바이어스는 다음과 같이 동작한다. 베이스 단자를 떼어 내어(open), R2에 걸리는 테브닌(Thevenin)전압을 구하면 다음과 같다.

  트랜지스터는 제어된 전류원으로서의 역할을 한다. 이미터는 베이스에 부트스트랩되어 있기 때문에 다음과 같다.

  컬렉터전류는 이 이미터전류의 값과 거의 동일하다.

  이 이미터전류에 대한 공식에는 가 포함되어 있지 않는데, 이는 회로가 의 변화에 크게 관여하지 않고 동작점(Q)이 고정된다는 것을 의미한다. 이런 이유 때문에 전압분배 바이어스는 선형 트랜지스터회로에 적합한 바이어스방식이며 거의 이 방식을 사용한다.


  그림 1-2회로에서 테브닌의 정리를 이용하면 등가회로를 얻을 수 있다. 이 등가회로에서

베이스 루프상에 키르히호프의 법칙을 적용하면,

 

이므로,

만약 RE보다 100배 이상 크다면 일반적으로

안정된 전압분배 바이어스회로는 다음 조건을 요구한다.

  간혹 안정된 설계를 하다보면 R1과 R2 값이 적어지게 된다. 이것은 또 다른 문제점을 야기시키는 원인이 되며 이러한 경우에 대부분의 설계가들을 10%규정을 적용하여 해결한다. 즉,

  Thevein 등가회로에서의 등가요소

  base loop에 kvl을 적용하면 전류궤한 bias회로와 같은 결과의 안정계수 S를 얻을 수 있다.

 

따라서, 와 무관하며, 를 크게 할수록 안정도는 커진다.      



블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

처음 로그인을 한후

 

 

터미널에서 cd /etc/network/로 이동

 

interfaces 를 수정해야된다. (vi interfaces)

 

auto lo

 

iface lo inet loopback

iface eth0 inet static

address 165.246.xx.x

network 165.246.xx.0

netmask 255.255.255.0

broadcast 기본 dns 주소

gateway 165.246.xx.x

 

나머지 아래부분은 그대로 둔다.

 

여기서 유의할점은 auto lo를 꼭 살려둬야됨.

 

나머지 vnc라는 프로그램을 이용해서 원격접속하는것은

 

 

http://jpub.tistory.com/286

 

이 링크를 참조하면된다.

 

성공 스샷

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

 

 

라즈베리 파이를 이용한 개인 노트북이네요...

 

 

Aw, yes, the Raspberry Pi Computer, a credit card size mini PC that only cost $35. There are so many possibilities and uses for these small nano PCs. People have made them into PVRs (personal video recorders), retro gaming machines, weather stations, in-car PCs, jukeboxes, and so many more creative ideas. When I started this project four weeks ago, I just wanted to see if it was possible to make an ultra portable, mobile Raspberry Pi that you can take to-go. As I was building my Pi-to-Go I kept saying to myself, it would be cool if it had this, and then I would find a way to make it happen.

 

 

 

 

My mobile Raspberry Pi Computer is now complete and because this is an open source project I wanted to show you everything, including how to build one yourself. I will even provide links to the parts I needed to purchase and the 3D printer STL files to print your own case. So here we go!

 

Just a quick blurb about myself. I am the founder and CEO of Parts-People.com, Inc. which specializes exclusively in Dell Laptops; and specifically Dell replacement parts, Dell laptop repair, and Dell laptop refurbishing. So I have more than 10 years experience in repairing and building laptops. Okay, lets move on.

LCD Screen

The LCD I used is from an after market backup camera system that can be installed in a car. The screen is a low resolution and I hope to find a better upgrade for my next version of the mobile RPi to-go. So for this proof of concept, it works just fine. The screen is 3.5″ using a 4:3 aspect ratio. It uses a composite input and is able to display a resolution of 640 x 480 pixels.

 

 

 

Battery Pack

First off, be very careful when messing with lithium-ion batteries. Neither Parts-People.com, Inc nor I are responsible for any damages caused by this tutorial. Proceed at your own risk. Because I own a company that sells only laptop parts, it is only natural that I would use a laptop battery for this build. Laptop batteries are built in such a way that you cannot just plug something into them and use them for a battery pack. I knew it would be possible but I just needed to figure out the best way to get power out of it and how to charge it back up in the best and safest manner. I ended up using a battery for a Dell Latitude D600 laptop and just removed it from the Dell battery case. The battery was about the right size, it had the right voltage, and I had plenty of them. Those batteries have a standard Dell 9 pin battery connector. To get power out of this battery, you will need to connect pins 1,2, & 4 together for negative / ground (-) and pins 8 & 9 together for positive (+). Be sure to connect the correct leads. See picture for pin outs.

Charging the battery was easy, I just purchased an after market laptop battery charger. It connects directly to the battery’s 9 pin connector and also has a battery level indicator built-in.

 

 

 

Internal Powered Hub

One major problem with the Raspberry Pi is a lack of power. The RPi is powered by a micro USB 5v with at least 750ma, 1A is better. But the problem is not there, it is that the USB port can only supply in the neighborhood of 120ma per port, which is not enough to run much. So I found a super small 7 port USB hub that is powered and took it apart. I needed to power 5 things: a wireless WiFi dongle, a bluetooth dongle, an SSD hard drive, a keyboard/mouse transmitter, and the Raspberry Pi itself. The power from the battery pack is 11.1 volts and the power required for the USB hub was 5 volts. What I did was connect the battery to the LCD screen which had an input of 9v-13v, and I knew that the LCD screen would have some components that would require a 5v power source (LED LCD back light for example). All I had to do was find the onboard voltage regulator and solder on leads across the 5v capacitor and solder those to the 5v input on the powered USB hub. Easy as Pi. Now we have clean regulated power for all of our devices.

 

 

 

 

 

Extended Storage

64GB SSD, yes I did! I wanted to add a linux swap partition because of the lack of RAM. The Raspberry Pi itself has 256MB (model B version 1) or 512MB (model B version 2). If I simply just installed a larger SD card and added a large swap file, or swap partition, I would eventually burn out the SD card. SD cards have a very limited number of read/writes and SD cards are slow. I opted for a 64GB Sata II solid state hard drive made by Samsung (model # MMBRE64GHDXP) and again I have a bunch of those in stock so it was convenient. I used an external USB hard drive caddy’s circuit board to connect the SSD sata HDD directly to the internal power USB hub. I setup a 1GB (1,024 MB) Linux swap partition, and have the rest formatted in ext4 for extended storage.

Built-in WiFi & Bluetooth

I wanted to build in as many features as possible, so I got a nano USB WiFi dongle and a nano USB bluetooth dongle to install inside the mobile Pi. These are also soldered directly to the built-in powered USB hub.

Operating System

I’m using stock Raspbian Linux downloaded from raspberrypi.org. The only tweaks I made were to the config.txt file and added the Linux 1GB swap partition. I modified the config.txt file to make the LCD screen display properly and fill the whole screen.

config.txt changes
overscan_left=8
overscan_right=-40
overscan_top=-30
overscan_bottom=-30
sdtv_mode=2

 

 

Keyboard & Touchpad Mouse

I purchased a wireless 2.4Ghz USB keyboard & mouse combo. I would have preferred a wired USB but this one was the right size and price. The keyboard slides in and out via the access door on the left side of the machine. The access door also exposes the on/off switch and mini USB charge port for the keyboard too.

Overall Specs

The Raspberry Pi board I am using is a model B (revision 1) but you can use the model B (version 2) for this build.

CPU Broadcom BCM2835 ARM11 700Mhz
Memory 256MB (shared with GPU)
Main Storage 4GB SD Card (OS Installed)
Extended Storage 64GB Sata II SSD (1GB linux swap)
WiFi Wireless Built-in B/G/N Card
Bluetooth Built-in Bluetooth 3.0
Peripherals 1 Powered USB Port
Video Output HDMI Port
Keyboard / Mouse QWERTY Keyboard with Touchpad Mouse
Weight 1.65 lbs.

 

3D Printed Case

Using Google sketchup, my 3D printer, and a little creativity I was able to create a case for this mobile Pi to-go. There are five parts to the case and I have made all five parts available for download from thingiverse.com.

Download Pi-to-Go 3D files (STL) Here

Everything is made to snap together except the back access door is held on by four screws. The back of the case has a Raspberry Pi logo cut into it and it is illuminated when the device is powered on. I used a back lighting LED and the acrylic strip from the back of a backlit laptop keyboard. I cut it to the shape to fit just behind the RPi logo and soldered leads that connect to 5v power. This was not needed but I thought it was a nice touch.

 

 

 

 

 

Where to buy the parts

As promised I will provide links to purchase all parts needed and I have already provided the links to download the 3D printer files (STL) above.

  • LCD Screen – bought on amazon for $17.95 – here
  • Raspberry Pi – bought on Newark/Element14 for $35 – here
  • Mini Keyboard/Mouse – bought on amazon for $29.95 – here
  • Standalone Battery Charger- bought on amazon for $75.00 – here
  • Powered 7 Port USB Hub – bought on Parts-People.com for $14.95 – here
  • 64GB SSD Hard Drive – bought on Parts-People.com for $69.95 – here
  • Dell D600 Battery – bought on Parts-People.com for $88.50 – here

Schematic

Here is a schematic to show how everything is wired together.

 

 

 

 


 

More Pictures

 

 

 

 

 

 

출처 : http://blog.parts-people.com/2012/12/20/mobile-raspberry-pi-computer-build-your-own-portable-rpi-to-go/

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

컨볼루션 코드화된 심볼은 심볼 반복기(Symbol Repetition)을 통하여 여러번의 반복과정을 통해 모두 19.2Ksps로 통일되어 출력됩니다. 즉 컨볼루션 코드화되기 전의 음성데이터 전송이 9.6Kbps는 반복을 하지 않고(어차피 컨볼루션 코드화 되면 19.2Ksps가 되니까...) 4.8Kbps, 1.2Kbps의 경우에 19.2Ksps가 되도록 반복 쓰기를 합니다. 데이터 전송율을 이렇게 통일시키는 이유가 무엇일까요? 그건 여러개의 데이터 전송율로 계속 처리한다면 시스템에서 4가지의 회로가 필요하기 때문입니다.

데이터 전송율이 모두 한가지(19.2Ksps)로 통일 되었다 해도 그 데이터마다 당초의 음성 데이터 전송율이 얼마였는지를 표시함으로써 전파로 최종 발사시에 출력을 조정할 수 있습니다.

이번엔 블록 인터리버(Block Interleaver)를 알아볼까요?

전송에 따라 데이터에 에러가 발생하면 복구가 불가능하게 되어 데이터를 이용할 수 없는 경우가 발생하는데 이를 최소화 하기 위해 에러 정정방법을 사용합니다. 앞서 말씀드렸듯이 컨볼루션 코드가 에러 정정을 위해 사용되지요. 근데 컨볼루션 코드는 에러가 드문 드문 산재해 있을 때 복구가 가능합니다.

만약에 에러가 일정 부분에 집중되어 있으면 에러 정정 코드로는 정정이 불가능해집니다. 아무리 좋은 에러 정정 코드를 사용한다 해도 이렇게 특정부분에 에러가 집중되어 연속적으로 데이터를 한꺼번에 잃어버리는 것을 방지하기는 어렵습니다. 이때 블록 인터리버가 에러가 집중되는 것을 최소화하는 역할을 합니다.

컨볼루션 코드화된 데이터는 블록 인터리버로 입력되어 인터리빙(Interleaving) 됩니다.

블록 인터리버의 원리는 다음과 같습니다.

전송할 데이터가 1, 2, 3, 4, ... 20이라고 할때 입력은 세로방향으로 쓰여지고 출력은 가로방향으로 하게 됩니다. 이렇게 데이터를 정열하는 것을 인터리빙이라고 합니다. 송신측에서 이렇게 데이터를 정열해서 보내면 수신측에서 다시 반대 과정을 거치는 것을 디인터리빙(DeInterleaving)이라고 합니다.

입 1 6 11 16 --> 출력방향

력 2 7 12 17

방 3 8 13 18

향 4 9 14 19

5 10 15 20

위와 같이 보내면 어떤 잇점이 있을까요?

순서를 바꾸지 않고 그냥 보낼 경우에는 데이터가 1,2,3,4,5 6,7,8,9,10 11,12,13,14,15 16,17,18,19,20 이렇게 되겠죠? 그런데 에러가 한곳에 집중적으로 발생하여 2,3,4,5가 모두 깨어졌다고 생각해보죠... 그럼 수신된 데이터가 1**** 6,7,8,9,10 11,12,13,14,15 16,17,18,19,20 이 될거고 아마 1****는 복구가 되지 못할 것입니다.

이걸 위의 인터리빙 과정을 거친 데이터라 가정하면 전송되는 데이터는 1,6,11,16 2,7,12,17 3,8,13,18 4,9,14,19 5,10,15,20이 될겁니다. 여기서 2,3,4,5가 깨어지면 수신되는 데이터는 1,6,11,16 *,7,12,17 *,8,13,18 *,9,14,19 *,10,15,20이 됩니다. 이제는 에러가 분산이 되었으니까 복구가 될 겁니다.

즉 인터리빙하지 않고 1,2,3,4,5처럼 연속적으로 데이터를 전송하다가 1부터 10까지의 데이터가 손상된다면 아무리 이전의 비트와 연관되었다 해도 컨볼루션 코드를 이용해 데이터를 복구할 수 없게 됩니다. 이렇게 집중적으로 에러가 발생하는 것을 버스트에러(Burst Error)라고 하고 드문 드문 에러가 발생하는 것을 랜덤에러(Random Error)라고 합니다. 즉 블록 인터리버는 버스트에러를 랜덤에러화하는 역할을 합니다.

인코딩이나 인터리빙 방법은 에러를 정정하는데에는 효과가 있지만 다른 사람이 도청하는 것을 막지는 못합니다. 따라서 CDMA에서는 롱코드를 이용하여 암호화 과정을 거칩니다.

롱코드 발생기(Long Code Generator)에서 PN 시퀀스로 된 긴 코드(Long Code)를 발생시키는데 이 긴 코드들이 블록인터리버로부터 출력된 데이터를 전혀 다른 값으로 바꾸어 암호화합니다. 롱코드는 각 사용자마다 유일하게 할당되며 가입자마다 주어질 수 있는 경우의 수가 2exp(42)-1(약 4조 2천억개)가 되므로 이 코드를 안다는 것은 거의 불가능에 가깝습니다. 암호화를 거친 데이터에는 타 사용자에 대한 간섭등을 줄이기 위한 전력제어용 비트가 삽입됩니다.

[출처]: http://vanijini.net/bbs/view.php?id=mobile&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&&select_arrange=headnum&desc=asc&no=41

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Scan enable에 관련된 사항은 아래를 읽으면 된다.

 

SoC 시프트 모드에서 듀얼 SE(Scan Enable) 저전력 플롭을 통한 전력 제한

 

 

모든 SoC 제조상 결함을 감지하기 위해 설계에 스캔 체인을 사용한다. 테스트용으로 설계된 스캔 체인은 칩의 순차적 소자를 연속적인 순서로 연결한다. SoC 점점 많은 기능이 통합됨에 따라, SoC 내의 플롭(순차적 소자) 조합 로직 수도 증가되고 있다. 스캔 시프트 단계 동안에는 모든 플롭과 함께 조합 로직이 완전한 SI(shift-in) SO(shift-out) 단계 동안 토글되고, 피크 전력이 허용 한계를 초과하면 시프트 데이터가 손상될 있으며 의사 실패(pseudo fail) 인해 수율이 영향을 받게 되므로 피크 전력이 중요한 문제이다. 문서에서는 시프트 단계 동안 조합 로직 토글을 게이트하며 설계의 피크 평균 동적 전력을 절감하는 플롭 설계를 제시한다.

 

 

 

scan logic에 관해서 자세한 내용을 보고 싶으면 다음 파일을 다운로드

 

 

Scan logic에 관한 설명.pdf

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Design Compiler User Guide Chapter 6을 제가 읽으면서 정리한 내용입니다.

 

 

Design Compiler User Guide_Version F-2011.09-SP2, December 2011.

 

 

 

Defining the Operating Conditions

Defining Wire Load Models

Modeling the System Interface

Setting Logic Constraints on Ports

Specifying Power Intent

Support for Multicorner-Multimode Designs

 

 

 

Defining the Operating Conditions

 

Operating Conditions에는 다음 3가지가 있다.

1. 온도 변화

2. 공급 전압 변화

3. 공정 변화

 

대부분의 techonology library에는 미리 정의된 operating condition이 있다.

report_lib 명령어로  technology library operating condition을 볼 수 있다.

 

dc_shell> read_file my_lib.db

dc_shell> report_lib my_lib

 

 

 

 

 

Specifying Operating Conditions

 

set_operating_conditions 명령어를 이용하면 operating conditions을 명시할 수 있다.

다음은 현재 디자인을 worst-case commercial로 하라는 뜻이다.

 

dc_shell> set_operating_conditions WCCOM -lib my_lib

 

report_design으로 현재 operating condition을 볼 수 있다.

 

Defining Wire Load Models

 

Wire load modeling wire의 길이, fanout 저항, 캐패시터, net area의 영향을 결정한다.

 

wire load modeling을 설정하는 순서는 다음과 같다.

 

1. user가 명시

2. design area에 기초한 automatic selection

3. technology library default specification

위의 항목에 없다면 wire load model을 적용하지 않아서 전파 delay값이 좋게 나온다.

 

hierarchical designs에는 hierarchical boundary끼리의 wire model을 또한 설정해줘야 한다.

그 설정 순서는 다음과 같다.

 

1. user가 명시

2. technology library default specification

3. default mode in design compiler

 

 

Hierarchical Wire Load Model

 

hierarchical boundary간의 wire load model을 결정하는데 3가지 mode가 있다.

 

1.  Top

 

Design Compiler는 모든 net wire load model 단 하나의 wire load model로 설정한다. set_wire_load_model 명령어를 사용한다.

 

모든 top이므로 top에 있는 wire load model을 사용한다. 50*50 wire의 크기 이다.

 

 

 

2. Enclosed

 

완전히 net을 감싸고 있는 가장 작은 wire load model을 사용한다.

만약 subdesign wire load model이 없다면 그 다음 상위 레벨로 올라가서 wire load model이 있는지 살펴본다. 만약에 wire load model이 있다면 그것을 사용한다.

 

아래에는 net을 완전히 감싼 design 40*40이므로 이것을 사용한다.

 

 

 

3. Segmented

 

hierarchical boundary를 여러개의 segment로 나눈다음 해당 위치에 사용되는 wire load model을 사용한다.

 

net에서 20*20 위치에 있는 것은 20*20을 쓰고 40*40에 있는 것을 40*40을 쓰고 30*30에 있는 것은 30*30을 쓴다.

 

 

Determining Available Wire Load Models

다음과 같이 입력한다면

 

dc_shell> read_file my_lib.db

dc_shell> report_lib my_lib

 

1. wire loading model section

2. wire loading model mode section : 만약에 명시되지않으면 top mode 쓴다

3. wire loading model selection group section : area 기초한 자동 selection 한다.

 

으로 나눠져있다.

 

 

 

Specifying Wire Load Models and Modes

 

다음과 같이 하면 자동적인 wire load model 선택이 안된다.

dc_shell> set auto_wire_load_selection false

 

 

다음은 wire load model mode를 선택하는 방법이다.

dc_shell> set_wire_load_model "10x10"

dc_shell> set_wire_load_mode enclosed

 

report_design 또는 report_timing 명령어를 통해서 현재 디자인의 wire load model mode를 볼 수 있다.

 

remove_wire_load_model 명령어로 wire load model을 지울 수도 있다.

 

Modeling the System Interface

 

1. Defining drive characteristics for input ports

2. Defining loads on input and output ports

3. Defining fanout loads on output ports

 

Defining Drive Characteristics for Input Ports

 

Drive strength는 상호간의 input port에서의 drive resistance, capacitance loadoutput driver resistance transition time delay를 의미한다.

 

1. set_driving_cell

2. set_drive

3. set_input_transition

 

set_driving_cell  set_input_transition, set_drive 명령어는 port transition delay에 영향을 미친다.

 

set_driving_cellport drive 특성을 technology library에서 가져온다.

set_drive 또는 set_input_transition명령어는 technology library셀에 특정한 input drive capability를 적용할 수 없을 때 top-level port drive 저항을 설정한다.

 

  

다음 예제는 Drive 특성을 설정하는 예시이다.

 

 

1. I1 I2 library cell에서 나온 것이 아니므로 set_drive 명령어로 drive 저항을 정의해야한다.

 

dc_shell> current_design top_level_design

dc_shell> set_drive 1.5 {I1 I2}

 

2. 이번에는 sub_designs2의 포트의 drive capability를 바꾸기위해서 현재 디자인을 바꿔야한다.

 

dc_shell> current_design sub_design2

 

3. IV 셀이 port I3에 연결되있으므로 set_driving_cell drive 저항을 정의해야한다.

 

dc_shell> set_driving_cell -lib_cell IV {I3}

 

4. AN2셀은 port I4로 연결되있다. AN2cell의 두 개의 인풋은 다른 transition time을 가지고 있으므로 worst case로 선택을 해야한다. 만약에 B-to-Z worst case라면 다음과 같이 쓸 수 있다.

 

dc_shell> set_driving_cell -lib_cell AN2 -pin Z -from_pin B {I4}

                                                              

Defining Loads on Input and Output Ports

 

Design Compiler zero capacitive load default로 하지만 만약 set_load 명령어를 사용한다면 capacitive load를 설정 할 수 있다.

 

For example, to set a load of 30 on output pin out1, enter

dc_shell> set_load 30 {out1}

 

여기서 30의 단위는 tartget technoloy library에 정의된 단위를 사용한다.

report_lib 명령어를 사용하면 볼 수 있다.

 

ff= Femto  farad

 

fanout – 전자회로에서 한 게이트의 출력을 다른곳에서 배분하여 연결한 출력선의 수.

 

Defining Fanout Loads on Output Ports

 

capacitive load fanout에 설정시 다음과 같이 한다.

 

dc_shell> set_fanout_load 4 {out1}

 

Setting Logic Constraints on Ports

 

최적화 효율을 높이기 위해서 중복된 포트나 inverter를 제거하기위한 커맨드를 제공한다.

 

 

Defining Ports as Logically Equivalent

 

set_equal 명령어는 두개의 인풋을 논리적으로 같다고 명시를 해준다.

 

예를 들어 IN_X IN_Y가 이름만 다르고 논리적으로 같다면

 

dc_shell> set_equal IN_X IN_Y

 

처럼 해준다.

 

Defining Logically Opposite Input Ports

 

set_opposite 명령어는 두개의 인풋이 논리적으로 다르다고 명시를 해준다.

 

Allowing Assignment of Any Signal to an Input

 

set_logic_dc 명령어로 지정한다. input port don’t care 로 지정한다. 이 명령어는 오직 input만 된다. 이것의 output port unconnected를 명시하기 위해서는 set_unconnected명령어를 사용한다.

이 명령어에 의해서 지정된 port don’t care로 된다.

 

예로  2:1 mux의 인풋이 S,A,B 고 아웃풋이 Z라면

Z = S*A + ~S*B이다

 

만약 set_logic_dc {A, B}

 

를 입력하면 A B don’t care가 된다.

 

S      AB

00

01

11

10

0

X

X

X

X

1

0

0

1

1

 

위와같이 카르노맵을 그려보면

 

S=A가 됨을 알 수 있다.

 

 

Specifying Input ports Always One or Zero

 

set_logic_one 명령어와 set_logic_zero 명령어로 인풋을 항상 1이나 0으로 둘 수 있다.

 

Specifying Unconnected Output Ports

 

 

 

 

 

만약 사용을 안하는 output 포트가 있으면 최적화할때 지워버릴 수 있다.

 

set_unconnected port_list 명령어를 이용한다.

 

이 속성을 없애려면 remove_attribute 명령어를 이용하면 된다.

  

레벨 시프터

 

디지털 게이트에 있어서 논리값 레벨조정하기 위하여 사용되는 저항, 접합 다이오드나 정전압 다이오드로서 이들 저항 또는 다이오드의 전압강하로 입력 또는 출력의 전압 레벨을 조정한다. 그림의 경우 정전류원의 작용으로 출력 레벨은 입력 레벨보다 대체로 rIE1만큼 인하되어 있다.

 

 

 

Power Intent Concepts

 

power domain : 공통된 파워를 공유하는 hierachy  logic 각 요소의 모임

 

scope : hierarchy 레벨

extent : hierarchy 각 요소

 

supply net : supply voltage ground를 운반하는 전도체

supply port : 인접한 레벨의 디자인 hierarchy를 연결하는 point

isolation celll: power domain의 출력부분에 있는 output을 유지시킨다. 어떤 블록이 off가 되면 그 블록의 출력은 X이다. 만약 이 값이 스위치가 on 되서 다른 블록으로 전달되면 이것은 바라지않는 값이나 chip failure가 일어날 수 있다. 그래서 이것을 피하기 위해 스위치가 off 됬을때 예를들어 AND 게이트에서 만약 X값을 전달할때 다른 인풋값이 0이면 출력은 무조건 0으로 된다. 또한 OR게이트에서 한쪽 값이 X여도 다른 쪽이 1이면 출력은 무조건 1이 된다. 이런 식으로 인풋에 X값을 고립시키는 것이 필요한대 이런 셀을 말한다. RETAIN 0 OR 1의 출력

 

retension register : 파워가 없어져도 값을 계속 유지하는 레지스터

 

 

UPF Commands in Synopsys Tools

 

report_power_domain, report_power_switch, report_supply_net, report_supply_ports 명령어로 power와 관계된 다양한 report를 볼 수 있다.

 

 

 

 

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

시스템 IC 설계에서 말하는 IP(Intellectual Property) 는 재이용 가능한 기능블록을 지칭하며 하드웨어 또는 소프트웨어 기능블록을 의미합니다.

재이용 가능한 하드웨어 기능블록을 하드웨어 IP, 재이용 가능한 소프트웨어 기능블록을 소프트웨어 IP라고 합니다.

예를 들면, 프로세서, RAM, ROM 등의 기능블록은 하드웨어 IP이고, ARM 프로세서 상에서 실행 가능한 mp3 소프트웨어는 소프트웨어 IP입니다.

하드웨어 IP는 형태에 따라 소프트(Soft)IP, 펌(Firm)IP 및 하드(Hard)IP의 3가지로 분류할 수 있다.

1) 소프트 IP

소프트 IP란 일반적으로 하드웨어 기술언어로 쓰여진 논리 합성 가능한 설계 자산하드웨어 기술 언어는 VHDL과 Verilog 등이 이용되며, 합성 가능한 RTL(Register Transfer Level)에서 기술되는 것이 일반적입니다. 소프트 IP는 아직 테크놀로지 매핑(Technology Mapping)이 되어 있지 않으며, 이것이 가장 큰 장점입니다.

테크놀로지는 사용자 쪽에서 선택할 수 있으며, 설계의 수정이나 개량, 기능 변경도 용이합니다. IP를 재이용의 관점에서 보면 펌 IP나 하드 IP 보다 유연하다고 할 수 있습니다. 또한 가격 측면에서도 다른 IP보다 유리하다는 것이 소프트 IP가 주목받는 이유 중의 하나입니다. 소프트 IP는 3가지 IP 중에서 유연성이 가장 좋고 필요에 따라 첨삭이 가능한 장점을 가지고 있습니다. 그러나 플로어플래닝(Floorplanning), 구현, 레이아웃 등에 관련된 정보가 없어 면적 및 성능 예측이 잘 안되는 단점이 있습니다.

소프트 IP의 공급시 최소한의 전달물은 원시코드, 일반적인 라이브러리에 의한 논리 합성용 스크립트, 테스트벤치 및 테스트 벡터, 사양서 등이 있습니다. 그밖에 소프트 IP를 사용하는데 있어서 보조적인 것으로서 C언어나 HDL(Hardware Description Language)등에 의한 동작모델, 평가보드가 있습니다. 소프트 IP는 기능 테스트와 합성 가능성 테스트만 행한 상태이므로 실제 논리 합성 이후의 작업 공정은 모두 사용자 측의 역할과 책임이 됩니다.

특히 중요한 것은 소프트 IP 자체의 기능이 검증되어 있어도 다른 회로와 조합하면 동작되지 않을 가능성도 있습니다.

2) 펌 IP

펌 IP는 소프트 IP와 하드 IP의 중간에 위치하며 약간의 플로어플래닝 정보를 가진 게이트 레벨의 네트리스트(Netlist)입니다. 일반적인 라이브러리를 사용한 네트리스트이므로 게이트 수나 성능 예측에 어느 정도 이용할 수 있습니다. 그러나 실제 공정에 대응하는 것은 아니기 때문에 참고로 할 뿐입니다.

만약 실제 공정에 대응한다면 소프트 IP의 이점인 공정의 이식성이라는 이점이 소멸되고 말 것입니다. 하지만, 최근에 ASIC 벤더간의 공정기술 차이가 별로 없어서 어느 한 회사의 라이브러리로 펌 IP를 만들어 두면 타 회사의 테크놀로지에 간단한 변환으로 이식할 수 있습니다. 이런 특성을 가지는 것이 펌 IP입니다.

3) 하드 IP

하드 IP는 공정이 완전히 정해져 있고 배치, 배선이 끝난 설계 데이터로 재이용 가능한 형태의 IP입니다. 표준셀이든 게이트 어레이이든 문제가 되지 않습니다. 즉, 게이트어레이라면 배선층의 마스크패턴, 표준셀이나 완전주문형이면 전 층의 마스크 패턴을 포함한 설계 데이터로 도면 검증까지 실시한 것을 하드 IP라고 합니다. ASIC 벤더가 블랙박스로서 제공하는 코아는 하드 IP에 속합니다.

하드 IP의 이점은 도면 검증을 포함하여 블록 레벨에서의 모든 설계가 종료되었다는 것입니다. 즉 칩 레벨에서 블랙박스로 취급할 수 있기 때문에 IP중에서도 가장 큰 TAT(Turn Around Time)의 단축이 가능합니다. 이런 형태의 IP는 타 공정으로의 전환이 거의 불가능하기 때문에 이식성이 낮습니다. 또한 반도체 제조업체는 이러한 형태의 설계 정보를 대단히 많이 가지고 있어서 입수하기는 쉽습니다.

하드 IP는 제조하면 동작할 것이 거의 확실하므로 매우 비쌉니다. 그러나 사용자는 칩 제조시 특정 반도체 공정에 예속되는 단점이 있습니다.


http://www.dawintech.co.kr 에서 펌

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Design Compiler User guide 챕터 7 두번째 파트 입니다.

 

분량이 많아서 포스트 2개로 나눴습니다.

 

Propagating Constraints in Hierarchical Designs

hierarchical designs subdesigns을 가지고 있는데 이 경우에 constraint up 또는 down으로 전달할 수 있다.

 

1) Characterizing

특정한 셀 인스턴스의 contraints를 캡쳐하고 디자인에 셀이 연결된 정보를 할당한다.

 

2) Modeling

chararterized된 디자인을 library cell로 만든다.

 

3) Propagating constraints up the hierarchy

clocks, timing exceptions, 그리고 disabled timing arcs를 낮은(높은) 레벨의 subdesign에 전달한다.

 

Characterizing Subdesigns

만약 subdesign을 각각 컴파일 한다면 boundary 조건들, 예를들어 input drive strength, input signal delays(arrival times), 그리고 output loads는 부모 design으로 유도되서 subdesign set된다. 이것을 다음과 같은 방법으로 할 수 있다.

 

Manually

 

set_drive, set_driving_cell, set_input_delay, set_output_delay, set_load 명령어를 쓴다.

 

Automatically

 

characterize 명령어를 쓰거나 design budgeting tool을 쓴다.

 

Using the characterize Command

 

RTL 코드를 bottom up 방식으로 합성할 때 characterize가 필요하다.

 

1) lower module을 주어진 constraint를 사용해서 합성한다.

2) lower module netlist를 읽어서 constraint top module에 적용시키고 저장한다.

3) 다시 재합성하는대 이때 lower module의 넷리스트와 constraint가 적용된 top module을 합성한다.

 

-no_timing 옵션을 주지 않는다면 characterize 명령어는 다음의 명령어들에 의해서 timing characteristic을 주게 된다.

characterize 명령어는 주요 목적은 subdesign timing 정보를 캡쳐하는 것이다.

 

아니면 subdesign parent의 정보로 유도해서 쓰는 것도 있다.(이 경우 parent가 이미 constraint가 정의되어 있어야하며 이것으로부터 subdesign constraint를 유도하는 것이다.)

-constraint 옵션을 주게 되면 characterize명령어는 area, power connection class, design rule constraint에 관한 것을 주게 된다.

 

-connection 옵션을 주면 connection 속성을 주게된다.

-power 옵션을 주면 subdesigns switching activity information, toggle rates, static probability 를 주게된다.

Removing Previous Annotations

 

대부분의 경우에 design characterizing을 하는 것은 이전의 characterzation 한 것과 연관된 정보들을 제거하게 된다. 그러나 back-annotation(set_load, set_resistance,read_timing, set_annotated_delay, set_annotated_check) characterize 스탭은 annotation은 제거하지만 기존의 back-annotation overwrite 할 수는 없다. 이 경우 다시 characterize 명령어를 쓰기 전에 subdesign annotation을 지우겠다고 명시를 해줘야한다.(using reset_design)

 

Optimizing Bottom Up Versus Optimizing Top Down

 

최적화 할 때 너는 characterize 명령어를 hierarchy maintain하기 위해 set_dont_touch명령어와 함께 쓸 수 있다.

bottom-up 최적화때는 maually하게는 uniquify명령어로 자동적으로는 compile 명령어로 characterize를 하지만 top-down때는 자동적으로 characterization이 수행된다.

 

Deriving the Boundary Conditions

characterize 명령어는 자동적으로 boundary 조건을 부모 design의 내용을 기초로해서 subdesign의 조건을 유도한다.

다음은 boundary조건을 유도하는 방법이다.

 

Timing conditions

input port의 예상되는 signal delay로 계산

 

Constraints

부모 design으로부터 maximum delay 값 등을 유도함..

 

Connection relations

포트와 포트 사이의 논리적 관계나 포트와 power또는 ground 사이의 관계, 예를 들어 항상 logic 0, 논리적으로 다른 포트와 반대 값, 또는 unconnected

 

characterize 명령어는 한 subdesign의 인스턴스를 위해 boundary 조건을 요약한다. 결과는 reference에 적용된다.

Limitations of the characterize Command

 

characterize 명령어를 쓸 때 다음의 제한사항을 고려해야한다.

 

1) subdesign parent design에서 timing budgets은 유도하지 않는다.

 

timing budgets이란 칩레벨이건 보드레벨이건 동기적으로 정상 작동하기위해 voltage level의 얼마나 많은 차이까지 커버 할 수 있는지에 관한 것.(how much margin)

 

2) hierarchical boundary clock_skew max_time_borrow속성은 무시한다.

 

옵션이 없으면 characterize 명령어는 subdesign의 포트 signal 정보(clocks, port drive, input and output delays, maximum and minimum path delays, port load) 를 부모 design에서 유도된 값으로 바꾼다.

 

Saving Attributes and Constraints

 

characterize 명령어는 subdesign timing environment 캡쳐한다. write_script명령어를 쓰면 현재디자인의 속성과 constraints를 저장할 수 있다. 그래서 > 연산자로 파일에 저장을 할 수 있다.

 

characterize Command Calculations

 

이번 섹션은 characterize 명령어가 포트에 구체적으로 어떻게 load timing value를 유도하는지 설명한다.

 

Load Calculations

 

 

 

 

1) hierarchical block B pin P outside load 계산법은

 

block A input에서 보면

 

driving net load 핀이 없으므로 그냥 TOP wire load 만 고려 그래서

0 + 1 * 5 = 5

 

block A output에서 바라볼 경우.

 

load pin on the net + load of segment c + load of segment d

= 1 (for load pin P) + 1 * 5 + + 1 * 2 = 8

 

block B output 경우

 

load pins on net + load of segment e

= 0 + 1 * 5 = 5

 

block B input pin X의 경우(Segment d)

 

load pins on net + load of segment b + load of segment c

= 0 + 1 * 2 + 1 * 5 = 7

 

block B input pin Y의 경우

 

pin loads on driving net + load of segment f

= 0 + 1 * 5 = 5

 

 

 

 

 

 

Input Delay Calculations

 

characterizing은 아웃풋 load의 정확한 정보를 제공하기 때문에 인풋 신호의 딜레이는 오직 이전단계의 gate driving 포트의 instrinsic delay만 고려한다. gate’s load delay connect delay는 고려하지않는다

 

 

 

 

 

input pin X에서의 딜레이는

drive strength at IN1 * (wire load + pin load) + intrinsic delay of A’s cell

= 3 * (5 + 2 + 1) + 1 = 25

윗그림에는 안나왔지만 전 그림으로 가보면 Load values on all input pins = 1 unit load로 되있음

 

 

Characterizing Subdesign Port Signal Interfaces

 

characterize 명령어를 쓸 때 옵션이 없으면 subdesign의 포트 signal 정보들(clocks, port drive, input and output delays, maximum and minimum path delays, and port load)을 부모 design에서 유도된 정보로 바꿀 수 있다.

 

또한 subdesign operating conditions timing ranges를 부모 design으로부터 물려받는다.

 

다음의 포트 signal 정보를 명령어를 사용해서 임의로 넣을 수 있다.

create_clock

set_clock_latency

set_clock_uncertainty

set_drive

set_driving_cell

set_input_delay

set_load

set_max_delay

set_min_delay

set_output_delay

set_propagated_clock

 

characterize 명령어를 사용할 때 다음은 wire loading model을 선택하는 방법이다.

 

1) top-level mode top이면 subdesign top-level wire loading model을 쓴다.

 

2) top-level mode enclosed 거나 segmented wire loading model은 다음에 기초하여 결정된다

   만약 wire loading model이 없고 wire load area의해서 결정되지 않으면 top-level design의 모델로 사용된다.

  만약 wire loading model이 없는데 wire laod area의해서 결정되면 컴파일 시간에 cell area에 의해서 다시 결정된다.

 

 

Combinational Design Example

 

script1 은 속성을 자동적으로 세팅한다.

script2 는 속성을 임의로 세팅한다.

 

 

 

 

 

 

current_design top

set_input_delay 0 A

set_max_delay 10 -to B

 

Script 1

current_design top

characterize U2

 

Script 2

current_design block1

set_driving_cell -lib_cell INV {C} //드라이빙 셀 정보

set_input_delay 3.3 C //n2 넷의 딜레이

set_load 1.3 D //load

set_max_delay 9.2 -to D //최대 딜레이 값

current_design top

 

Sequential Design Example

 

다음 그림은 sequential design top 안에 subdesign이 있는 경우이다.

 

Script 1 sets the information manually.

The input delay (from ff1/CP to u5/in1) is 1.8

The output delay (through u4 plus the setup time of ff2) is 1.2

The outside load on the out1 net is 0.85

Script 2 uses the characterize command to set the information automatically.

 

 

 

 

 

Script 1

current_design

top create_clock -period 10 -waveform {0 5} clock

current_design block

create_clock -name clock -period 10 -waveform {0 5} clock1

create_clock -name clock_bar -period 10 \ -waveform {5 10} clock2

set_input_delay -clock clock 1.8 in1

set_output_delay -clock clock 1.2 out1

set_driving_cell -lib_cell INV -input_transition_rise 1 in1

set_driving_cell -lib_cell CKINV clock1

set_driving_cell -lib_cell CKBUF clock2

set_load 0.85 out1

current_design top

 

Script 2

current_design top

create_clock -period 10 -waveform {0 5} clock

characterize u5

 

 

 

 

 

Characterizing Subdesign Constraints

 

characterize –constraints 명령어는 부모 design으로부터 값을 유도한다.

그래서 max_area, max_fanout, fanout_load, max_capacitance, max_transition subdesign에 적용시킨다.

 

Characterizing Subdesign Logical Port Connections

 

characterize –connections 명령어는 connection 속성을 부모 design으로 부터 유도해서 subdesign에 적용한다.

 

set_equal, set_oppsite, set_logic_one, set_logic_zero, set_unconnected 속성.

 

Example

 

 

 

 

 

Script 1은 속성을 manually하게 지정하는 것

 

Script 2 characterize –no_timing –conntections로 지정하는것. –no_timing timing 속성은 characterize 하지 않음.

 

Script 1

current_design block

set_opposite { E F }

set_logic_zero { G }

set_unconnected { J }

 

Script 2

current_design top

characterize U2 -no_timing -connections

 

Characterizing Multiple Instances

 

만약에 한 subdesign 인스턴스가 여러개 있다면 각각 차별적으로 characterize를 할 경우가 있다.

 

이때는 uniquify 명령어를 쓰면된다. 이 명령어를 쓰면 subdesign을 복사한다음에 각각 이름을 바꿔주게 된다. 그런다음 characterize를 하면 각각 따로 characterzie를 할 수 있다.

 

 

 

 

 

 

 

 

Characterizing Designs With Timing Exceptions

 

만약에 path design hierarachy를 가로질러서 가면서 다른 타이밍 예외를 가진다면, characterize 명령어는 timing constraints 가상의 clock가 함께 이러한 정보를 캡쳐한다.

 

timing 예외는 set_multicycle_path, set_false_path, set_max_delay 그리고 set_min_delay이다. 가상 clock 스키마는 또한 다중 clock으로 다뤄진다.

 

 

 

 

 

-verbose옵션은 subdesign characterize할때 관련된 명령어를 다 보여줌

 

위를 보면 ALARM이 인풋으로 들어가서 U3에는 2개의 cycle path가 있다.

 

이런 경우 characterize U0 –verbose 한 결과이다.

 

 

 

 

-이 부분 잘 모르겠음.

 

Methodology for Propagating Constraints Upward

 

propagate_constraints 명령어를 쓰면 낮은 레벨의 디자인에서 현재 디자인으로 constraints를 전달 할 수 있다. 만약 명령어를 안 쓰면 높은 레벨에서 current_instance constraints를 전달 할 수 있다. 그러나 낮은 레벨에서 높은 레벨로 전달할 수 없다.

 

만약 A가 높은 레벨이고 B가 낮은 레벨이면 B constraints A로 전달할때

 

 

만약 모든 전달된 constraints를 파일로 리포트를 하고싶다면 –verbose –dont_apply 옵션을 준다.

 

dc_shell> propagate_constraints -design name \ -verbose -dont_apply -output report.cons

 

Handling of Conflicts Between Designs

 

만약 다음과 낮은 레벨 디자인과 높은 레벨 디자인이 다음과 같은 충돌이 날 수도 있다.

 

Clock name confilct

 

    낮은 레벨 clock이 다른 블럭이나 current design clcok과 이름이 같으면 clock은 전달되지 않는다. 경고가 발생한다.

 

Clock source conflict

 

    낮은 레벨 블럭의 clock 소스가 이미 높은 레벨 블럭과 동일할 때 낮은 레벨 clock은 전달되지 않은다. 경고가 발생한다.

 

Exceptions from or to an unpropagated clock

 

    virtual clock 또는 clock이 충돌 때문에 전달되지 않을 때 발생 한다.

 

Exceptions

 

    낮은 레벨 예외가 만약 높은 레벨 예외와 같은 path를 쓰면 높은 레벨의 예외를 재정의한다.

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

다음의 내용은 synopsis Design Compiler User guide를 번역해보았습니다..

 

 

Design Compiler User Guide_Version F-2011.09-SP2, December 2011.

 

 

Chapter 7 Defining Design Constraints

 

목차

 

Design Compiler Constraint Types

Design Rule Constraints

Optimization Constraints

Managing Constraint Priorities

Reporting Constraints

Propagating Constraints in Hierarchical Designs

 

 

Design Compiler Constraint Types

 

Design Compiler가 최적화시 2가지 타입의 constraint를 쓴다.

 

 

 

 

 

 

1. Design rule constraints

     Design rule constraints ASIC vendor에 의해서 technology library에 정의되어있다.

     DRC를 버리거나 재정의 할 수 없다.

     DRC를 더욱 제한적으로 할 수 는 있다. 이것은 optimization에 도움이 된다.

     DRC design net에 관계가 있다.

DRC는 각 library 마다 다르다.

 

2. Optimization Constraints

     Optimization Constraints는 유저에 의해서 명확히 제한을 건다.

     디자인의 목표(area, timing)을 구체적으로 기술 할 수 있다.

     이러한 것은 현실적이어야 한다.

 

 

Design Rule Constraints

 

DRC는 다음 4가지로 구성된다.

 

     Maximum transition time

     Maximum fanout

     Minimum and Maximum capacitance

     Cell degradation

 

Maximum transition time, Maximum fanout, Minimum and maximum capacitance 속성은 없앨 수 없다. 그러나 좀더 제한적으로 set을 할 수 있다.

 

Design Rule Cost Function

 

Design Compiler design rule 위반을 고치는데 도움을 준다. 만약에 여러개의 위반이 있다면 Design Compiler는 가장 우선순위가 높은 위반 부터 수정하려고 시도한다. 가능하다면 design rule 위반을 줄이기위해서 양자택일의 방법을 선택하기도 한다.

 

 

 

Maximum Transition Time

 

 

 

 

value high에서 low로 바뀔 때나 low에서 high로 바뀔 때 걸리는 시간을 말한다. 이러한 maximum transition time을 제한을 둘 수 있다. 각각의 net max_transition 값보다 작아야한다.

이러한 net에 걸리는 transition time technology library에 있는 타이밍 데이터를 이용해서 계산 된다.

 

set_max_transition 명령어를 이용해서 constraint를 줄 수 있다.

 

example) adder 3.2 max transition 설정

dc_shell> set_max_transition 3.2 [get_designs adder]

 

이때 시간단위는 report_lib 를 하면 나오는 아래를 보면 알 수 있듯이 Time Unit 1ns이다.

 

 

 

 

다음과 같이 remove_attribute 를 하면 max_transition을 없앨 수 있다.

dc_shell> remove_attribute [get_designs adder] max_transition

 

Specifying Clock-Based Maximum Trainsition

 

max_transition 값은 동작하는 셀의 최대 주파수(최대 clock 주파수)를 바꿀 수 있다.

이때 최대 주파수 설정은 create_clock 명령어를 이용한다.

 

 

Design Compiler는 다음의 max_transition 값을 결정하기 위해서 다음의 룰을 따른다.

 

     디자인이나 포트 또는 clock group max_transition 속성이 적용되면 가장 큰 제한 값이 사용된다.

     multiple clocks이 같은 path에 걸리면 가장 큰 제한 값이 사용된다.

     만약 max_transition 속성이 이미 technology library에 사용됬다면 컴파일 하는 도중에 이 max_transition 값을 맞추려고 자동적으로 최적화한다.

 

예를들어 clock 그룹인 Clk max_transition time을 제한을 두려면 다음과 같이 한다.

dc_shell> set_max_transition 5 [get_clocks Clk]

 

Maximum Fanout

 

Maximum fanout 값을 라이브러리 전체나 아니면 개개의 셀의 핀에 제한을 둘 수 있다. 물론 이때 기존에 library에 제한된 값보다 더욱 더 좁게 제한을 해야 한다.

max_fanout 속성 적용 시 각 인풋의 fanout_load를 고려를 해줘야 한다.

만약 다음과 같은 경우를 고려하면

 

 

 

fanout_load 의 총합인 X max_fanout을 넘지말아야한다.

X max_fanout값을 넘었다면 Dedsign Compiler higher-drive component를 사용한다.

 

Maximum Fanout Calculation Example

 

 

 

만약 위의 예제에서

 

dc_shell> set_max_fanout 8 [get_designs ADDER]

 

을 한다면

 

 

을 충족시키므로 max_fanout으로 설정할 수 있다.

 

max_fannout 설정 해지방법 예제.

 

dc_shell> remove_attribute [get_ports port_name] max_fanout

dc_shell> remove_attribute [get_designs design_name] max_fanout

 

Defining Expected Fanout for Output Ports

set_fanout_load 명령어로 예상되는 fannout load 값을 output port에 넣을 수 있다.

물론 total load 값이 maximum fanout load 값보다 적어야한다.

 

fanout load 속성 해지방법도 다음과 같다.

 

dc_shell> remove_attribute port_name fanout_load

 

 

Example) 만약 라이브러리셀 libA에 있는 AND2 fanout load 값을 알고 싶다면

dc_shell> get_attribute "libA/AND2/i" fanout_load

 

Example) 만약 라이브러리셀 libA에 있는 default_fanout_load값을 알고 싶다면?

dc_shell> get_attribute libA default_fanout_load

 

 

Maximum Capacitance

 

maximum capacitance pin-level 속성으로 지정해두면 그 핀은 넷에 연결할 때 전체 capacitance 값이 지정한 maximum capacitance를 넘을 수 없다.

 

max_fanout max_transition net의 제한을 간접적으로 하지만 max_capacitance는 직접적으로 제한을 한다.

 

maximum capacitance 또한 각 셀의 동작 주파수를 변경 시킬 수 있으며 Design Compiler는 이보다 작은 값을 맞추려고 component를 바꿀 수도 있다.

 

max_capacitance 값은 set_max_capacitance 명령어로 정의한다.

 

Example) adder max_capacitance 3으로 지정한다 단위는. 다음에 나와있다.

 

 

 

 

dc_shell> set_max_capacitance 3 [get_designs adder]

다음과같이 remove_attribute 명령어를 통해서 max_capacitance를 없앨 수도 있다.

 

dc_shell> remove_attribute [get_designs adder] max_capacitance

 

Specifying Frequency-Based Maximum Capacitance

 

max_capacitance 값은 각 셀의 동작 주파수를 결정한다. compile_enable_dyn_max_cap 변수를 true로 두면 각 driver pin frequency-based maximum capacitance를 결정하게 된다.

이것을 쓰기 앞서서 library multiple 주파수에 관한 내용이 포함되있어야한다. 이것은 각 driver pin에 따른 maximum capacitance 값이 lookup table이란 곳에 써져있다.

 

Design Compiler 다음의 순서로 max_capacitance를 결정한다.

     각 셀의 최대 동작 주파수를 결정한다.

     technology library lookup table에 확인해서 max_capacitance값에 충족되는지 확인한다.

     driver pin에 적절한 max_capacitance 값을 정하고 이 값을 합성에 사용한다.

 

Minimum Capacitance

 

Minimum Capacitance 또한 design rule constraint이다. 몇몇 technology library에만 정의가 되있다. 이것은 load capacitance의 최소 값인데 Design Compiler Maximum capacitance 보다 먼저 이 값을 확인하게 된다. 만약에 이 값을 충족시키지 못하면 Design Compiler driver size를 변경함으로써 값에 맞춘다.

 

set_min_capacitance 명령어로 지정을 할 수 있다.

 

Example) minimum capacitance value 12.0 unit으로 지정함 포트 이름은 high_drive

 

dc_shell> set_min_capacitance 12.0 high_drive

 

report_constraint –min_capacitance 로 현재 지정된 minimum capacitance속성를 볼 수 있다.

 

만약 속성을 지우고 싶다면

 

remove_attribute 명령어를 이용하면 된다.

 

 

 

Cell Degradation

 

Cell degradation 또한 net design rule constraints이다. 몇몇 technology library cell degradation 테이블을 포함한다. 테이블은 cell transition의 함수에서 유도된 maximum capacitance 값이 들어있다.

 

이 값 또한 max_capacitance와 비슷하지만 max_capacitance가 우선순위가 더 높다. max_capacitance가 충족됬는지보고 그 다음 cell_degradation 값 보다 높은지 또 확인하게 된다.

만약 max_capacitance가 충족되면 cell_degradation값 또한 충족하게된다.

cell_degradation은 각 넷의 최대로 drive 할 수 있는 capacitance를 말한다.

 

오직 DC Ultra license에서만 사용가능하고 문법은 다음과 같다.

set_cell_degradation cell_deg_value object_list

 

Example) cell_degradation 값은 2 unit으로 포트이름은 late_riser

dc_shell> set_cell_degradation 2.0 late_riser

 

만약 이 속성을 지우고 싶다면 remove_attribute명령어를 쓰면 된다.

 

 

Design Rule Constraints 의 우선순위

 

1. Minimum capacitance

2. Maximum transition

3. Maximum fanout

4. Maximum capacitance

5. Cell degradation

 

만약 Maximum fanout이 조건을 충족시키지 못하면 maximum transition과 충돌이 났는지 확인해본다. 그러나 Design Compiler maximum fanout 조건 위반을 충족시키기위해서 transition time을 나쁘게 만드는 일은 하지 못한다.

 

Design Compiler transition time 라이브러리를 이용해서 계산하는 방법 2가지

1) 라이브러리에 CMOS delay model으로 driving cell drive resistance net capacitive load를 이용해서 transition time을 계산한다.

 

2) 라이브러리에 nonlinear delay model으로 table lookup interpolation을 이용해서 transition time을 계산한다. 이것은 output pin에서의 capacitance input transition time의 함수 이다.

 set_driving_cell set_drive 명령어는 technology library마다 다르게 행동 할 수 있다.

 

보간(interpolation)이란 사이값을 보충한다는 의미입니다. 이미 알고 있는 값을 사용해 사이에 있는 값을 추정적으로 간단히 계산하는것입니다.

 

set_drive is used to specify the driving strength of an output for ex: set_drive 0 for clocks and reset
set_driving_cell is set on inputs to specify the input side driving cell.

 

set_drive는 어떤 특정한 object의 저항이나 drive strength를 지정한다.(구체화된 라이브러리에 없는 top design 일때 그래서 이것은 set_driving_cell만큼 정확하지는 않다)

set_driving_cell technology library셀의 driving port/pin에 지정하게 된다.

만약 0을 지정하면 가장 큰 drive strength를 사용하게 된다.

                                                                                                     

1) 라이브러리가 CMOS delay model을 사용할 때는 drive resistance가 상수이다. 그래서 set_drive set_driving_cell이 같은 결과를 만든다.

 

2) 라이브러리가 nonlinear delay model을 사용할 때는 set_driving_cell 명령어가 table에 있는 load에 따라 transition time이 바뀌게 되고 set_drive명령어는 명령어가 실행될 때 table에 있는 load를 중간 범위에 있는 값을 가져다 쓴다.

 

set_drive set_driving_cell 모두 transition delay와 연관이 있다.

 

set_load 명령어는 포트나 net load값을 준다. 이것은 technology libray에 단위와 일치해야 하며 timing optimization을 하는동안 사용된다.(maximum fanout optimization이 아니라)

 

Design Rule Scenarios

 

set_max_fanout and set_max_transition commands

set_max_fanout and set_max_capacitance commands

 

technology library 는 일반적으로 max_transition 또는 max_capacitance default값이 정의되어있다. 둘 다는 아니다. 그래서 좋은 결과를 위해서는 max_transition max_capacitance를 혼용하지말자.

 

 

 

 

 

Disabling Design Rule Fixing on Special Nets

 

set_auto_disable_drc_nets 명령어는 design rule clock, constant, 또는 scan net에 고정한다. 명령어는 현재 디자인의 모든 net  내가 specify한 옵션에 대해서 clock net, constant net, scan net에 실행이 된다. 만약 auto_disable_drc_nets 속성이 적용되있는 net이 있다면 그 net design rule disable된다.

 

default로는 clock constant net design rule fixing disable 되있다.(-default 옵션을 쓴것과 같음), scan net 은 아니다

 

만약 –all 옵션을 쓴다면 모두 disable 시킬 수 있다. –clock, -constant, -scan 옵션을 써서 각각 독립적으로 true, false 할 수 있다.

-none 옵션을 쓰면 모두 enable 할 수 있다.

 

만약 set_auto_disable_drc_nets명령어로 clock net enable 시켜도 clock net의 이상적인 timing 특성을 바꾸지 못한다. 그래서 set_propagated_clock 명령어로 이상적인 clock net timing을 바꿀 수 있다.

 

You cannot use the set_auto_disable_drc_nets to override disabled design rule fixing on ideal networks marked with ideal network attributes. This command never overrides the settings specified by the set_ideal_net or the set_ideal_network command.

 

 

Summary of Design Rule Commands and Objects

 

 

 

Optimization Constraints

 

Optimization Constraints timing area 에 관한 디자인 목표이다. 디자인의 operation에 영향을 받지 않은 제한들이다.

 

그리고 timing 제한이 area 제한보다 우선순위가 더 높다.

 

Optimization Constraints의 구성

 

Timing constraints (performance and speed)

1. Input and output delays (synchronous paths)

2. Minimum and maximum delay (asynchronous paths)

Maximum area (number of gates)

 

Optimization Cost Function

 

mapping 할 때 Design Compiler optimization cost를 줄이기 위해서 노력한다.

 

cost를 개선시키기 위해서 고려해야 할 사항은 다음과 같다.

중요도순

1. Maximum delay cost

2. Minimum delay cost

3. Maximum area cost

 

Design Compiler는 위 요소를 각각 독립적으로 평가한 뒤 한 요소의 cost를 줄이고 다른 순위가 높은 cost를 올리는 것은 하지 않는다.

더 이상 개선할 수 없을 때까지 optimize를 하게 된다.

 

Timing Constraints

 

만약 디자인이 synchronous path create_clock 명령어로 clock을 명시한 뒤 set_input_delay 명령어와 set_output_delay명령어로 input/output port timing을 명시하게 된다.

 

Asynchronous path set_max_delay set_min_delay 명령어로 핀간의 delay값을 명시하게 된다.

 

 

 

Maximum Delay

 

Design Compiler static timing analyzer timing constraint를 분석하게 된다. critical path, 모든 timing path minimum, maximum delay를 계산한다. 이때 technology library에 있는 정보에 기초해서 계산을 하게 된다.

 

Cost Calculation

Maximum delay optimization cost function에서 가장 중요한 비율을 차지하는데 그 cost 함수는 다음과 같다.

 

 

 

 

 

Maximum delay target value clock waveform, skew, library setup times, external delays, multicycle 또는 false path specifications그리고 set_max_delay명령어를 고려한 뒤 계산된다. 이외에도 load, drive, operating conditions, wire load model그리고 다른 요소까지 고려될 수 있다.

 

그리고 Maximum delay cost group_path 명령어와 create_clock 명령어에 의해서 어떻게 path가 그룹화 됬는지에 따라 달라 질 수 있다.

 

1) 만약 오직 한 group path가 존재한다면 worst violation 값이 group weight 에 곱해질 것이다.

 

2) 만약 많은 group path가 존재한다면 모든 그룹에 대한 cost design maximum delay를 결정하는데 고려될 것이다.

 

Delta = max(delta(pin1), delta(pin2), ... delta(pinN))

 

Minimum Delay

 

Minimum Delay set_min_delay 명령어로 지정된다. 그리고 항상 target delay보다는 크게 지정해야 한다. Design Compiler는 만약 set_fix_hold 명령어가 사용될 때만 minimum delay cost를 사용한다.

 

이유는 Design Compiler는 오직 design rule violations fix 할 때만 minimum delay가 사용되기 때문이다.

 

그래서 만약에 fix_hold가 어떤 clock에서 사용되지 않았으면 minimum delay는 고려하지 않는다. fix_hold min_delay가 명시되있다면 minimum delay optimization cost에 두 번째로 고려하게된다(첫번째는 maximum delay)

 

set_min_delay 명령어

    디자인의 timing path minimum delay를 정의한다.

set_fix_hold

    컴파일 동안에 Design Compiler가 레지스터의 hold time violations fix하라고 정의한다. 그래서 set_false_path 또는 set_multicycle_path 명령어를 써서 set_fix_hold에 영향을 받는 pathdefault path delay를 재정의 할 수 있다.

 

다음은 set_false_path 명령어와 set_multicycle_path 명령어의 부연 설명이다.

 

set_false_path : Specifies a false-path exception, removing (or cutting) paths from

timing analysis.

 

set_multicycle_path : Specifies a multicycle exception for a given set of paths.
 
Multicycles can be specified relative to the source clock (-start) or destination clock (-end). This is useful when the source clock and destination clock are operating at different frequencies.  For example, if the source clock is twice as fast (half period) as the destination clock, a -start multicycle of 2 is usually required.

 

Cost Calculation

 

Mininum delay cost path group에 영향을 미치지 않는다. 그래서 다음식이 나온다.

 

 

 

minimum delay cost 함수는 single pin or port multiple pin or port나 같은 delta 값을 가진다.

Delta = min_delay - minimum delay(pin or port)

 

min_delay set_min_delay

 

 

Maximum Area

 

Maximum area optimization constraints이다. Maximum area는 게이트의 수로 표현이 된다.

일반적으로 timing optimization 이 끝난 후에 area를 위한 optimization이 수행된다.

 

set_max_area명령어는 허용가능한 최대 area를 지정해준다. Design Compiler net area 또한 고려한다.

 

하지만 다음 3가지는 area로 고려하지 않는다.

 

Unknown components

Components with unknown areas

Technology-independent generic cells(이부분 이상함)

 

Cost Calculation

 

cost = max(0, current area – max_area)

 

Defining Maximum Area

 

Examples

dc_shell> set_max_area 0

 

Area unit is defined by the library supplier

라이브러리에 없으므로  벤더에 요구해야한다.

 

2-input NAND gate단위인지 transistor 단위인지 mil^2 or mm^2 or um^2 단위인지 물어봐야 함

 

만약에 set_max_area값에 맞추지 못한다면 그래도 최대한 area를 최적화한다. 그러나 compiler 시간이 늘어날 것이다.

 

 

 

 

 

Managing Constraint Priorities

 

 

 

 

 

 

 

어떤 상황에서는 delay의 우선순위를 높게해야 될 수 도 있다.

 

그래서

 

set_cost_priority [-default] [-delay] cost_list 로 우선순위를 바꿀 수 있다.

 

-default

    Design Compiler는 위에 명시된 순서대로 우선순위를 둔다.

-delay

    max_delay 우선권이 최우선으로 된다.

cost list

명시한 순서대로 된다.

max_delay, min_delay, max_transition, max_fanout, max_capacitance, cell_degradation, and max_design_rules.

 

Examples To prioritize max_delay ahead of the maximum design rule constraints, enter dc_shell> set_cost_priority -delay

 

To assign top priority to max_capacitance, max_delay, and max_fanout—in that order— enter

 

dc_shell> set_cost_priority {max_capacitance max_delay max_fanout}

 

위처럼 max_capacitance max_delay, max_fanout만 쓰면 나머지는 자동적으로 우선권이 낮아진다.

 

Reporting Constraints

 

report_constraint 명령어는 constraint 값을 report한다.

 

1) 현재 디자인이 constraint가 만족됬는지 아닌지

2) 얼마나 많이 constraint가 만족되는지 아닌지

3) The design object that is the worst violator

4) maximum delay 정보, path group별로 cost를 보여줌. 이것은 레지스터 또는 port setup time 또는 output delay violations뿐만 아니라 set_min_delay violations까지 보여준다.

5) minimum delay cost, 레지스터 또는 port hold time violationsset_min_delay 명령어의 violation까지 보여준다.

 

-verbose 옵션을 주면 더욱 세밀한 정보를 얻을 수 있고

-all_violators 옵션을 주면 모든 constraint violators를 볼 수 있다.

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

ASIC 또는 FPGA에서 delay, skew, slack, slew등의 용어가 자주 나오고 있습니다. 모두 타이밍에 관한 특성 값들이지만, 서로 어떻게 다른 지 개념을 잡고 있는 것이 중요할 것 같습니다.



1. Delay

ASIC 또는 FPGA에서 발생하는 지연(delay)은 흔히 이야기 하는 [딜레이]가 맞습니다.

[DELAY] = [CELL_DELAY] + [NET_DELAY]

여기서 CELL은 "AND", "OR", "D-FlipFlop"등의 셀을 의미하고, NET은 이들을 연결하는 (구리)Wire를 의미 합니다. CELL_DELAY는 전자의 이동속도 등과 관련이 있습니다. CELL_DELAY는 아래 그림과 같이 세숫대야 모델(?)로 이해 할 수 있습니다.





세숫대야를 CELL로 봅니다. 대야속의 물의 높이 즉 '수위'가 CELL의 값을 나타냅니다. 현재 물이 비어있다고 가정하면, '0'의 값입니다. 수도꼭지를 틀어서 수위가 '1'이 될 때 까지의 시간을 "RISE_DELAY"라고 합니다. 그리고 수채구멍을 열어 수위가 다시 '0'이 될 때 까지의 시간을 "FALL_DELAY"라고 합니다. 물 대신 전자가 대야에 차고 또 비워지고 하는 것을 디지털의 '1'과 '0'으로 이해한다면 CELL_DELAY의 의미를 마음속에 그려 볼 수 있을 것입니다. '0'은 0V이고, '1'은 경우에 따라서 3.3V 또는 5V 등의 전압을 의미 합니다.




2. Skew

실제 칩(ASIC 또는 FPGA)이 있다고 가정을 해 보겠습니다.




점선 안의 부분은 칩 내부이고, PAD로 연결된 칩 외부의 PCB상의 클럭 패턴도 있습니다. D-FF가 8개 있는 디자인 입니다. 단순하게 하기 위해, 필요한 부분만 남기고 나머지는 삭제하였습니다. RTL(Verilog 또는 VHDL)로 설계 할 때는 단일 클럭인 "CLK" 만을 사용하는 설계였는데 회로합성(synthesis)툴이 클럭을 나누어서 플립플롭 3개와 5개를 따로 드라이브하는 구조로 합성하였습니다.


클럭의 상승에지(rising edge)가 PCB_CLK에서 '발사' 되어 최종 목적지인 플립플롭 들에 '도착'하는 시간이 주요 관심사 입니다.


플립플롭들 중 foo와 bar라는 두 개의 플립플롭으로 도달하는 "CLK"의 시간은 조금 다를 것입니다. 그 이유를 처음의 그림의 세숫대야 모델로 생각을 해 볼 수 있습니다. CLK'(수도꼭지#1)는 세 개의 세숫대야, 그리고 CLK''(수도꼭지#2)는 다섯개의 세숫대야를 채워야 하기 때문에 CLK''에서 공급받는 bar의 세숫대야는 약간 늦은 시간에 '1'로 도달할 것입니다.


PCB클럭으로 부터 foo와 bar 플립플롭으로 도착하는 클럭의 시점을 그림으로 그려 보면 아래와 같을 것입니다.






여기서 만약 T1=2ns이고 T2=2.5ns였다고 가정해 보겠습니다. CLK_PCB를 "기준"으로 보면 foo로 도착하는 CLK의 delay는 2ns이고 bar로 도착하는 CLK의 delay는 2.5ns 입니다.

우리는 여기서 "CLK의 SKEW는 0.5ns 이다." 라고 이야기 합니다.

즉 SKEW는 클럭의 delay가 아니라 "가장 빨리 도달하는 클럭과 가장 늦게 도달하는 클럭의 차이" 인 것입니다.




3. SLACK

위의 회로의 예를 계속 보겠습니다. 클럭이 100MHz 클럭이라고 가정해 보겠습니다. 그렇다면 주기(period)는 10ns일 것입니다.

단순화를 위하여 여기서는 T1=T2=0ns라고 가정하겠습니다. 그리고 Setup과 Hold도 무시하겠습니다. foo와 bar사이에 "AND"게이트가 하나 있습니다. 이 AND게이트의 CELL_DELAY = 7ns라고 가정해 보겠습니다.

클럭의 주기가 10ns이니까, Delay는 10ns를 넘으면 안됩니다.

여기서는 delay = 7ns가 되었지요, 그렇다면 약 3ns의 여유가 있습니다. 이 말을 "3ns의 Slack이 있다."라고 이야기 합니다. 즉 slack은 "마진(여유)"이라고 해석하면 될 것입니다.

만약 foo와 bar 사이의 AND게이트의 CELL_DELAY = 15ns 였다면 "Timing Violation"상황 입니다. 이 때 타이밍 리포트를 뽑아 보면 "SLACK = -5ns"라고 나올 것입니다. 즉 "네거티브 슬랙"의 의미는 우리가 원하는 조건(timing constraint)에 이 만큼 만족하지 못했다는 것을 의미하게 됩니다.




4. SLEW

Slew는 출력 PAD의 특성 값입니다. Slew의 의미는 '기울기' 입니다. 위의 세숫대야 모델로 본다면 RISE_DELAY와 FALL_DELAY를 통칭하는 의미로 보시면 됩니다. 상식적으로는 수도꼭지(drive strength)가 굵어서 '0'에서 '1'로 가는 시간이 짧으면 짧을 수록 좋은 것 처럼 보입니다. 하지만 무조건 빠른 것이 모든 면에서 좋은 것은 아닙니다. 즉, 항상 slew(기울기)가 높은 것이 좋은 것은 아닌 것입니다.

굵은 수도꼭지(낮은 기울기)의 단점은 두 가지가 있습니다.

(1) 0V에서 출발하여 3.3V로 도달하는데 걸리는 시간이 "아주" 짧아지면, 그만큼 원하지 않는 전자기파가 발생하기 쉽습니다. 이런 전자기파는 EMI 또는 노이즈라고 부르며 보드(PCB)상의 다른 소자들에게 간섭을 주는 등 아주 좋지 않습니다.

(2) 예를 들어 64비트 버스가 출력으로 사용되는 디자인이 있다고 하겠습니다. 동작을 하다 보면, 어떤 우연한 상황에서 64개의 '출력' 모두 '0'에서 '1'로 올라가야 하는 싯점이 있을 것입니다.[주1] 이 처럼 동시에 스위칭 하는 순간, 64개의 패드를 짧은 시간에 전압 레벨 '0'에서 '1'로 올리기 위해서는 엄청나게 굵은 수도꼭지로 물을 퍼부어야 할 것이고, 이 때 물의 양 즉, 순간전류는 상당히 많이 필요하게 됩니다. 이 처럼 순간 전력 피크치가 높으면, 칩 내부에 전압 강하 등의 문제가 발생할 수도 있을 것입니다.


이러한 이유들로 인해 '기울기'를 고의적으로 약간 "뉘여"주는 것이 전기적 특성을 좋게 만들기 때문에 "Slew Rate Control"이 가능한 출력 패드들이 있습니다.



[주1] 참고로 이렇게 동시에 스위칭하는 64개의 출력 패드를 SSO(Simultaneous Switching Outputs)라고 부릅니다.


*** http://www.asicclubkorea.com/ ***


원저자 : striker
수정자 : -
버전 : 2008-04-15
도움 주신 분들 : -

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Chapter5 Working With Desings in Memory Part2

 

Chapter5는 내용이 많아서 2개로 나눴습니다.

 

 

Design Compiler User Guide_Version F-2011.09-SP2, December 2011.

 

linking designs

 

 

 

set search_path "$search_path libs cons .."

set link_library "* tcbn65lpvtwc.db"

 

linking 과정

 

1.     현재 디자인에서 무슨 라이브러리 컴포넌트를 썼는지 결정한다.

2.     link 라이브러리에서 사용된 라이브러리 컴포넌트가 있는지 찾는다,

è  첫 번째로 local_link_library 명령어를 쓴 라이브러리부터 찾는다.

è  두 번째로 ‘*’가 있으면 메모리에 이미 올려져있는 라이브러리부터 찾는다

è  마지막으로 link_library 명령어를 쓴 라이브러리에 찾는다.

3.     2번 과정에서 찾지못하면 search_path에 명시된 디렉토리에 있는 라이브러리를 찾아본다.

4.     찾았다면 references를 라이브러리에 매핑 시킨다.

 

linking 과정을 통해서 timing values and path delay, 파워 소비를 계산한다.

 

Chaging Design References

 

change_link 명령어를 사용해서 이미 link된 컴포넌트나 디자인의 매핑을 바꿀 수 있다.

바꿀때 항상 같은 포트 갯수와 같은 사이즈를 가지고있어야한다.

 

ex1)

MY_ADDER U1 U2를 다시 link를 하게 된다.

 

ex2)

이 경우는 U1셀의 링크를 lsi_10k/AN3로 바꾸는 것이다.

 

ex3)

 

 

이경우는 inv1인스턴스를 사용하는 곳이 bot1 bot2인 경우인데 이때는 –all_instance를 위와같이 써주면 bot2에 있는 inv1도 바뀐다.

 

 

 

 

Specifying Design object

 

 

set_dont_touch : dont_touch design이나 cell에 붙는 attribute로서 일단 set되고 나면 더 이상 re-optimzed되지 않습니다.

즉 단 한번만 컴파일이되고 그다음부터는 절대로 건들이지 않습니다.

 

db파일로 save하더라도 이 속성은 살아있습니다. cell set_dont_touch하면 해당 design cell이 변하지 않는 것이고 design set_dont_touch하면 해당 referece는 어디에 instatiated되건 수정되지 않습니다. 아래와 같이 사용됩니다.


dc_shell> current_design = TOP
dc_shell> set_dont_touch u1
또는 set_dont_touch find(cell, u1)
또는

dc_shell> current_design = BlockB
dc_shell> set_dont_touch find(design,BlockA)
report_referece report_cell 명령으로 attribute를 확인할 수 있고 remove_attribute로 속성을 삭제할 수 있습니다.

 

 

위에서 U3 U4 dont_touch속성을 했기때문에 첫번째 compile에서는 수행하지만 두번째 compile에서는 U3 U4를 컴파일하지 않습니다.

 

 

 

상대주소 지정법

 

 

current_design은 현재의 디자인(즉 모듈)을 지정하고 그 다음 U1/U15를 통해서 인스턴스를 지정해준다.

 

아니면 아래처럼 current_instance U1처럼 인스턴스를 지정해주고 set_dont_touch U15로 지정해주는 방법도 있다.

 

위처럼 current_instance로 지정하게되면 top module이 현재 경로가 된다.

절대주소 지정법

 

형식은

 

[file:]design/object 이며

 

file은 실제 파일명을 써준다. 이유는 다른 파일에 같은 object가 있는 경우가 있을 수도 있기 때문이다.

 

design dc_shell상의 design 이름을 써준다.

 

object는 실제 인스턴스 이름을 써준다.

 

 

 

Creating Designs

 

새로운 design을 만드는 방법

 

 

create_design을 하면 design object(port, wire, instance )이 아무것도 없다.

create_clock, create_cell, create_port등으로 design object를 추가해줘야한다.

 

 

 

Copying Designs

 

copy_design 명령어를 사용한다.

 

 

Renaming Designs

 

rename_design 명령어를 사용한다.

 

 

 

rename_design 옵션들

 

 

example) –prefix 사용방법

 

dc_shell> get_cells -hier -filter "ref_name == D" //D로 시작하는 인스턴스를 검색

{b_in_a/c_in_b/d1_in_c b_in_a/c_in_b/d2_in_c}//다음이 검색됨

 

dc_shell> rename_design D -prefix NEW_ -update_links//D NEW_로 바꿈

Information: Renaming design /test_dir/D.ddc:D to /test_dir/D.ddc:NEW_D. (UIMG-45) //바뀐것을 확인

 

dc_shell> get_cells -h -filter "ref_name == D"//D로 시작하는것을 찾아보니까 없음

# no such cells!

 

dc_shell> get_cells -h -filter "ref_name == NEW_D" //NEW_D로 검색이 됨.

{b_in_a/c_in_b/d1_in_c b_in_a/c_in_b/d2_in_c}

 

 

Changing the Design Hierarchy

 

Hierarchy를 볼 수 있는 방법은 report_hierarchy라는 명령어를 쓰면된다.

Design Hierarchy를 바꾸는 방법은 다음과 같다.

 

1.     Adding levels of hierarchy

2.     Removing levels of hierarchy

3.     Merging cells from different subdesigns

 

 

1.    Adding levels of hierarchy

그룹화를 통해서 hierarchy 레벨을 만들 수 있다.

group 명령어를 통해서  몇개의 셀을 새로운 subdesign으로 그룹화를 할 수 있다.

 

 

 

example1)

u1 u2를 그룹화 시켜서 디자인이름을 SAMPLE 셀이름을 U로 함

 

dc_shell > group {u1 u2} –design_name SAMPLE –cell_name U

 

example2)

alu로 시작하는 모든셀을 그룹화함. 디자인 이름은 uP 셀이름은 UCELL로함

 

dc_shell > group “alu*” –design_name uP –cell_name UCELL

 

example 3)

mid1의 아래에 bot1, foo1, j 를 그룹화함

 

dc_shell > group {mid1/bot1 mid1/foo1 mid1/j} –cell_name U1 –design_name SAMPLE

 

로 하거나

 

dc_shell > current_design mid

dc_shell > group {bot1 foo1 j} –cell_name U1 –design_name SAMPLE

 

 

 

 

bussed gate의 의미는 게이트가 멀티비트 signal로 연결됬을 때를 말한다.

VHDL block 예제

 

 

 

Example 1 To group all cells in the HDL function bar in the process ftj into design new_block, enter

 

dc_shell> group -hdl_block ftj/bar -design_name new_block

 

Example 2 To group all bused gates beneath process ftj into separate levels of hierarchy, enter

 

 dc_shell> group -hdl_block ftj -hdl_bussed

 

 

 

 

 

 

Removing Levels of Hierarchy

 

Design Compiler hierarchical 경계를 넘어서 최적화 하지는 않는다. 만약에 이러한 hierarchy를 없애면 타이밍 결과에 있어서 좀더 장점이 있을 것이다.

 

그래서 ungrouping이라는 방법으로 hierarchy를 없앨 수 있다. ungrouping은 최적화전이나 최적화하는 동안에 끝난다. ungrouping을 하면 해당 셀이 부모셀로 들어가게 된다.

 

유의할 점

만약에 design, subdesigns, 그리고 셀이 dont_touch 속성을 가지고 있다면 ungroup을 할 수 없다.

 

 

 

 

 

간단히 말해서

 

-flatten은 그룹을 한 개로 만들고

-start_level number 는 층이 number층이 될때까지 만들고

-prefix prefix_name ungroup된 것에 앞에 이름을 붙이고

-small number leaf cell의 갯수가 최소 number가 될 때까지 수행함.

 

 

Example 1 To ungroup a list of cells, enter

dc_shell> ungroup {high_decoder_cell low_decoder_cell}

 

 

Example 2 To ungroup the cell U1 and specify the prefix to use when creating new cells, enter

dc_shell> ungroup U1 -prefix "U1:

 

 

Example 3 To completely collapse the hierarchy of the current design, enter

dc_shell> ungroup -all flatten

 

 

Example 4 To recursively ungroup cells belonging to CELL_X, which is three hierarchical levels below the current design, enter

dc_shell> ungroup -start_level 3 CELL_X

 

 

Example 5 To recursively ungroup cells that are three hierarchical levels below the current

 

design and belong to cells U1 and U2 (U1 and U2 are child cells of the current design), enter

dc_shell> ungroup -start_level 2 {U1 U2}

 

 

Example 6 To recursively ungroup all cells that are three hierarchical levels below the current design, enter

dc_shell> ungroup -start_level 3 -all

 

 

Example 7 This example illustrates how the ungroup command can accept instance objects (cells at a lower level of hierarchy) when the parent design is unique.

 

 In the example, MID1/BOT1 is a unique instantiation of design BOT.

 

The command ungroups the cells MID1/BOT1/FOO1 and MID1/BOT1/FOO2.

dc_shell> ungroup {MID1/BOT1/FOO1 MID1/BOT1/FOO2}

 

 

The preceding command is equivalent to issuing the following two commands:

dc_shell> current_instance MID1/BOT1

dc_shell> ungroup {FOO1 FOO2}

 

 

Ungrouping Hierarchies Explicitly During Optimization

 

최적화하는 동안 ungrouping을 하려면 set_ungroup 명령어를 사용한다.

다음은 사용 방법이다.

 

For example, to ungroup cell U1 during optimization, enter the following commands:

dc_shell> set_ungroup U1

dc_shell> compile

 

만약에 ungroup 속성을 확인하고 싶으면

dc_shell > get_attribute object ungroup

 

ungroup 속성을 제거 하려면

dc_shell > set_ungroup object false

 

모든 lower level hierachy 를 제거 하려면

dc_shell > compile –ungroup_all

 

Ungrouping Hierarchies Automatically During Optimization

 

최적화하는 동안 자동적으로 ungrouping하려면 compile_ultra compile –auto_ungroup 을 쓴다

 

compile_ultra는 타이밍 최적화에 중점을 둔 ungrouping이고

 

compile –auto_ungroup area

compile –auto_ungroup delay

로 타이밍이나 area측면으로 ungrouping을 할 수 있다.

 

 

 

 

 

Preserving Hierarchical Pin Timing Constraints

 

Compile flow

Effect on hierarchical pin timing constraints

Ungrouping a hierarchy before optimization by using ungroup

timing constraint가 보존된다.

ungroup_preserve_constraints 변수를 false로 두면 보존되지않는다.

Ungrouping a hierarchy during optimization by using compile –ungroup_all or set_ungroup follwed by compile

timing constraint가 보존되지 않는다.

auto_ungroup_preserve_constraints 변수를 true로 두면 보존된다.

Automatically ungrouping a hierachy during optimizationm that is, by using the compile_ultra or compile –auto_ungroup area|delay command

timing constraint가 보존되지 않는다.

auto_ungroup_preserve_constraints 변수를 true로 두면 보존된다.

 

만약에  timing constraints를 보존하게 된다면 이 constraint는 인접한 핀으로 재할당하게 되는데 이때 인접한 핀이 leaf cell이면 size_only라는 속성을 할당하게 된다. size_only셀이 증가하면 최적화할 때 제한이 많아지게 된다.(이유는 더이상 쪼개질수 없는 leaf cell에 많은 contraint가 걸리게되므로)

 

set_false_path

set_multicycle_path

set_min_delay

set_max_delay

set_input_delay

set_output_delay

set_disable_timing

set_case_analysis

create_clock

create_generated_clock

set_propagated_clock

set_clock_latency

 

Note: The set_rtl_load constraint is not preserved. Also, only the timing constraints of the current design are preserved. Timing constraints in other designs might be lost as a result of ungrouping hierarchy in the current design.

 

 

 

Merging Cells From Differnt Subdesigns

 

다른 subdesign에서 하나의 셀로 합치는 법

 

dc_shell> group {u_add u_mult} -design alu

dc_shell> current_design alu

dc_shell> ungroup -all

dc_shell> current_design top_design

위와같은 순서로 하면 u_add u_mult alu라는 디자인으로 만들어지고 ungroup을 통해서 완전히 하나의 셀로 된다. (u_add u_mult가 각각 트리로 이루어져있으면 ungroup을 해야 하나의 완전한 셀로 된다.)

 

Editing Designs

 

다음 명령어로 메모리안에 있는 디자인을 에디트할 수 있다. 이 명령어로 외부 포맷 대신에 dc_shell로 디자인 수정을 할 수 있다.

 

 

 

example)

dc_shell> create_cell mid1/foo my_lib/AND2

 

mid1 design foo라는 셀을 추가시킴 이때 셀은 my_lib/AND2를 가져옴.

 

dc_shell> get_pins U8/*

{"U8/A", "U8/Z"}

dc_shell> all_connected U8/A

{"n66"}

dc_shell> all_connected U8/Z

{"OUTBUS[10]"}

dc_shell> remove_cell U8

Removing cell ’U8’ in design ’top’. 1

dc_shell> create_cell U8 IVP

Creating cell ’U8’ in design ’top’. 1

dc_shell> connect_net n66 [get_pins U8/A]

Connecting net ’n66’ to pin ’U8/A’. 1

dc_shell> connect_net OUTBUS[10] [get_pins U8/Z]

Connecting net ’OUTBUS[10]’ to pin ’U8/Z’.

 

위처럼 하면 all_connected 명령어를 통해서 어느 넷이나 포트 핀에 연결되있는지 확인하고 그다음 remove_cell로 셀을 삭제한다.

create_cell IVP(인버터 파워가 큰)타입으로 U8을 만들고 connect_net으로 넷을 연결 시켜주면된다..

 

위 과정을 다음 한줄로 요약할 수 있다.

 

dc_shell > change_link U8 IVP

 

 

Resize a cell

 

get_alternative_cell 명령어로 다른 라이브러리 셀을 가져온다.

그리고 size_cell 명령어로 leaf cell drive strength를 바꿀 수 있다.

 

Inserting buffers or inverter pairs

 

insert_buffer 명령어로 핀이나 포트에 버퍼를 추가 할 수 있다.

-inverter_pair 옵션을 주면 single non-inverting 라이브러리 셀 대신에 inverting library의 쌍을 삽입한다.

 

 

 

 

 

single input non inverting buffer

 

Removing buffers

 

remove_buffer 커맨드를 사용한다.

 

Translating Designs From One Technolygy to Another

 

한 디자인을 현재 라이브러리에서 다른 라이브러리로 바꿀때 translate 명령어를 사용한다.

 

Translating Designs in Design Compiler

 

1. Read in your mapped design.

dc_shell > read_file design.ddc

 

2. 타겟 라이브러리 설정

dc_shell > set target_library target_lib.db

 

3. translate 실행

dc_shell  > translate

 

Translating Designs in Design Compiler Topographical Mode – 생략

 

Restrictions on Translating Between Technologies

 

bus = driver = buffer

 

다른 Technology translating 할 때 유의해야 할 점

1. translate 는 기능적으로는 변환하지만 drive strength는 변할 수 있다. 항상 라이브러리에서 가장 작은 drive strength를 쓰기 때문이다.

2. CMOS 3-state components FPGA translate할 때 기능적으로 같은 technology에는 존재하지 않을 수도 있다.

3. Buses driven CMOS 3-state components는 반드시 모두 디코드 해야한다. 이 경우에는 Bus drivers 가 컨트롤 로직으로 translate 된다.

이렇게 하기 위해서는 translating 전에 compile_assume_fully_decoded_three_state_buses 변수를 true로 해야한다.

4. 3-state 버스가 한 디자인 안에 하나 또는 많은 수의 아웃풋 포트와 연결되었다면 버스를 translating을 할 때 포트의 기능적인 변화가 일어난다 그래서 에러가 날 것이다.

 

Removing Designs From Memory

 

dc_shell메모리에서 디자인을 지우고 싶다면 remove_design 커맨드를 쓰면된다.

-all 옵션은 모든 디자인과 라이브러리를 메모리에서 지운다.

 

dc_shell> set PORTS [all_inputs]

 {"A0", "A1", "A2", "A3"}

dc_shell> query_objects $PORTS

PORTS = {"A0", "A1", "A2", "A3"}

dc_shell> remove_design

Removing design ‘top’ 1

dc_shell> query_objects $PORTS

Error: No such collection ‘_sel2’ (SEL-001)

 

 

 

 

 

 

 

Saving Design format.

다음은 Design Compiler가 제공가는 save 포맷이다.

 

 

 

 

Commands to Save Design Files

 

저장하는 명령어는 write write_milkyway가 있다.

 

write의 사용

 

 

 

 

 

 

Example 1 The following command writes out all designs in the hierarchy of the specified design:

 

다음과같이 hierarchy 옵션을 주면 subdesign까지 모두 저장된다.

dc_shell> write -hierarchy -format ddc top

Writing ddc file top.ddc

Writing ddc file A.ddc

Writing ddc file B.ddc

 

 

Example 2 The following command writes out multiple designs to a single file:

 

다음과같이 output 파일명을 적어주면 그 파일명으로 저장된다.

dc_shell> write -format ddc -output test.ddc {ADDER MULT16}

Writing ddc file test.ddc

 

set_attribute 명령어 사용

 

dc_shell > set_attribute lsi_10K/FJK3 dont_touch true

이렇게 하면 lsi_10K dont_touch 속성이 된다.

 

dc_shell > report_attribute –obj_type object

이렇게 하면 objectattribute를 모두 볼 수 있다.

 

dc_shell> get_attribute OUT7 max_fanout

Performing get_attribute on port ’OUT7’.

{3.000000}

위처럼하면 max_fanout에 관한 속성만 볼 수 있다.

 

 

attribute 값을 저장하려면

 

dc_shell > write_script > attr.scr

 

이런식으로 write_script 연산자를 쓴다.

 

dc_shell > remove_attribute OUT7 max_fanout

 

remove_attribute 명령어를 통해서 OUT7 max_fanout 속성을 지울수 있다.

 

dc_shell> reset_design

Resetting current design ’EXAMPLE’.

1

 

reset_design을 하면 모든 클럭이나 인풋 아웃풋 딜레이, 작동조건, 타이밍 조건 등의 모든 정보들이 없어진다.

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

5. Working With designs in memory

 

Design Compiler chapter 5를 요약한 내용입니다.

 

Design Compiler User Guide_Version F-2011.09-SP2, December 2011.

 

Design Terminology

 

1. Flat Design

 

contain no subdesigns and have only one structural level.

 

2. hierarchical designs

 

contains one or more designs as subdesigns.

 

 

hierarchical design 예제

 

Design Objects의 종류

 

 

 

 

design

디자인은 인스턴스, , 포트 핀으로 구성되있는 것을 말한다.

 

REFERENCE

디자인의 라이브러리 컴포넌트이다. 단순한 로직 게이트부터 RAM 이나 CPU같은 복잡한 로직도 포함한다.

 

Instance or Cell

레퍼런스의 회로들을 메모리 상에 로딩된 것들이다.

각 인스턴스는 유일한 이름을 가지고있다.

 

Ports

디자인의 input, output

 

pins

셀의 input output

 

nets

 

port to pin이나 pin to each other가 연결된 wire이다.

 

Relationship Between Designs, Instances, and references

 

 

 

U1, U2, U3 는 인스턴스

 

NAND2 MULTIPLIER Reference

 

EXREF는 디자인

 

Reporting References

 

command report_reference -hierarchy

 

현재 디자인에 사용된 모든 reference report한다.

-hierachy옵션 적용시 hierarchy형태로 출력한다.

 

만약 get_references reference_name을 입력하면 reference에 대한 정보를 볼 수 있다.

 

 

 

 

 

 

 

Reading Designs

 

다음은 Design Compiler가 읽을 수 있는 포맷이다.

 

 

 

 

Using the analyze and elaborate Commands

 

using the analyze command

 

1.     Reads an HDL source file.

2.     Checks it for errors(without building generic logic for the design)

3.     Creates HDL library objects in an HDL-independent intermediate format.

4.     Stores the intermediate files in a location you define

 

 

To do this

Use this

Store design elements in a library other than the work library. For override

-library

By default, the analyze command stores all output in the work library.

Specify the format of the files to be analyzed.

-vhdl or –verilog

Specify a list of files to be analyzed.

file_list

 

using the elaborate command

 

1.     Translates the design into a technology-independent design (GTECH) from the intermediate files produced during analysis.

2.     Allows changing of parameter values defined in the source code

3.     Allows VHDL architecture selection

4.     Replaces the HDL arithmetic operators in the code with DesignWare components

5.     Automatically executes the link command, which resolves design references

 

 

 

 

VHDL Entity로 설계의 인아웃을 정의하고 실제 내용은 architecture의 부분에 기술한다.

한 개의 Entity에 여러개의 architecture가 있을 수도 있지만 1:1로 대응시키는 것이 일반적이다.

 

To do this

Use this

Specify the name of the design to be built(the design can be a Verilog module, a VHDL entity, or a VHDL configuration).

-design_name

Find the design in a library other than the work library(the default).

-library

Specify the name of the architecture.

-architecture

Automatically reanalyze out-of-date intermediate files if the source can be found.

-update

Specify a list of design parameters.

-parameters

 

 

 

 

 

 

 

 

using the read_file command

 

1.     Reads several different formats

2.     Performs the same operations as the analyze and elaborate commands in a single step.

3.     Creates .mr and .st intermediate files for VHDL

4.     Does not execute the link command automatically.

5.     Does not create any intermediate files for Verilog

 

 

위처럼 link 명령어를 써줘야한다.

 

Design Compiler path_name/design.ddc파일을 만드는데 만약에 읽었던 파일을 또 한번 더 읽으면 이 ddc파일을 overwrite한다. 이게 싫다면 –sigle_file option을 주면된다.

 

만약에 압축된 파일일 경우 확장자가 .gz면 사용이 가능하다.

 

다음은 사용할 수 있는 format 리스트이다.

 

1.     ddc. format : Uses the .ddc extention.

2.     db format : Uses the .db, .sldb, .sdb, .db.gz, .sldb.gz, and .sdb.gz extensions

3.     Verilog format : Uses the .v, .verilog, .v.gz, and .verilog.gz extentions

4.     System Verilog : Uses the.sv, .sverilog, .sv.gz, and .sverilog.gz extentions

5.     VHDL : Uses the .vhd, .vhdl, vhd.gz, and .vhdl.gz extensions

 

 

 

To do this

Use this

Specify a list of files to be read.

file_list

Specify the format in which a design is read.

-format

Store design elements in a library other than the work library(the default) when reading VHDL design descriptions.

-library

Read a Milkyway ILM view.

(Milkyway Synopsys database)

-ilm

Specify that the design being read is a structural or gate-level design when reading Verilog or VHDL designs.

-netlist –format\verilog|vhdl

Specify that the design being read is an RTL design when reading Verilog or VHDL designs.

-rtl –format\verilog|vhdl

 

 

milkyway 부연 설명

 

Synopsys 사의 Tool을 이용하여 IC Design을 하다보면, 가장 자주 만나는 것이 바로 Milkyway Database. Milkyway 라는 이름의 Tool이 따로 존재하고 있어서 처음에는 이 Tool을 사용하는 데이터만을 일컫는 줄 알았으나, Synopsys사의 Tool 전반에 걸쳐 사용되는 Database라고 생각하면 된다. Design Compiler, IC Compiler, Astro 등의 모든 툴에서 이러한 Milkyway Database 포맷을 사용하고 있다.

The Milkyway database is the unifying design storage format for the Synopsys Galaxy Design Platform.



IC
Design할 때 사용되는 정보로는, Power, Ground, Clock, Signal에 대한 Routing information Cell dimension, border, pin location, mask layer 등과 함께 Wire tracks, antenna, electromigration 등의 technology 정보들이 있는데 이러한 모든 physical library information을 저장하는 일종의 저장 형식.


이러한 정보들을 Cell 단위로 저장하게 되는데, Milkyway 에서는 각 Cell의 정보를 몇 가지의 다른 representation으로 나타내고 있다
.

  • CEL view: via, standard cell, macro, whole chip, netlist에 대한 정보를 모두 포함하고 있는 Full physical structure layout view. 모든 Milkyway library cell은 반드시 이 CEL view를 가지고 있다.
  • FRAM view: abstract representation. P&R(Placement and routing)할 때 사용되는 view. 따라서 외부에서 바라보는 정보만 가지고 있으면 되는데, metal blockage, allowed via area, pin에 대한 정보를 가지고 있다.
  • ILM view: Interface logic model에 대한 정보
  • FILL view: Metal fill에 대한 정보. P&R 마지막 과정에서 Metal Density Constraint를 맞추기위해 넣어지는 Metal fill layer (당연히 Logical function이 없다.)
  • ERR view: Design Rule violation에 대한 정보를 담고 있는 Layer view

 

출처 TechMemosla의 블로그 http://thinkpiece.tistory.com

 

read_file analyze elaborate 명령어의 차이점.

 

 

 

 

read_ddc

 

dc_shell > read_ddc design_file.ddc

 

이전버젼의 소프트웨어 ddc파일은 읽는게 가능하나 이후버젼의 소프트웨어 ddc파일은 읽는게 불가능하다.

 

dc_shell > read_db design_file.db

 

db파일 또한 마찬가지이다.

 

 

 

 

메모리상에 올라온 design listing.

 

list_designs 명령어와 –show_file 옵션을 주면된다.

 

-show_file은 파일까지 표시한다. 이때 *는 현재 디자인을 의미한다.

 

 

 

 

 

현재 디자인 세팅

 

read_file로 파일 읽어오기

 

 

 

current_design 명령어로 탑모듈 설정

 

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Technology Libraries

 

Technology libraries contain information about the characteristics and functions of each cell provided in a semiconductor vendor’s library.

 

Implementing the design function

 

Technology libraries는 최적화할때 target libraries로 매핑을 한다.

target libraries는 넷리스트나 design 동작 조건 같은 cell을 포함한다.

 

 

 

 

Resolving cell references

synthesis 과정 중 linking 할 때 reference link libraries에 연결한다.

Calculationg timing values and path delays

link libraies는 타이밍 값과 path 딜레이를 계산한다.

Calculating power consumed

 

 

Symbol Libraries

Symbol libraries 라이브러리 셀을 나타내기위한 그래픽 심볼을 포함한다.

design schematic Design Vision으로 볼 수 있다.

 

DesignWare library는 재사용 가능한 circuit-design building blocks들이다.

 

Specifying Libraries

 

Library type

variable

default

file extention

Target library

target_library

{“yout_library.db”}

.db

Link library

link_library

{“*”, “your_library.db}

.db

Symbol library

symbol_library

{“your_library.sdb”}

.sdb

DesignWare library

synthetic_library

{}

.sldb

 

 

Specifying Technology Libraries

 

Target Library

Design Compiler target library를 회로를 만들때 사용한다. 매핑할때 DC는 기능적으로 정확한 GATE target library에서 선택한다. 이것으로 타이밍 딜레이 등을 계산한다.

 

use the target_library 변수로 target library를 구체화한다.

 

Link library

linking the design 과정에서 Link library를 쓴다.

 

link_library 변수

이것은 라이브러리 리스트를 명시하고 dc는 이 라이브러리를 linking 과정에서 사용하게 된다.

처음에 라이브러리를 모두 메모리에 올린다.

*의 의미는 dc는 레퍼런스를 메모리에서 찾으라는 뜻이다.

 

local_link_library 특성

 

local_link_library 속성을 쓴 디자인 파일이나 라이브러리를 link_library 맨앞에 붙인다.

 

link_library를 한 곳에서 동작 조건, wire load selection group, wire load mode, net delay calculation을 계산한다.

 

동시에 minimum and maximum timing analysis

 

set link_library “*, maxlib.db” //최대 타이밍 분석 라이브러리

set_min_library maxlib.db –min_version minlib.db//최소 타이밍 분석 라이브러리

 

 

라이브러리 loading

dc_shell > read_file my_lib.db

dc_shell > read_file my_lib.sdb

 

 

Listing Libraries

 

list_libs를 쓰면 현재 사용하고 있는 라이브러리를 볼 수 있다.

 

 

 

 

Reporting Library Contents

 

report_lib로 라이브러리 내용을 리포트 할 수 있다.

1. library units

2. operating conditions

3. wire load models

4. cells(including cell exclusions, preferences, and other attributes)

 

specifying library objects

[file:] library/cell[/pin]

 

file : technology file name, 여러개 라이브러리 쓰면 반드시 써줘야됨

 

library

 

라이브러리 이름

 

cell

라이브버리 셀 이름

 

Example 1)

dc_shell> set_dont_use my_lib/AND4

 

my_lib에서 AND4셀을 쓰지 말라는 뜻

 

Example 2)

dc_shell> set_disable_timing [get_pins my_lib/AND4/Z]

 

my_lib library안에 AND4 Z핀을 사용하지 말라는 뜻

 

 

Excluding Cells From the Target Library

 

Example 1)

dc_shell> set_dont_use MY_LIB/INV_HD

다음 명령어는 MY_LIB라이브러리에 INV_HD를 쓰지 말라는 뜻

 

Example 2)

dc_shell> remove_attribute MY_LIB/INV_HD dont_use

위에 썼던 dont_use 속성을 다시 사용하라는 뜻.

 

 

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

우선 순위가 가장 높은 것을 먼저 실행한다.

 

 

다음은 진리표입니다.

 

 

 

 

 

위처럼 A가 1이 나오면 무조건 Y1이 1이 되고 A가 0인데 B가 1이면 C가 뭐가되건 상관없이 Y2가 1이

 

된다.

 

이런식으로 입력값에 순위가 A > B > C로 매겨져 있는 인코딩 회로를 말한다.

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Organizing the Design Data.

 

  • Establishing and adhering to a method of organizing data are more important than the method you choose.

 

 

 

Partitioning for Design Reuse

 

  • Design reuse decreases time to market by reducing the design, integration and testing effort.
  1. Thoroughly define and document the design interface.
  2. Standardize interfaces whenever possible.
  3. Parameterize the HDL code.

 

 

Keeping Related Combinational Logic Together

 

  • Dividing related combinational logic into separate blocks introduces artificial barriers that restrict logic optimization.
  1. Group related combinational logic and its destination register together.

-> DC has the flexibility to merge logic, resulting in a smaller, faster design.

조합회로와 레지스터를 묶으라는 뜻입니다.

 

2. Eliminate glue logic.

 

glue 로직이란 복잡한 조합회로가 서로 연결되있는 것을 말합니다.

 

 

 

 

 

Registering Block Outputs

 

  • This method enables you to constrain each block easily because
  •  The drive strength on the inputs to an individual block always equals the drive strength of the average input drive.
  •  The input delays from the previous block always equal the path delay through the flip-flop.

 

 

 

 

Partitioning by Design Goal

 

When certain parts of a design are more area and timing critial than other parts.

  •  Isolate the Two type.

           1. Noncritical speed constraint logic

           2. Critical speed constraint logic

 

 

 

 

Partitioning by Compile Technique

 

When the design contains highly structured logic along with random logic.

  •  Isolate the Two type.

           1. Highly structured logic. ex) error detection circuitry

           → Use the Structuring Technique.

           Result : Reduced design area.

           2. Random logic.

           → Use the Flattening Technique.

           Result : Reduced speed optimization.

          

 

 

  1. Structuring Technique

           Adds intermediate variables and thus logic structure.

 

 

  1. Flattening Technique

           Goal is to create a 2 level S.O.P.

           Two edged sword:

                     Remove bad structure.

                     Remove good structure as well.

          

 

오른쪽을 왼쪽처럼 바꾸는 것입니다.

 

 

 

 

 

Keeping Sharable Resources Together

 

Design Compiler can share large resources such as adder or multiplier.

  •   Caution !  Only if the resources belong to same Always block.

 

 

 

 

 

Keeping User-Defined Resources With the Logic They Drive

 

Design Compiler cannot automatically share or create multiple instances of user-defined resources.

Inserting multiple instiations of User-Defined Resources by manually.

 

 

 

Writing technology-independent HDL

 

  1. Inferring Multiplexers

           HDL Compiler can infer a generic multiplexer cell(MUX_OP) from case statements in your HDL code.

 

 

 

2.   Inferring Registers & Mixing Register Types

           HDL Compiler infers a D flip-flop whenever the sensitivity list of a Verilog always block.

           If the target library have not a D-latch, DC synthesizes the combinational logic.

 

 

 

 

 

 

3.        Inferring Three-State Drivers

           Assign the high-impedance value to the output pin to have DC infer three-state gates.

           HDL Compiler는 조건문에서 high-impedance 값을 항상 false로 한다.

 

 

 

 

 

 

 

 

 

 

4.        Inferring Multibit Components

           Multibit inference allows you to map registers, mux and three-state cells to regularly structured logic or multibit library cells.

 

 

 

 

 

 

5. Designing State Machines

     1) State minimization can be performed.

     2) Tradeoffs between different encoding styles can be made.(ex Gray encoding)

     3) Don’t care conditions can be used without flattening the design.

     4) Don’t care state codes are automatically derived.

 

 

Using HDL Constructs

 

  1. Sensitivity Lists

           You should completely specify the sensitivity list for each always block.

 

 

 

 

  1. Value Assignments

           Use nonblocking assignments(<=) within sequential Verilog always block.

           Use blocking assignments(=) within combinational Verilog always block.

 

3.        if Statements

           if만 쓰고 else 항목을 쓰지 않으면 latch가 생긴다.

 

 

4.        case Statements

           case 문에는 반드시 default를 써서 latch의 발생을 예방하자.

 

 

 

 

5.        Constant Definitions

           Use the Verilog `define statement.

 

 

 

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그