2018년 12월 12일 수요일

Byte Order

인텔계열 PC 에서는 Byte단위로 Little Endian 이다.
Sensor 단위에서는 Big Endian 이다.

그래서 PC 에서 읽은 다음에 무조건 방향을 바꾸어 주어야 한다.

2018년 12월 4일 화요일

Windows 10 DotNet 3.5설치


참조 링크
https://social.technet.microsoft.com/Forums/azure/en-US/8bc98626-42de-4d7e-9fc1-2bc8658cc47b/net-framework-35-installation-fails-w-error-code-0x800f0954?forum=win10itprosetup

관련 사진



2018년 6월 1일 금요일

모두 같은 값으로


1. Macro Code
    - cell merge
Sub register_merge()

' register_merge 매크로

Set r = ActiveCell
Dim i As Integer
    For i = 1 To 1000
        If Selection.Offset(1, 0) <> "" Then
            Selection.Offset(1, 0).Select
        Else
            Selection.End(xlDown).Select
            Selection.Offset(-1, 0).Select
            Range(Selection, Selection.End(xlUp)).Select
            Selection.Merge
            Selection.Offset(1, 0).Select
        End If
    Next i
End Sub

2. 빈칸을 모두 같은 값으로
홈 - 편집 - 찾기 및 선택 - 이동옵션 - blank

제일 위의 cell 에 넣을 수식 입력한 다음 ctrl + enter

2018년 5월 21일 월요일

pclk

pclk: Pixel CLocK

Camera interface

The CAMIF, also the Camera Interface block is the hardware block that interfaces with different image sensor interfaces and provides a standard output that can be used for subsequent image processing.

A typical Camera Interface would support at least a parallel interface although these days many camera interfaces are beginning to support the MIPI CSI interface.

The camera interface's parallel interface consists of the following lines :-

8 to 12 bits parallel data line

These are parallel data lines that carry pixel data. The data transmitted on these lines change with every Pixel Clock (PCLK).
Horizontal Sync (HSYNC)

This is a special signal that goes from the camera sensor or ISP to the camera interface. An HSYNC indicates that one line of the frame is transmitted.
Vertical Sync (VSYNC)

This signal is transmitted after the entire frame is transferred. This signal is often a way to indicate that one entire frame is transmitted.
Pixel Clock (PCLK)

This is the pixel clock and it would change on every pixel.
NOTE: The above lines are all treated as input lines to the Camera Interface hardware.

Example
Let us suppose that a sensor is transmitting a VGA frame 640x480. The video frame is of a format RGB888. Let's assume that we have a camera sensor transmitting 8 bits per pixel clock (PCLK). This means to transfer one pixel of data, 3 PCLKs would be required. The HSYNC would be fired by the sensor after every 640 x 3, 1920 PCLKs. A VSYNC would be fired by the sensor after the entire frame is transmitted i.e. after 1920x480, 921600 PCLKs.
센서가 VGA 프레임 640x480을 전송한다고 가정 해 봅시다. 비디오 프레임은 RGB888 형식입니다. 우리가 픽셀 클록 (PCLK) 당 8 비트를 전송하는 카메라 센서를 가지고 있다고 가정 해 봅시다. 이것은 한 픽셀의 데이터를 전송하는 것을 의미하며, 3 개의 PCLK가 필요합니다. HSYNC는 640 x 3, 1920 PCLK마다 센서에 의해 발사됩니다. VSYNC는 전체 프레임이 전송 된 후 즉 1920x480, 921600 PCLK 이후에 센서에 의해 시작됩니다.

The camera interface's hardware block (that could be a part of any SOC) would constantly monitor the above lines to see if the sensor has transmitted anything. A typical camera interface would come with some internal buffering and would also have an associated DMA to transfer the image to the destination memory. The buffer would capture the incoming pixels to temporarily buffer them, and using the DMA the pixels would be transferred (probably line by line) through multiple burst DMA transfers to a destination address in the memory (pre programmed by the camera interface driver programmer). The camera interface's programmer interface might also give a facility of issuing hardware interrupts upon the receipt of the HSYNC, VSYNC signals to the host micro-controller. This could serve as a useful trigger for DMA reprogramming if required.
카메라 인터페이스의 하드웨어 블록 (SOC의 일부일 수 있음)은 센서가 아무 것도 전송하지 않았는지 확인하기 위해 위의 라인을 지속적으로 모니터링합니다. 전형적인 카메라 인터페이스는 약간의 내부 버퍼링을 가지며 이미지를 대상 메모리로 전송하는 관련 DMA를 갖습니다. 버퍼는 들어오는 픽셀을 캡처하여 일시적으로 버퍼에 저장하고, DMA를 사용하면 메모리의 대상 주소 (카메라 인터페이스 드라이버 프로그래머가 사전 프로그래밍 한)로 다중 버스트 DMA 전송을 통해 픽셀이 전송됩니다. 카메라 인터페이스의 프로그래머 인터페이스는 호스트 마이크로 컨트롤러에 대한 HSYNC, VSYNC 신호 수신시 하드웨어 인터럽트를 발행하는 기능을 제공 할 수도 있습니다. 필요할 경우 DMA 재 프로그래밍을위한 유용한 트리거 역할을 할 수 있습니다.




