2013/11/25

하드코어 MCU여 안녕




간단한 LED 조명 시스템...인데

소프트코어로 NIOS를 써서 FPGA로만 구현해봤다. LED 드라이버는 예전에 만들어둔 MSL2100 보드.

PCB는 간단해져서 좋은데 MCU가 없으니 왜이리 불안하냐...

주요 기능들(LCD, 키 스캔, I2C, GPIO, etc)은 로직으로 구현하고 MCU는 외부 호스트 인터페이스에 집중한다는 컨셉으로 가는중인데, MCU와 로직의 인터페이스가 쉽지가 않네...
I2C나 GPIO는 늘 쓰던거라 별 걱정 없지만 LCD도 쉽지않아...

이게 잘되면 오픈코어 MCU로 가봐야것다.
"FPGA 벤더 인디펜던트 데이 프로젝트"

간만에 오픈코어 홈페이지나 가봐야지

2013/10/06

SmartFusion (A2F500-FGG256) MSS 프로그램 소스-1

#include "mss_uart.h"
#include &ltstdio.h&gt
#include &ltstdlib.h&gt

//#define ACTEL_STDIO_THRU_UART

#define RxBufferSize 0x20
char RxBuffer0[RxBufferSize];
uint16_t RxCounter0 = 0;

void UART0_Putch(char tmp);
uint32_t UART0_get_Number(void);
void show_Menu(void);


/* Main function */
int main(void)
{
char KeyIn;

/* Initialize and configure UART0. */
MSS_UART_init(&g_mss_uart0,MSS_UART_115200_BAUD, MSS_UART_DATA_8_BITS | MSS_UART_NO_PARITY | MSS_UART_ONE_STOP_BIT);

MSS_UART_polled_tx_string(&g_mss_uart0, "Start FW -------------------------ver 0.0.1\r\n");
show_Menu();

while(1)
{
#if 1
KeyIn = UART0_get_Number();
switch(KeyIn){
case 1:
MSS_UART_polled_tx_string(&g_mss_uart0, "1. HELP : Show menu explanation\r\n");
break;
default :
MSS_UART_polled_tx_string(&g_mss_uart0, "Invalid input value\r\n");
break;
}
MSS_UART_polled_tx_string(&g_mss_uart0, "anonymous>");
#endif
}

return 0;
}

void UART0_Putch(char tmp){
g_mss_uart0.hw_reg->THR = tmp;
}

uint32_t UART0_get_Number(void){
uint32_t KeyIn, key_value, i;
uint8_t status = 0;

/* Receive a string (Max RxBufferSize bytes) from the Hyperterminal ended by '\r' (Enter key) */
do
{
status = g_mss_uart0.hw_reg->LSR;
g_mss_uart0.status |= status;
if(((status & 0x01) != 0)&&(RxCounter0 < RxBufferSize))
{
key_value = g_mss_uart0.hw_reg->RBR;
status = g_mss_uart0.hw_reg->LSR;
g_mss_uart0.status |= status;
UART0_Putch(key_value);
if(key_value == '\r'){
RxBuffer0[RxCounter0]='\0';
UART0_Putch('\n');
KeyIn = atoi(RxBuffer0);

RxCounter0 = 0;
for(i = 0; i < RxBufferSize; i++)
RxBuffer0[i] = 0;

g_mss_uart0.hw_reg->RBR;
status = g_mss_uart0.hw_reg->LSR;
g_mss_uart0.status |= status;
return KeyIn;
}
else{
RxBuffer0[RxCounter0++] = key_value;
}
}
}while((key_value != '\r')&&(RxCounter0 != RxBufferSize));


return -1;

}

void show_Menu(void){
MSS_UART_polled_tx_string(&g_mss_uart0, "1. HELP : Show menu explanation\r\n");
MSS_UART_polled_tx_string(&g_mss_uart0, "anonymous>");

}


아래와 같이 실행된다.

























이 소스를 베이스로 Fabric과 ACE를 돌려봐야긋다.

2013/09/30

SmartFusion (A2F500-FGG256) UART

Actel 홈페이지에서 Using UART with a SmartFusion cSoC - Libero SoC and SoftConsole Flow Tutorial의 내용임.

먼저 리베로SoC를 실행해서 프로젝트를 생성해보자.






































A2F500 256 BGA 확인하고 OK






















이렇게 만들어진다.


다음은 Configuring MSS Peripherals
A2F500_UART_MSS_0를 더블클릭해보자.






















새창이 뜬다.




















여기서 WATCHDOG은 Disable 해놓자. 활성화 시켜놓으면 계속 리셋된다.

Clock Management 박스를 더블클릭해서 클럭 설정을 하자.



































빨간색 박스 안에 설정만 바꾸면 된다. On-Chip RC Oscilator 100MHz 입력을 80MHz로 바꿔서 MCU에서 사용할 거임. OK 눌러주자.

File > Save 해주고 아래 그림과 같이 Update Instance(s) with Lastest Component... 실행.
















