DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519

3,381 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,381
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519

    1. 1. DE0でラジコンカー 作ってみた 石井 康寛(いしい やすひろ)
    2. 2. 自己紹介• 本業は組み込みファームウェア技術者 (μITRON、組み込みLinux等)• マイコンを使用した電子工作が好き• Arduinoは去年から触りだしました• 日本アンドロイドの会神戸支部・プロペラブに 所属(私自身はあまり活動できてません)• Twitter : @yishii• Facebook : facebook.com/ishiiyasu
    3. 3. FPGA経験について • ほぼシロウトです。• 年末年始にやったことを紹介したいと思います。
    4. 4. きっかけ• たまたま梅田のカフェで鈴木さんと FPGAの話していたら、DE0ってボード と、本の事を教えてもらった。
    5. 5. FPGAボードで学ぶ組み込みシステム 開 発入門を見て
    6. 6. 本の目次• 第1章 FPGAの内部といろいろなFPGAボード• 第2章 FPGAの回路設計を体験• 第3章 もう少し進んだ回路設計• 第4章 波形観測による回路デバッグ• 第5章 FPGA内蔵CPUを試す• 第6章 自作周辺回路の接続• 第7章 いろいろな周辺回路を設計• 第8章 メモリコントローラの設計• 第9章 μClinuxの搭載
    7. 7. 面白そう!!• DE0と本かいました。• DE0はTerasicの通販よりもDigikeyが 安かったのでdigikeyにて購入。
    8. 8. とりあえず何か作ろう →Androidと繋ぐかなー→ひとまずAndyShieldのArduinoをDE0に載せ替えてみよう
    9. 9. AndyShieldの構成Arduino UART BT ATMEGA328P GPIOとPWM MotorDrv PCBはSeeed Studio Fusionにて作成
    10. 10. AndyShieldソフト構成 制御アプリMemoryMapLib UART/BT Arduino PF ADKGPIO PWM UART MicrobridgeMemoryMapLib → github.com/yishii
    11. 11. Android側-AndyLib夜子まま氏が公開されているAndroid用のBT接続クワガタロボット用アプリをその まま使用させていただく
    12. 12. 本を読みつつ、することリストをまとめた(時系列)• DE0にNiosII/e ソフトマクロCPUを載せる• NiosIIに周辺機能 pio(GPIO)をつなぐ• NiosIIに周辺機能UARTをつなぐ• VerilogでPWMを作成してNiosIIに繋ぐ• 上記機能をNiosII上のソフトから、Arduino API相当にて叩けるようにする• AndyShieldのソフトをそのまま動かす
    13. 13. 構成 Main control software MemoryMapLib Arduino compatible layer NiosII Processor System Interconnect Fabric UART PWM GPIO(4) Core Core 7seg Dec 2ch driver TB6552F BluetoothSPP Module
    14. 14. NiosIIを載せるSOPCビルダーで選ぶだけ。簡単。
    15. 15. GPIOを準備選ぶだけ。簡単。
    16. 16. UARTをつなぐ 通信速度や ストップビット長などは ロジックを小さくする為 固定のタイプにした。 これも選ぶだけ。
    17. 17. PWMを繋ぐ(1)module PWM8( →SOPCビルダーの周辺機能選択肢に input clk, input n_rst, input [7:0] value, PWMが無い・・・ので、 output pwmout); wire [7:0] counter; 8ビットPWMを作る wire [7:0] counter_d; wire [7:0] divider; wire [7:0] divider_d; DFF_8 DFF_8_dividerGen( .n_rst(n_rst), .clk(clk), .d(divider_d), .q(divider)); DFF_8 DFF_8_counterGen( .n_rst(n_rst), .clk(divider[3]), .d(counter_d), .q(counter)); assign divider_d = (n_rst == 1b0) ? 8h00 : divider + 8h01; assign counter_d = (n_rst == 1b0) ? 8h00 : counter + 8h01; assign pwmout = (n_rst == 1b0) ? (1b0) : ((counter <= value) ? (1b1) : (1b0));endmodule
    18. 18. PWMを繋ぐ(2) PWMをAVALONバスファブリックのmodule PWM8_avalon_busif( input clk, input reset_n, 仕様に合わせたモジュールを作成 input [1:0] address, input write, input [7:0] writedata, output [7:0] value1, output [7:0] value2, 組み込みマイコンのSRAM繋ぐ時の output pwmout1, output pwmout2); wire [7:0] value1_in; バスっぽい感じ(と思った) wire [7:0] value2_in; wire write_posedge; wire write_1d; // generate write posedge DFF_1 DFF_1_write_1dgen( デバッグに役立つかもしれないので .clk(clk), .n_rst(reset_n), .d(write), .q(write_1d)); 出力値を7セグにつないでおいた。 assign write_posedge = ((write == 1b1) && (write_1d == 1b0)) ? 1b1 : 1b0; // latch value1 DFF_8 DFF_8_value1( .clk(clk), .n_rst(reset_n), .d(value1_in), .q(value1)); assign value1_in = ((write_posedge == 1b1) && (address == 2b00)) ? writedata : value1;
    19. 19. SOPCビルダーでつながった なんかうれしい!!
    20. 20. NiosII側ソフトの作成 1.Arduino的なAPIで包む//// Arduino Modoki Core Module void analogWrite(int ch,unsigned char value)// {// Author : Yasuhiro ISHII,2012 IOWR(PWM_AVALON_0_BASE,ch == 0 ? 0 : 1,value);// }#include "Nios2Arduino.h"#include <unistd.h> void digitalWrite(int port,int value)#include <sys/alt_alarm.h> { static unsigned char outdata; unsigned char d;void arduinoMain(void){ d = 1 << port; setup(); if(value){ while(1){ outdata |= d; loop(); } else { } outdata &= ~d;} }int millis(void) IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE,outdata);{ } return (alt_nticks());}void delayMs(int x){ usleep( x * 1000 );}
    21. 21. NiosII側ソフトの作成 2.UARTをMemoryMapLibと繋ぐクラス作成 unsigned char SerialStream::read(void) { unsigned char ret = 0; UARTは if(mBufferedStream->size() >= 1){ mBufferedStream->pop(ret); }ファイルI/Oっぽく } return(ret); int SerialStream::write(unsigned char* buff,int len)リードライトできる { } fwrite(buff,len,1,fp); 関数が用意されて void SerialStream::flush(void) { mBufferedStream->flush(); } いた void SerialStream::setInterface(int* s) { fp = fopen(UART_0_NAME,"w+"); if(fp != NULL){ mConnected = true; } } MemoryMapLib NiosII UART/BT
    22. 22. AndyShield用の スケッチを動かす• インクルードファイル追加程度• ほぼそのまま動いた
    23. 23. ビルド・実行• プログラムがCyclonIII上に生成したメモ リーに入らない・・・→SOPCビルダー にて、SDRAMを選択してつないだ
    24. 24. ハードの製作DE0を固定するプラスチック部品はタミヤの工作 セットとデジットにて購入したものDE0のコネクタから信号を引き出して直結し た
    25. 25. 完成!

    ×