2018년 5월 20일 일요일

실장 방법에 따른 Chip 종류

목적: Chip의 Datasheet를 볼 때 PIN Map을 참조해야 하는데 하나의 Chip이라도 다른 형태의 PIN이 존재하기 때문에 어떤 핀을 참조해야 하는지 모르는 경우가 있다. 그 이유가 QSOP, QFN 등의 단어들과 함께 나오는데 이를 이해하기 위함이다.


내용: Chip은 Board에 실항하는 방법에 따라 모양이 달라지는데 Lead 가 있는 타입과 없는 타입이 나눠지는 경우, 그리고 더 자세하게 나눠지는 경우 들이 있다.
QSOP: Quarter-size small-outline package
QFN: quad-flat no-leads







2018년 5월 18일 금요일

I2C 통신 속도 분석

목적: Chip 의 Register에 적혀있는 I2C 의 속도 설명을 이해한다.

Datasheet 내용
I2C Master SCL High Time This field configures the high pulse width of the SCL output when the Serializer is the Master on the local I2C bus.
Units are 40 ns for the nominal oscillator clock frequency. The default value is set to provide a minimum 5us SCL high time with the reference clock at 25 MHz + 100ppm.
The delay includes 5 additional oscillator clock periods. Min_delay = 39.996ns * (SCL_HIGH_TIME + 5

분석
1. SCL High Time 이 8bit, SCL Low Time 이 8bit 로 Register에 적혀 있다.
    - I2C 통신에 사용되는 Clock의 신호가 High 로 유지되는 시간과 Low로 유지되는 시간을 설명해주는 내용이다.
2. 두 Register의 기본값은 0x79, 0x79로 동일하다.
3. Units are 40ns for the norminal oscillator clock frequency.
    - 하나의 단위는(여기서 SCL의 High 가 한번 유지되는 시간이나 Low가 유지되는 시간) 40ns 이다. 기본값(여기서는 0x79)는 SCL High나 Low 유지되는 시간의 최소값인 5us 를 만족하기 위해서 입력되어 있다.
    - 여기서는 reference clock이 25MHz 라고 되어 있는데 이 clock은 PCLK 과 동일한 것인지
    - clock 이 25MHz 라면 frequency 는 40ns
    - 계산 식으로는 Min-delay = 39.996ns * (SCL_HIGH_TIME + 5) 일때 'SCL_HIGH_TIME' 를 0x79(121) 로 변환하면 39.996ns * (121 + 5) = 5039.496ns 가 된다. 이는 약 5um 으로서 최소값 5um 를 만족 한다.
    - SCL High Time이 5.039496um 이고 SCL Low Time이 5.039496um 라는 것은 하나의 cycle이 10.07899um 라는 것으로 99,216.27083 이라는 숫자가 나오며 99.2162783 KHz로 계산된다.
    - 최종적으로 reference clock 이 25MHz 의 clock 이라면 0x79 를 기본 값으로 하는 I2C SCL High, I2C SCL Low 값은 약 100KHz 의 I2C Clock Frequency 를 의미한다.
4. 그러면 여기서 100ppm 은 무엇인가
5. remote delay



2018년 5월 12일 토요일

Excel VBA 기본

목적: 간단한 VBA 코드가 필요할 경우(Macro 작성) 기본 문법도 모두 검색해서 찾아보기 때문에 효율성이 떨어지고 내가 제대로 알고 있는지 의구심이 들 때가 있기 때문에

프로그램 설명: 1번 Row 부터 800번 Row 까지 이동하면서 1번 Column 에 특정 문자열이 들어 있으면 특정 명령을 수행한다.

1) 코드에는 아래와 같이 쓴다. Sub 와 함수 이름을 작성하고 괄호를 열고 닫은 후 엔터를 치면 End Sub 가 자동으로 나타난다. 이 말은 문법이 아직까지 틀린적이 없다는 것이다.
Sub MakeIndent()
End Sub

2) 사용할 변수 선언
Sub MakeUndext()
    Dim i, j, K As Integer
End Sub

3) For 구문 작성
Sub Makeindent()
    Dim i, j, K As Integer
    For i=1 To 800 
    Next
End Sub

4)  특정 문자열이 있는지 확인
Sub Makeindent()
    Dim i, j, K As Integer
    For i=1 To 800
        if ( inStr(Cells(i, 1), "Heading") ) Then
        Endif
    Next