다음은 Design > Configure Firmware












HAL_0의 Generate 체크박스를 클릭하면 다운로드 어쩌네하면서 드라이버를 주루룩 다운로드 한다.















File > Save에서 DESIGN_FIRMWARE 저장해주고 SmartDesign > Generate Component 를 실행한다.

실행이 완료되면 프로젝트 폴더내에 SoftConsole 폴더가 새로 생성된다.


Design Flow 윈도우 제일 아래 부분에 Develop Firware 항목의 Write Application Code를
더블 클릭하면 생성된 소프트콘솔 프로젝트가 실행된다.


































이렇게 뜬다.






























여기서 프로그램 짜면 되는거지...
튜터리얼에 보면 친절하게도 예제 프로그램도 있다. 고대로 함 넣어보자.


#include "mss_uart.h"
#define Microsemi_logo \
"\n\r \
** ** ******* ****** ***** **** ***** ****** ** ** ******* \n\r \
* * * * * * * * * * * * * * * * * \n\r \
* * * * * * ***** * * **** ****** * * * * * \n\r \
* * * * * * * * * * * * * * * \n\r \
* * ******* ****** * * **** ***** ****** * * ******* "

/* Main function */
int main()
{
const uint8_t greeting[] = "\n\rWelcome to SmartFusion "
"- customizable system-on-chip (cSoC)";

/* Initialize and configure UART0. */
MSS_UART_init
(
&g_mss_uart0,
MSS_UART_57600_BAUD,
MSS_UART_DATA_8_BITS | MSS_UART_NO_PARITY | MSS_UART_ONE_STOP_BIT
);

/* Send the Microsemi Logo over the UART_0 */
MSS_UART_polled_tx_string( &g_mss_uart0, (const uint8_t *)Microsemi_logo);

/* Send greeting message over the UART_0 */
MSS_UART_polled_tx( &g_mss_uart0, greeting, sizeof(greeting) );

while(1)
{
}
return 0;
}






















Project > Build Configurations > Set Active > 2 Release 로 변경



















Project > Properties를 선택해라. 새 창이 뜨는데 거기서 C/C++ Build 항목의 Setting를 선택하면 GNU C Linker 설정을 할 수 있다. Miscellaneous를 선택해서 Linker flags를 변경하자.
























production-execute-in-place.ld로 바꿔주면 된다.
Project > Build All 로 컴파일을 해보자.
혹시 ld 파일을 찾을 수 없다고 에러가 뜨면, 상대 경로를 절대 경로로 바꿔주면 된다.

.hex 파일이 생성되었으면 이젠 SmartFusion에 다운로드 해보자.
다시 리베로SoC로 돌아가자.

ENVM 블럭을 더블클릭하면 설정창이 뜬다.




















Available client types에서 Data Storage를 선택하고 Add to System...

























아래와 같이 적당히 이름 정해주고, hex 파일 위치 지정하고, Size of word를 32 bits로 변경한다. 그리고 OK






































SmartDesign > Generate Component 실행해서 ENVM 업데이트하고
Design > Generate Programming Data 실행


그리고 Program Device...인데....

왜 자꾸 Run Failed가 뜨지...







2013/08/28

GizmoSphere Windows 7 구동 테스트





어제 받은 기즈모보드 구동 모습

Ubuntu와 Windows 7을 깔아서 돌려봤다.
기즈모 홈페이지에서 윈도우용 드라이버를 배포하는게 아니라서 GPU, 사운드카드는 직접 IC 제조사 홈페이지에서 다운받아 깔아야 된다.

우분부, 윈도우 둘다 그냥 PC를 쓰는듯한 느낌임...임베디드 보드의 범주를 벗어난 물건인데..
이게 $199라니 할말없다.

SD카드나 온보드 플래시는 없으므로 SATA HDD나 USB 저장매체에 OS를 깔아서 돌려야된다는게 장점이 될지 단점이될지 몰것네.

확장핀의 IO들(GPIO, SPI, I2C, ADCs, etc)는 윈도우에서 어떻게 써먹을수 있는지 좀 알아봐야긋다.


2013/08/20

Low Cost Embedded Board - Rev_20130820

지금까지 발견한 쓸만한 임베디드 보드.
진작에 이렇게 나올것이지...이제와서 이 난리람.

1. Raspberry Pi 3 Model B
    - Processor : BCM2837[Quad Cortex-A53]
    - Memory : SDRAM(1G)
    - $35

2. Beaglebone Black
    - Processor : AM3359[Cortex-A8]
    - Memory : DDR3(512)
    - $45

3. Gizmo 2
    - Processor : AMD Embedded GX-210HA(Dual 64bit)[x86]
    - Memory : DDR3(1G)
    - $199

4. Edison
    - Processor : Atom + Quark
    - Memory : DDR3(1G)
    - $49.99

5. Wandboard
    - Processor : i.MX6(1/2/4)[Cortex-A9]
    - Memory : DDR3(512/1G/2G)
    - $79/99/129