End Sub

5) 특정 행동을 실행
Sub Makeindent()
    Dim i, j, K As Integer
    For i=1 To 800
        if ( inStr(Cells(i, 1), "Heading") ) Then
            j = MID(Cells(i, 1), 9, inStr(Cells(i, 1), "&") - 9)
            For k To j
                ' 오른쪽으로 Shift 하는 코드를 넣는데 이런 부분은 Macro 기록으로 실행한 뒤 복사해서 사용하면 된다.
            Next
        Endif
    Next

2018년 4월 12일 목요일

2018년 3월 9일 금요일

Folder 자동으로 생성, 번호순으로

참조: Link

FOR /L %N IN (1,1,500) DO md "JiraIssue_%N"

요약
FOR /L 는 기본 키워드로서 For Loop를 돌려주고
이때 N은 변수 명으로 1부터 1씩 500까지 번호를 돌려주면서 폴더 만들고(md) 그때의 이름은 JiraIssue_%N 이다.

---

FOR /L
Conditionally perform a command for a range of numbers.

Syntax 
      FOR /L %%parameter IN (start,step,end) DO command

Key
   start       : The first number 
   step        : The amount by which to increment the sequence
   end         : The last number

   command     : The command to carry out, including any
                 command-line parameters.

   %%parameter : A replaceable parameter:
                 in a batch file use %%G (on the command line %G)

2018년 3월 2일 금요일

I2C 는 무엇인가?

참조: Link

I2C 버스는 동일한 회로 기판에있는 구성 요소간에 쉽게 통신 할 수 있도록 1980 년대 초에 Philips에서 설계되었습니다. Philips Semiconductors는 2006 년 NXP로 이름이 변경 되었습니다.

I2C 라는 이름은 "Inter IC"를 의미 하는데. IIC 또는 I²C 버스라고도 불립니다.

본래의 통신 속도는 초당 최대 100kbps로 정의되었으며 많은 애플리케이션에서는 더 빠른 전송을 필요로하지 않습니다.  fastmode 는 400kbit이며 - 1998 년부터 - 고속 3.4Mbit 옵션도 사용할 수 있습니다. 최근에는 fast mode plus 라고 이들의 중간 범위의 전송 속도가 지정되었습니다. 이 외에도 Ultra Fast Mode UFM이 있지만 솔직히 실제 I2C 버스는 아니라고 할 수 있습니다.

I2C는 단일 보드 에서뿐만 아니라 케이블을 통해 연결된 구성 요소를 연결하는 데에도 사용됩니다. 단순함과 유연성은이 버스를 많은 어플리케이션에 매력적으로 만드는 주요 특징입니다.

가장 중요한 기능은 다음과 같습니다.

  • 케이블은 2 개만 사용 합니다.
  • 예를 들어 RS232와 같은 엄격한 baudrate 요구 사항이없는 경우 마스터는 버스 클럭을 생성합니다
  • 간단한 마스터 / 슬레이브 관계가 모든 구성 요소 사이에 존재합니다.
  • 버스에 연결된 각 장치는 고유 한 주소로 소프트웨어 주소 지정이 가능합니다
  • I2C는 중재 및 충돌 감지를 제공하는 진정한 다중 마스터 버스입니다.


더 배우고 싶습니까?
I2C 도구 및 소프트웨어를 찾고 계십니까?

당신이 고속 I2C 솔루션 을 찾든 USB I2C 인터페이스 찾든 상관없이, 버스를 모니터링하든 자신의 애플리케이션을위한 소프트웨어 플랫폼이 필요하든, 우리는 당신을 도울 수 있습니다!.

2018년 3월 1일 목요일

PyQt 사용간 메모

Python Code(Anaconda 환경) 에서는 문제없이 실행 되었는데 Pyinstaller로 exe 로 변형한 다음에는 출력 에러가 떴다.
문제는 PyQt의 plainTextEdit 에서 .toPlainText() 로 가져온 string format 이 QString 이었는데 이것이 처리되는것에 문제가 생긴 것이었고 str() 으로 변경한 후에는 문제가 사라졌다.

2018년 2월 26일 월요일

Silicon Lab Download Warning message

Silicon Laboratories 에서 build 된 hex 파일을 다운로드 할 때 Warning message

Warning! An attempt was made to modify address 2200 which is restricted!
Continue download?

말 그대로 수정이 금지된 메모리 주소인 2200 을 수정하려고 한다는 이미이며

실제 사용 가능하지 않는 메모리 영역에 쓰려고 할 때 이 문제가 발생 하였다.

구체적으로는 어떤 상황이었나면
1. C8051F582(64k flash) 에서 사용하던 코드를 C8051F547(8k flash) 에서 사용하려고 해서 위 Warning이 떴고 실제 Code영역의 크기가 10k 를 넘었다.
2. 프로그램의 버전을 Linker 의 옵션으로 주었고 "CODE(?CO?VER(0x7FF6))" 이 때 사용하는 영역인 0x7FF6 이 사용 가능한 메모리 크기를 넘어 위 메시지가 떴다.


2018년 2월 23일 금요일

Cross Compiler

크로스 컴파일러(cross compiler)는 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러이다. 크로스 컴파일러 툴은 임베디드 시스템 혹은 여러 플랫폼에서 실행파일을 생성하는데 사용된다. 이것은 운영 체제를 지원하지 않는 마이크로컨트롤러와 같이 컴파일이 실현 불가능한 플랫폼에 컴파일하는데 사용된다. 이것은 시스템이 사용하는데 하나 이상의 플랫폼을 쓰는 반가상화에 이 도구를 사용하는 것이 더 일반적이게 되었다.

내 PC에서 Compile 할 때 특정 Chip 에서 돌아가는 명령을 만들고 싶다면(Assembly, Binary) 해당 Chip 에서 받아들일 수 있는 명령을 만드는 Compiler를 만들어야 한다.

Clock Stretching

참조: Link

송신에는 clock stretching 이 있고 수신에는 Clock stretching 이 없는 이유
송신일 때는 데이터를 보내고 다음 클럭 신호를 보낸 후 잠시 응답을 기다려야 함
수신 모드일 때는 데이터를 받고 다음 클럭 신호를 받아 응답을 해줘야 함

둘의 차이점은
송신은 데이터를 보낸 후 응답을 기다리는 것이고,
수신은 데이터를 받은 후 응답을 해주는 것이다.

송신은 자신의 속도로는 끝났지만 기다려 주기 때문에 송신때만 clock stretching 이 있다.

참조: Link

I2C 통신에서 마스터 장치는 클럭 속도를 결정합니다. RS232와는 달리 I2C 버스는 마스터와 슬레이브가 사전 정의 된 baud rate와 정확하게 동기화되는 것을 완화할 수 있도록 명시적인 클럭 신호를 제공합니다.

I2C 슬레이브가 마스터가 제공하는 클럭 속도와 상호 작용할 수없고 약간 느려질 필요가있는 상황이 있습니다. 이것은 클럭 스트레칭이라고하는 메커니즘에 의해 수행됩니다.

I2C 슬레이브는 버스 속도를 줄여야하는 경우 시계를 잡고 있을 수 있습니다. 반면에 마스터는 클럭 신호를 하이 상태로 해제 한 후 클록 신호를 다시 읽고 라인이 실제로 하이가 될 때까지 기다려야합니다.

Bandwidth
클럭 스트레칭은 다소 이상하게 들리지만 일반적인 관행입니다. 그러나 공유 버스의 전체 대역폭은 상당히 줄어들 수 있습니다. 따라서 특히 여러 장치가 공유하는 I2C 버스의 경우 클록 스트레칭의 영향을 평가하는 것이 중요합니다. 가장 느린 I2C 장치가 버스 성능을 지배하지 않도록하십시오.

ISO26262

참조: Link

ISO 26262의 목적은 모든 자동차 E/E(전기 및 전자) 시스템의 안전관련 규약들을 표준화하는 것

이 공인된 ISO 26262의 초안을 변호사들이 최신 인증 기술로 인정하여 이용할 수 있

독일 법에 따르면 자동차의 오작동으로 인한 인적 피해에 대해서는 자동차 제조업체가 법적 책임이 따르게 되지만, 이러한 경우, 최신 기술을 통해 오작동을 발견되지 않을 경우에는 법적 책임이 없어지게 됩니다.

ISO 26262 표준은 개발부터 폐기까지 전반적인 제품 개발 프로세스에 관한 규제 사항과 권고사항을 제공합니다. 이 표준은 시스템 또는 컴포넌트에 수용 가능한 위험 수준을 할당하는 방법과 전체 테스트 프로세스의 문서화를 상세히 기술합니다. 일반적으로 ISO 26262는:

자동차 안전 수명관리(관리, 개발, 생산, 운영, 서비스, 폐기)를 제공하고 라이프사이클 주기의 각 단계에 따른 필요한 활동의 조정을 지원합니다.
자동차의 위험 등급(Automotive Safety Integrity Level, ASIL)을 결정하기 위해 자동차에 특화된 위험 기반 접근 방식을 제공합니다.
ASIL을 사용하여 수용 가능한 추가적인 위험을 수용하기 위한 컴포넌트의 필요한 안전 요구사항을 제공합니다.
충분하고 수용가능한 안전 수준을 보장하기 위한 검증 및 확인 방식에 요구사항을 제공합니다.