6. UDOO
    - Processor : i.MX6(2/4)[Cortex-A9] + SAM3X8E[Cortex-M3]
    - Memory : DDR3(1G)
    - $99/115/135

7. Odroid-XU4
    - Processor : Exynos5422 [Cortex-A15] + [Cortex-A7]
    - Memory : DDR3(2G)
    - $74

8. Parallella
    - Processor : Zynq(2)[Cortex-A9] with FPGA Logic, Epiphany Coprocessor
    - Memory : ?(1G)
    - $99

2013/07/03

PySide, PySerial, Matplotlib

아따 어렵네...


import sys
from PySide.QtCore import *
from PySide.QtGui import *
import serial

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
import pylab

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

import threading, random

class TB_Form02(QDialog):
def update_data(self):
tmp = random.random()
self.data1.append(tmp)
tmp = random.random()
self.data2.append(tmp)
del self.data1[0]
del self.data2[0]

self.ax1.cla()
self.ax1.plot(range(50),self.data1)
self.ax2.cla()
self.ax2.plot(range(50),self.data2)
self.canvas.draw()

t = threading.Timer(1.0, self.update_data)
t.start()

def __init__(self, parent = None):
super(TB_Form02, self).__init__(parent)

self.data1 = [0]*50
self.data2 = [0]*50
# generate the plot
self.fig = Figure(figsize=(50,50), dpi=72, facecolor=(1,1,1), edgecolor=(0,0,0))
self.ax1 = self.fig.add_subplot(211)
self.ax2 = self.fig.add_subplot(212)
self.ax1.plot(range(50),self.data1)
self.ax2.plot(range(50),self.data2)

# generate the canvas to display the plot
self.canvas = FigureCanvas(self.fig)
self.canvas.setFixedSize(250,200)
self.update_data()

FRAME = QHBoxLayout()
FRAME.addWidget(self.canvas)
self.setLayout(FRAME)


if __name__ == '__main__':
app = QApplication(sys.argv)
form = TB_Form02()
form.show()

sys.exit(app.exec_())

2013/06/17

PySide, PySerial

import sys
from PySide.QtCore import *
from PySide.QtGui import *
import serial

class TB_Form01(QDialog):
    def __init__(self, parent = None):
        super(TB_Form01, self).__init__(parent)
     
        self.edit = QLineEdit("Write char to send")
        self.button = QPushButton("Send to MCU")

        layout = QVBoxLayout()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

        self.setLayout(layout)
        self.button.clicked.connect(self.sendSerial)

    def sendSerial(self):
        ch_232 = self.edit.text()
        ch_232 = ch_232.encode('ascii')
        ser.write(ch_232)
        ser.write('\r\n')
        ch_232 = ser.read()
        while ch_232 != '>':
            ch_232 = ser.read()
            sys.stdout.write(ch_232)

if __name__ == '__main__':
    ser=serial.Serial(63,115200)
    app = QApplication(sys.argv)
    form = TB_Form01()
    form.show()

    sys.exit(app.exec_())

2013/04/05

I2C Master VHDL

쓸만한 소스 찾았다.

http://www.xess.com/design_examples.php#Tutorials
Digital Camera Interface 프로젝트 내에 KAC_i2c와 I2C.

KAC_i2c에 기본적인 read/write는 설계되어 있고
burst mode read/write가 필요하면 스테이트 머신에 추가하면 된다.

주의할 점은 reset 시그널을 그냥 VCC로 연결하면 오동작한다.
전원 인가시 시스템 클럭을 카운트해서 리셋을 Low->High로 바꿔줘야 한다.
그냥 리셋을 VCC로 연결할 경우 I2C 첫번째 스타트 시그널이 제대로 생성되지 않음.


I2C Master VHDL 또다른 소스
http://www.eewiki.net/display/LOGIC/I2C+Master+%28VHDL%29

아직 테스트 해보진 않았다.
xess의 I2C 소스와 유사해 보이는데...

2013/03/18

Nios II 시작해보자-3


PIO를 추가해서 컨트롤 로직의 인터페이스로 사용해봤다.

이런 형태도 가능하구만...

늘 VHDL 파일 하나로만 설계를 해서 이런식으로 설계하는 방식이 있는줄도 몰랐다.

역시 많이 해봐야되...난 아직 멀었나봐...



기존에는 MCU로 UART 통신을 하고 FPGA로 대부분의 신호 처리를 하도록 설계했었는데...

더이상 그럴 필요가 없네.

Nios를 처음 시작한 목표는 달성했다. 움푸홧홧홧



다음엔 Qsys의 새로운 컴포넌트로 생성해서 써먹어봐야것다.

2013/01/04

XMOS ??

멀티코어 MCU??
FPGA와 MCU의 중간 정도 영역일거라고 하는데...

FPGA 입장에서 본다면
-> 아주 럭저리한 LUT를 몇개 가지고 있지 않은 FPGA

MCU 입장에서 본다면
-> 중간정도 성능의 MCU를 몇개 붙여놓은 MCU

일려나...