Automotive Safety Integrity Level (ASIL)
위험 노출 확률, 운전자가 수행 가능한 제어력, 심각한 문제가 발생할 경우 일어날 수 있는 결과의 심각성들이 조합된 내용을 기초로 위험성 평가가 ASIL로 이어집니다. ASIL은 시스템에서 사용되는 기술들을 다루지는 않습니다. ASIL은 운전자와 도로 위의 다른 운전자들에게 미치는 위험성에만 초점을 맞추고 있습니다.

각 안전 요구사항은 ASIL의 A, B, C 또는 D등급으로 나뉘는데, 여기서 D등급이 안전이 중요한 프로세스와 엄격한 테스트 규제를 가지는 등급입니다. ISO 26262 표준은 컴포넌트의 ASIL의 구성요소를 기반으로 하여 최소한의 테스트 요구사항을 상세히 파악합니다. 따라서 테스트에 반드시 사용되어야 하는 방식을 판단하는 데 도움이 됩니다. ASIL이 결정되고 나면, 시스템에 대한 안전 목표가 형성됩니다. 이로써 안전을 보장하기 위해 필요한 시스템 동작이 정의됩니다.

예를 들어, 윈드실드 와이퍼 시스템을 생각해보겠습니다. 와이퍼 기능이 오작동할 경우 운전자의 시야에 끼칠 영향을 안전 분석이 결정하게 될 것입니다. ASIL은 특정 레벨의 제품 무결성에 도달에 적합한 방식을 결정하기 위한 가이드를 제공합니다. 이 가이드는 현재 안전 방식을 보완하기 위해 제작되었습니다. 현재 자동차들은 이미 높은 안전성을 가지도록 제조되고 있지만, ISO 26262는 업계들 간의 특정한 방식들을 표준화하기 위해 제정되었습니다.

7. 테스트 툴 조건
ISO 26262 개발 과정 중 테스트는 중요한 컴포넌트입니다. 안전이 중요한 시스템은 반드시 테스트 시나리오에 적절히 응답하고 여러 인적 및 환경 입력에 노출되었을 때 특정 안전 한계치를 벗어나면 안됩니다. 고품질의 테스트 시스템을 사용하면 제품의 성능을 개선하고 품질과 안정성은 높이며 문제 발생율을 낮출 수 있습니다. 현장이 아닌 생산 중에 에러를 발견하면 실패 비용이 10배까지 줄어들고 생산 단계가 아닌 디자인 단계에서 에러가 발견되면 또 10배까지 비용을 절감할 수 있다고 평가되었습니다. 테스트는 이러한 오류들을 발견하고 데이터를 발견하여 디자인 또는 프로세스를 개선하기 때문에 회사와 조직에 귀중한 가치를 제공합니다. 새로운 기술의 도입과 최적의 방법론으로 프로세스에 혁신을 주도하면 상당한 효율성을 얻고 비용은 줄일 수 있습니다. 툴을 간과하고 시스템의 디자인만 생각하기 쉬운데, 툴은 최종 사용자의 안전에 있어 매우 중요합니다.

참조: Link
3. Automotive Safety Intergrity Level(ASIL)
- one of four levels to specify the item's or element's necessary requirments of ISO-26262 and safety measures to apply for avoiding an unreasonable residual risk, with D representing the most stringent and A the least stringent level
- ASIL은 item 혹은 element에 요구되는 불합리한 잔류 위험을 피하기 위한 안전대책에 대한 등급으로서  ISO 26262에서는 4개의 등급이 있으며, A가 가장 낮고, D가 가장 높음
- Item 정의로부터 차량 수준의 위험원 분석 및 리스크 평가( H&R) 를 통해 Item의 작동 불량으로 인한 피해의 심각성(Severity), 발생 가능성(Exposure), 통제 가능성 ( Controllability)에 의거 등급을 결정하며, 이를 ASIL이라고 함
- ASIL 등급 결정 방법은 Part 3에 명시되어 있음

SIL -> ASIL
정량적 평가 기준은 하드웨어만 있음
소프트웨어는 정량적 평가가 없음

참조: Link
ASIL 수준이 갖는 의미
- ISO 26262는 ASIL 수준에 따라 고장 상황에서도 설계자 및 시스템 엔지니어가 실현해야 하는 안전 요구사항을 정의하며, 시스템이 사용자(운전자, 승객, 도로 교통 이용자 등)의 안전에 대해 충분한 여유를 제공해야 한다.
- ASIL 수준은 특정 모듈에 결부되는 것이 아니라 특정 기능에 결부된다.
- ASIL 수준은 감지 가능성 향상 및 대응 조치 실행과 같이 동일한 기능을 수행하는 두 가지 개별적인 요소의 분리를 통해 낮출 수 있다.
- 구현된 방식 그대로 안전 핵심 기능의 추적 가능성을 입증할 수 있으려면 설계 사이클의 각 단계에서 적절한 증거를 유지해야 한다.

2018년 2월 22일 목요일

Splash screen


참조: Link

A splash screen is a graphical control element consisting of a window containing an image, a logo, and the current version of the software. A splash screen usually appears while a game or program is launching. A splash page is an introduction page on a website.[1][2] A splash screen may cover the entire screen or web page; or may simply be a rectangle near the center of the screen or page. The splash screens of operating systems and some applications that expect to be run in full screen usually cover the entire screen.
스플래시 화면은 이미지, 로고 및 소프트웨어의 현재 버전이 포함 된 창으로 구성된 그래픽 제어 요소입니다. 스플래시 화면은 대개 게임이나 프로그램이 시작될 때 나타납니다. 스플래시 페이지는 웹 사이트의 소개 페이지입니다. [1] [2] 스플래시 화면은 전체 화면 또는 웹 페이지를 포함 할 수 있습니다. 화면 또는 페이지 중앙 근처의 사각형 일 수 있습니다. 운영 체제의 스플래시 화면과 전체 화면에서 실행될 것으로 예상되는 일부 응용 프로그램은 일반적으로 전체 화면을 덮습니다.

-> 프로그램 처음 시작 시 뜨는 화면으로 로고 처럼 일부 화면일 수도 있고, 전체 화면을 바로 보여주는 것일수도 있다.

rendering, 렌더링


참조: Link

렌더링 방식은 기술적으로 매우 다양하지만, 그래픽 처리 장치(GPU) 같은 렌더링 장치를 통한 그래픽스 파이프라인을 따라 씬 파일에 저장되어있는 3차원 연출로부터 2차원의 그림을 만들어낸다는 점은 동일하다.

Level Shifter



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

google 검색: Link
A level shifter in digital electronics, also called a logic-level shifter, is a circuit used to translate signals from one logic level or voltage domain to another, allowing compatibility between ICs with different voltage requirements, such as TTL and CMOS.[1][2] Many modern full featured systems use level shifters to bridge domains between low-power application processors running at 1.8 V and other system functions like sensors or other analog intensive applications running at 3.3 or 5V.

2018년 1월 17일 수요일

SPI study

참조: Link

Serial Peripheral Interface (SPI)
직렬 주변 장치 인터페이스 (Serial Peripheral Interface, SPI)는 두 장치 간의 양방향 통신에 사용되는 매우 일반적인 통신 프로토콜입니다. 표준 SPI 버스는 MOSI (Master Out Slave In), MISO (Master In Slave Out), SCK (Clock In) 및 SS (Slave Select)의 네 가지 신호로 구성됩니다. 비동기 직렬 인터페이스와 달리 SPI는 대칭이 아닙니다(H/W 가 Master와 Slave 동일하지 않다.). SPI 버스에는 하나의 마스터와 하나 이상의 슬레이브가 있습니다. 마스터는 버스의 모든 슬레이브와 통화 할 수 있지만 각 슬레이브는 마스터와 만 통화 할 수 있습니다. 버스의 각 슬레이브는 고유 한 슬레이브 선택 신호를 가져야합니다. 마스터는 슬레이브 선택 신호를 사용하여 어떤 슬레이브가 통화 할 것인지 선택합니다. SPI는 또한 클록 신호를 포함하고 있기 때문에, 두 디바이스는 모두 데이터 속도에 동의 할 필요가 없다. 유일한 요구 사항은 clock이 관련된 모든 장치의 최대 주파수보다 낮다는 것입니다.

SPI 전송의 예
SPI 버스의 마스터가 전송을 시작하고자 할 때, 먼저 통신하고자하는 슬레이브에 대해 SS 신호를 로우로 당겨야합니다. 일단 SS 신호가 낮 으면, 그 슬레이브는 버스에서 청취 할 것입니다. 그러면 마스터는 자유롭게 데이터 전송을 시작합니다.

SCK 신호와 관련하여 4 가지 SPI 버스 표준이 있습니다. 4 가지 모드는 CPOL과 CPHA의 두 매개 변수로 나뉩니다.

CPOL은 Clock POLarity를 나타내며 버스가 유휴 상태 일 때 SCK 신호의 기본값 (고 / 저)을 지정합니다.
CPHA는 Clock PHAse의 약자로 클록 데이터의 어느 에지가 샘플링되는지 (상승 / 하강)를 결정합니다.

모든 장치의 데이터 시트는 이러한 매개 변수를 지정하므로 적절하게 조정할 수 있습니다. 가장 일반적인 설정은 CPOL = 0 (공회전 낮음) 및 CPHA = 0 (샘플 상승 에지)입니다.

다음은 CPOL = 0 및 CPHA = 0을 사용한 전송 예입니다.


SPI 전송의 비트는 LSB 우선 전송됩니다.

모든 SPI 전송은 마스터에 의해서만 제어됩니다. 마스터는 클럭을 생성하고 슬레이브 선택 신호를 제어합니다. 이것은 슬레이브 자체가 마스터에게 데이터를 보낼 수있는 방법이 없다는 것을 의미합니다!

각 SPI 전송은 풀 듀플렉스입니다. 즉, 데이터가 마스터에서 슬레이브로, 슬레이브에서 마스터로 동시에 전송(양방향)됩니다. 마스터가 전송을 할 때 슬레이브가 데이터 전송을 거부 할 수있는 방법은 없지만 통신이 한 방향 일 때 장치는 더미 바이트 (일반적으로 모두 1 또는 모두 0)를 전송합니다. 마스터가 슬레이브에 대해 데이터를 읽는 중이라면 슬레이브는 마스터가 보내는 데이터를 무시한다는 것을 알게됩니다.

SPI를 사용하는 장치는 일반적으로 SS 신호가 낮아질 때마다 여러 바이트를 보내거나받습니다. 이 방식으로 SS 신호는 전송을 프레임하는 방법으로 작동합니다. 예를 들어, SPI 버스가있는 플래시 메모리가 있고 일부 데이터를 읽으려는 경우 SS 신호가 낮아지고 마스터가 특정 주소의 메모리 읽기 명령을 전송하고 마스터가 보관하는 한 SS가 낮고 SCK를 토글하면 플래시 메모리가 데이터를 계속 전송합니다. SS가 하이로 복귀하면 플래시 메모리는 판독 명령을 종료하는 것을 알고있다.

MISO 신호는 여러 장치에 연결될 수 있기 때문에 각 장치는 SS 신호가 낮을 때만 회선을 구동합니다. 이것은 회색 영역으로 표시됩니다.


SPI 슬레이브
Mojo 기본 프로젝트에서, spi_slave.v 파일은 AVR과 인터페이스하는 데 사용되는 SPI 모듈을 포함합니다. 이 경우 AVR은 마스터이고 FPGA는 슬레이브입니다. AVR이 마스터 인 이유는 SPI 버스가 아날로그 핀에서 데이터를 전송하는 데 사용되기 때문입니다. FPGA가 언제 데이터를 사용할 수 있는지 알 수있는 방법이 없기 때문에 FPGA는 AVR에 데이터가 있는지 계속 묻습니다. AVR을 마스터로 만들면 준비가되었을 때 바로 데이터를 보낼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
module spi_slave(
    input clk,
    input rst,
    input ss,
    input mosi,
    output miso,
    input sck,
    output done,
    input [7:0] din,
    output [7:0] dout
  );
   
  reg mosi_d, mosi_q;
  reg ss_d, ss_q;
  reg sck_d, sck_q;
  reg sck_old_d, sck_old_q;
  reg [7:0] data_d, data_q;
  reg done_d, done_q;
  reg [2:0] bit_ct_d, bit_ct_q;
  reg [7:0] dout_d, dout_q;
  reg miso_d, miso_q;
   
  assign miso = miso_q;
  assign done = done_q;
  assign dout = dout_q;
   
  always @(*) begin
    ss_d = ss;
    mosi_d = mosi;
    miso_d = miso_q;
    sck_d = sck;
    sck_old_d = sck_q;
    data_d = data_q;
    done_d = 1'b0;
    bit_ct_d = bit_ct_q;
    dout_d = dout_q;
     
    if (ss_q) begin                           // if slave select is high (deselcted)
      bit_ct_d = 3'b0;                        // reset bit counter
      data_d = din;                           // read in data
      miso_d = data_q[7];                     // output MSB
    end else begin                            // else slave select is low (selected)
      if (!sck_old_q && sck_q) begin          // rising edge
        data_d = {data_q[6:0], mosi_q};       // read data in and shift
        bit_ct_d = bit_ct_q + 1'b1;           // increment the bit counter
        if (bit_ct_q == 3'b111) begin         // if we are on the last bit
          dout_d = {data_q[6:0], mosi_q};     // output the byte
          done_d = 1'b1;                      // set transfer done flag
          data_d = din;                       // read in new byte
        end
      end else if (sck_old_q && !sck_q) begin // falling edge
        miso_d = data_q[7];                   // output MSB
      end
    end
  end
   
  always @(posedge clk) begin
    if (rst) begin
      done_q <= 1'b0;
      bit_ct_q <= 3'b0;
      dout_q <= 8'b0;
      miso_q <= 1'b1;
    end else begin
      done_q <= done_d;
      bit_ct_q <= bit_ct_d;
      dout_q <= dout_d;
      miso_q <= miso_d;
    end
     
    sck_q <= sck_d;
    mosi_q <= mosi_d;
    ss_q <= ss_d;
    data_q <= data_d;
    sck_old_q <= sck_old_d;
     
  end
   
endmodule

이 모듈은 CPOL = 0 및 CPHA = 0으로 가정합니다.

SS가 낮아질 때까지 기다립니다. SS가 낮아지면 data_d / _q 레지스터로 데이터 이동을 시작합니다. 8 비트가 옮겨지면 dout에 새로운 데이터가 있음을 알립니다. 클럭의 하강 에지에서 전송 시작시 din에 의해 제공된 데이터가 시프트 아웃됩니다.


SPI 마스터
우리의 Clock / Visualizer Shield는 Mojo에 현재 시간을 제공하는 RTC (Real-Time Clock) 장치를 사용합니다. RTC는 SPI 버스를 통해 Mojo에 연결됩니다. 이 경우 Mojo의 FPGA는 마스터이고 RTC는 슬레이브입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
module spi #(parameter CLK_DIV = 2)(
    input clk,
    input rst,
    input miso,
    output mosi,
    output sck,
    input start,
    input[7:0] data_in,
    output[7:0] data_out,
    output busy,
    output new_data
  );
   
  localparam STATE_SIZE = 2;
  localparam IDLE = 2'd0,
    WAIT_HALF = 2'd1,
    TRANSFER = 2'd2;
   
  reg [STATE_SIZE-1:0] state_d, state_q;
   
  reg [7:0] data_d, data_q;
  reg [CLK_DIV-1:0] sck_d, sck_q;
  reg mosi_d, mosi_q;
  reg [2:0] ctr_d, ctr_q;
  reg new_data_d, new_data_q;
  reg [7:0] data_out_d, data_out_q;
   
  assign mosi = mosi_q;
  assign sck = (~sck_q[CLK_DIV-1]) & (state_q == TRANSFER);
  assign busy = state_q != IDLE;
  assign data_out = data_out_q;
  assign new_data = new_data_q;
   
  always @(*) begin
    sck_d = sck_q;
    data_d = data_q;
    mosi_d = mosi_q;
    ctr_d = ctr_q;
    new_data_d = 1'b0;
    data_out_d = data_out_q;
    state_d = state_q;
     
    case (state_q)
      IDLE: begin
        sck_d = 4'b0;              // reset clock counter
        ctr_d = 3'b0;              // reset bit counter
        if (start == 1'b1) begin   // if start command
          data_d = data_in;        // copy data to send
          state_d = WAIT_HALF;     // change state
        end
      end
      WAIT_HALF: begin
        sck_d = sck_q + 1'b1;                  // increment clock counter
        if (sck_q == {CLK_DIV-1{1'b1}}) begin  // if clock is half full (about to fall)
          sck_d = 1'b0;                        // reset to 0
          state_d = TRANSFER;                  // change state
        end
      end
      TRANSFER: begin
        sck_d = sck_q + 1'b1;                           // increment clock counter
        if (sck_q == 4'b0000) begin                     // if clock counter is 0
          mosi_d = data_q[7];                           // output the MSB of data
        end else if (sck_q == {CLK_DIV-1{1'b1}}) begin  // else if it's half full (about to fall)
          data_d = {data_q[6:0], miso};                 // read in data (shift in)
        end else if (sck_q == {CLK_DIV{1'b1}}) begin    // else if it's full (about to rise)
          ctr_d = ctr_q + 1'b1;                         // increment bit counter
          if (ctr_q == 3'b111) begin                    // if we are on the last bit
            state_d = IDLE;                             // change state
            data_out_d = data_q;                        // output data
            new_data_d = 1'b1;                          // signal data is valid
          end
        end
      end
    endcase
  end
   
  always @(posedge clk) begin
    if (rst) begin
      ctr_q <= 3'b0;
      data_q <= 8'b0;
      sck_q <= 4'b0;
      mosi_q <= 1'b0;
      state_q <= IDLE;
      data_out_q <= 8'b0;
      new_data_q <= 1'b0;
    end else begin
      ctr_q <= ctr_d;
      data_q <= data_d;
      sck_q <= sck_d;
      mosi_q <= mosi_d;
      state_q <= state_d;
      data_out_q <= data_out_d;
      new_data_q <= new_data_d;
    end
  end
   
endmodule

이 경우 CPOL = 0 및 CPHA = 1입니다.

전반적인 아이디어는 동일하지만, 이제는 FPGA가 SCK 신호를 생성해야한다. CLK_DIV 파라미터는 FPGA의 클럭을 얼마나 분할할지 지정하는 데 사용됩니다. 기본값은 2이며 이는 SCK의 주파수가 FPGA의 주파수의 1/4 (2 ^ 2 = 4 클록 사이클)이됨을 의미합니다. CLK_DIV가 3으로 설정되면 SCK는 FPGA 클럭의 1/8 (2 ^ 3 = 8 클럭 사이클)이됩니다.