Terasic SoCKitでLinuxをブートしてみた
Terasic SoCKitを入手したのでLinuxをブートしてみました。
↓箱の写真。
↓ボード写真 MicroSDスロットは裏側にあります。
linuxブート方法はTerasicのページからRocketBoards.orgへの リンクがあったのでそのまま試しました。 Arrow SoCKIT Evaluation Board - How to Boot Linux
特に難しい操作はありませんが、MicroSDは付属していないので用意する必要があります。
以下ブートログ
U-Boot SPL 2012.10 (Apr 02 2013 - 18:25:57) SDRAM : Initializing MMR registers SDRAM : Calibrationg PHY SEQ.C: Preparing to start memory calibration SEQ.C: CALIBRATION PASSED DESIGNWARE SD/MMC: 0 U-Boot 2012.10 (Feb 28 2013 - 21:33:41) CPU : Altera SOCFPGA Platform BOARD : Altera SOCFPGA Cyclone 5 Board DRAM: 1 GiB MMC: DESIGNWARE SD/MMC: 0 *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: mii0 Warning: failed to set MAC address Hit any key to stop autoboot: 0 reading uImage 2693576 bytes read reading socfpga.dtb 7970 bytes read ## Booting kernel from Legacy Image at 00007fc0 ... Image Name: Linux-3.7.0 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2693512 Bytes = 2.6 MiB Load Address: 00008000 Entry Point: 00008000 ## Flattened Device Tree blob at 00000100 Booting using the fdt blob at 0x00000100 XIP Kernel Image ... OK OK Loading Device Tree to 0fffa000, end 0fffef21 ... OK Starting kernel ... Booting Linux on physical CPU 0 Initializing cgroup subsys cpuset Linux version 3.7.0 (build@atull-linux1) (gcc version 4.7.3 20121106 (prerelease) (crosstool-NG linaro-1.13.1-4.7-2012.11-20121123 - Linaro GCC 2012.11) ) #1 SMP Fri Feb 15 10:15:57 CST 2013 CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache Machine: Altera SOCFPGA, model: Altera SOCFPGA Cyclone V Memory policy: ECC disabled, Data cache writealloc BUG: mapping for 0xfffec000 at 0xfffec000 out of vmalloc space PERCPU: Embedded 8 pages/cpu @80d58000 s10816 r8192 d13760 u32768 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 260096 Kernel command line: console=ttyS0,57600 root=/dev/mmcblk0p2 rw rootwait PID hash table entries: 4096 (order: 2, 16384 bytes) Dentry cache hash table entries: 131072 (order: 7, 524288 bytes) Inode-cache hash table entries: 65536 (order: 6, 262144 bytes) Memory: 1024MB = 1024MB total Memory: 1034040k/1034040k available, 14536k reserved, 0K highmem Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) vmalloc : 0xc0800000 - 0xff000000 (1000 MB) lowmem : 0x80000000 - 0xc0000000 (1024 MB) modules : 0x7f000000 - 0x80000000 ( 16 MB) .text : 0x80008000 - 0x804bcb2c (4819 kB) .init : 0x804bd000 - 0x804e7a40 ( 171 kB) .data : 0x804e8000 - 0x80516e60 ( 188 kB) .bss : 0x80516e84 - 0x8054e664 ( 222 kB) SLUB: Genslabs=11, HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1 Hierarchical RCU implementation. NR_IRQS:16 nr_irqs:512 512 sched_clock: 32 bits at 100MHz, resolution 10ns, wraps every 42949ms Console: colour dummy device 80x30 Calibrating delay loop... 1594.16 BogoMIPS (lpj=7970816) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 Setting up static identity map for 0x38eab8 - 0x38eb10 CPU1: Booted secondary processor CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 Brought up 2 CPUs SMP: Total of 2 processors activated (3188.32 BogoMIPS). devtmpfs: initialized NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations L310 cache controller enabled l2x0: 8 ways, CACHE_ID 0x410030c9, AUX_CTRL 0x32060000, Cache size: 524288 B hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers. hw-breakpoint: maximum watchpoint size is 4 bytes. bio: create slab <bio-0> at 0 SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb Switching to clocksource timer3 NET: Registered protocol family 2 TCP established hash table entries: 131072 (order: 8, 1048576 bytes) TCP bind hash table entries: 65536 (order: 7, 524288 bytes) TCP: Hash tables configured (established 131072 bind 65536) TCP: reno registered UDP hash table entries: 512 (order: 2, 16384 bytes) UDP-Lite hash table entries: 512 (order: 2, 16384 bytes) NET: Registered protocol family 1 RPC: Registered named UNIX socket transport module. RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. NFS: Registering the id_resolver key type Key type id_resolver registered Key type id_legacy registered NTFS driver 2.1.30 [Flags: R/W]. jffs2: version 2.2. (NAND) 息 2001-2006 Red Hat, Inc. msgmni has been set to 2019 io scheduler noop registered (default) Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled ffc02000.serial0: ttyS0 at MMIO 0xffc02000 (irq = 690) is a 8250 console [ttyS0] enabled ffc03000.serial1: ttyS1 at MMIO 0xffc03000 (irq = 691) is a 8250 brd: module loaded at24 0-0051: 4096 byte 24c32 EEPROM, writable, 32 bytes/write cadence-qspi ff705000.spi: master is unqueued, this is deprecated m25p80 spi2.0: unrecognized JEDEC id 905d10 m25p80 spi2.1: unrecognized JEDEC id ffffff cadence-qspi ff705000.spi: Cadence QSPI controller driver dw_spi_mmio fff00000.spi: master is unqueued, this is deprecated dw_spi_mmio fff01000.spi: master is unqueued, this is deprecated stmmac - user ID: 0x10, Synopsys ID: 0x37 DMA HW capability register supported Enhanced/Alternate descriptors RX Checksum Offload Engine supported (type 2) TX Checksum insertion supported libphy: stmmac: probed eth0: PHY ID 00221611 at 1 IRQ 0 (stmmac-0:01) active socfpga_phy_reset_mii writing extended registers to phyaddr 1 Initializing USB Mass Storage driver... usbcore: registered new interface driver usb-storage USB Mass Storage support registered. Dedicated Tx FIFOs mode Using DMA mode dwc_otg ffb40000.usb: DWC OTG Controller dwc_otg ffb40000.usb: new USB bus registered, assigned bus number 1 dwc_otg ffb40000.usb: irq 656, io mem 0xffb40000 Init: Port Power? op_state=b_peripheral hub 1-0:1.0: USB hub found hub 1-0:1.0: 1 port detected mousedev: PS/2 mouse device common for all mice i2c /dev entries driver Synopsys Designware Multimedia Card Interface Driver dw_mmc ff704000.dwmmc0: couldn't determine pwr-en, assuming pwr-en = 0 dw_mmc ff704000.dwmmc0: Using internal DMA controller. dw_mmc ff704000.dwmmc0: DW MMC controller at irq 667, 32 bit host data width, 1024 deep fifo dw_mmc ff704000.dwmmc0: 1 slots initialized dw_mmc ff704000.dwmmc0: Version ID is 240a mmc_host mmc0: Bus speed (slot 0) = 12500000Hz (slot req 400000Hz, actual 390625HZ div = 16) usbcore: registered new interface driver usbhid usbhid: USB HID core driver oprofile: no performance counters oprofile: using timer interrupt. TCP: cubic registered NET: Registered protocol family 17 NET: Registered protocol family 15 Key type dns_resolver registered VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4 ThumbEE CPU extension supported. Registering SWP/SWPB emulation handler Waiting for root device /dev/mmcblk0p2... dw_mmc ff704000.dwmmc0: data FIFO error (status=00000800) mmc0: problem reading SD Status register. mmc_host mmc0: Bus speed (slot 0) = 12500000Hz (slot req 12500000Hz, actual 12500000HZ div = 0) mmc0: new high speed SDHC card at address e624 mmcblk0: mmc0:e624 SU08G 7.40 GiB mmcblk0: p1 p2 p3 kjournald starting. Commit interval 5 seconds EXT3-fs (mmcblk0p2): warning: maximal mount count reached, running e2fsck is recommended EXT3-fs (mmcblk0p2): using internal journal EXT3-fs (mmcblk0p2): recovery complete EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode VFS: Mounted root (ext3 filesystem) on device 179:2. devtmpfs: mounted Freeing init memory: 168K INIT: version 2.88 booting Starting Bootlog daemon: bootlogd. Configuring network interfaces... eth0: device MAC address xx:xx:xx:xx:xx:xx udhcpc (v1.20.2) started Sending discover... libphy: stmmac-0:01 - Link is Up - 1000/Full Sending discover... Sending select for 192.168.21.9... Lease of 192.168.21.9 obtained, lease time 3600 /etc/udhcpc.d/50default: Adding DNS 192.168.21.1 done. Starting portmap daemon... INIT: Entering runlevel: 5 Starting OpenBSD Secure Shell server: sshd NET: Registered protocol family 10 done. Starting syslogd/klogd: done Starting Lighttpd Web Server: lighttpd. Stopping Bootlog daemon: bootlogd. Poky 8.0 (Yocto Project 1.3 Reference Distro) 1.3 socfpga_cyclone5 ttyS0 socfpga_cyclone5 login:
T-Kernelについて調べてみた
T-Kernelについてちょっと調べたのでメモ
T-KernelはオープンソースのリアルタイムOS
T-Engineフォーラムでドキュメント・開発環境・ソースコードが公開されている。
○ドキュメント
公開仕様書にあるドキュメントはユーザー登録不要で誰でも読める。
T-Kernel 2.0 仕様書は理解しておきたい。後はまだ見てない。
○開発環境
・T-Kernel 2.00.01 Software Package
開発に必要な環境の詰め合わせ。
Windows環境はCygwin+Eclips+gcc(Interface2012年5月号(QEMU特集)に環境構築の記事がある)
Linuxは多分Eclips+gcc
開発環境にはQEMUが入っていて実機レスでソフトウェア開発可能
(ターゲットは標準T-Engineボード?)
○ソースコード
T-KernelとT-Kernel 2.0がある。
2.0はメモリキャッシュ制御機能、物理タイマ機能、ユーティリティ機能が追加されている。
ライセンスはT-License 2.0とT-License 1.0があるT-License 2.0の方がゆるい。開発者が選択可能。
ソースコードはハードウェア非依存部とボード依存部、CPU依存部に分かれている。
依存部はARM11とSH(型番忘れた)のコードが入っている。多分リファレンスボードはすぐに動く。
一から依存部を実装するのは大変そう。
SystemVerilogのパラメータ付きクラスを試してみた(解決編)
SystemVerilogのパラメータ付きクラスを試してみたを更新してから
Twitterで「Baseクラス作ったらpushできる」と教えて頂き解決しました。
修正したコード
module top(); class c_hoge_base; //Baseクラス追加 virtual function void print(); endfunction endclass //Baseクラス継承 class c_hoge #(int k = 0) extends c_hoge_base; function void print(); //Warning対策にvoidを追加 $display("k = %d",k); endfunction endclass:c_hoge //型をBaseクラスにする c_hoge_base q_c_hoge[$]; c_hoge_base h_c_hoge[*]; c_hoge_base i_c_hoge_base; initial begin c_hoge#(0) i0_c_hoge; c_hoge#(1) i1_c_hoge; c_hoge#(2) i2_c_hoge; c_hoge#(3) i3_c_hoge; i0_c_hoge = new(); i1_c_hoge = new(); i2_c_hoge = new(); i3_c_hoge = new(); i0_c_hoge.print(); i1_c_hoge.print(); i2_c_hoge.print(); i3_c_hoge.print(); q_c_hoge.push_back(i0_c_hoge); h_c_hoge["hoge0"] = i0_c_hoge; q_c_hoge.push_back(i1_c_hoge); h_c_hoge["hoge1"] = i1_c_hoge; $display("pop_front"); i_c_hoge_base = q_c_hoge.pop_front(); i_c_hoge_base.print(); i_c_hoge_base = q_c_hoge.pop_front(); i_c_hoge_base.print(); $display("hash table"); h_c_hoge["hoge0"].print(); end endmodule
実行結果
# k = 0 # k = 1 # k = 2 # k = 3 # pop_front # k = 0 # k = 1 # hash table # k = 0
これでパラメータ付きクラスでもキューや連想配列に入れる事が出来ました。
後、newの引数でいいじゃんというツッコミも頂いたので私の使用例を載せました。
このコードでやりたい事は
- モジュールtest_modelをgenerateで複数インスタンス
- test_model内にはtaskが宣言されていてこれをクラスから参照したい。
- writeタスクは手が入れれないのでパス指定で呼び出すしかない。(writeタスクをクラスに移動できるならこんな事しなくても大丈夫ですが・・・)
- できるだけループ宣言を使って記述を減らしたい(ただしこの例では減らせませんでした^^;
後、enumと連想配列使ってクラス配列を任意の文字列で呼び出すのが
どのモデルにつながっているか見わかりやすくて好きなので使っています。
typedef enum { test_model_A, test_model_B, test_model_C, test_model_D, test_model_E } e_model_name; parameter MODEL_NUM = 5; /*************test_module**************/ /*変更できないモデル*/ module test_model(); task write(int a); $display("test_model write task %d",a); endtask endmodule : test_model /***************prg_top*****************/ module prg_top(); class piyo_base; virtual task start(); endtask virtual task exec(); endtask endclass class piyo#(e_model_name k = test_model_A) extends piyo_base; int m_val; e_model_name m_e_model_name; function new(int val); m_val = val; m_e_model_name = k; endfunction task start(); $display("start : This Class %s , m_val = %0d",m_e_model_name,m_val); endtask task exec(); $display("exec : This Class %s , m_val = %0d",m_e_model_name,m_val); $root.top.model_loop[k].i_test_model.write(m_val);//ここのkはパラメータでないとダメ(変数は使えない) endtask endclass piyo_base piyo_h_array[e_model_name]; piyo#(test_model_A) i_piyo0; piyo#(test_model_B) i_piyo1; piyo#(test_model_C) i_piyo2; piyo#(test_model_D) i_piyo3; piyo#(test_model_E) i_piyo4; initial begin i_piyo0 = new(10); i_piyo1 = new(20); i_piyo2 = new(30); i_piyo3 = new(40); i_piyo4 = new(50); piyo_h_array[test_model_A] = i_piyo0; piyo_h_array[test_model_B] = i_piyo1; piyo_h_array[test_model_C] = i_piyo2; piyo_h_array[test_model_D] = i_piyo3; piyo_h_array[test_model_E] = i_piyo4; $display("\n-----start task-----"); foreach (piyo_h_array[i]) begin piyo_h_array[i].start; end $display("\n-----exec task-----"); piyo_h_array[test_model_B].exec; piyo_h_array[test_model_C].exec; $finish; end endmodule:prg_top /***************top*****************/ module top(); generate genvar i; for(i=0; i<MODEL_NUM;i=i+1)begin : model_loop test_model i_test_model(); end endgenerate prg_top i_prg_top(); endmodule : top
実行結果
# # -----start task----- # start : This Class test_model_A , m_val = 10 # start : This Class test_model_B , m_val = 20 # start : This Class test_model_C , m_val = 30 # start : This Class test_model_D , m_val = 40 # start : This Class test_model_E , m_val = 50 # # -----exec task----- # exec : This Class test_model_B , m_val = 20 # test_model write task 20 # exec : This Class test_model_C , m_val = 30 # test_model write task 30 # ** Note: $finish : E:/altera/13.0/test/test2.sv(81)
i_piyo0~i_piyo4までの宣言をループ内に入れる事が出来ればもっと
コードが短くなると思いますがやり方が思いつきませんでした。
そもそもこんなやり方しなくてももっと良い方法があるかも・・・
7/4追記:
コメントで指摘してもらったdefineマクロで
i_piyo0~i_piyo4が簡潔にならないか試してみました。
//マクロ定義 `define PIYO_INSTANCE(val) piyo#(val``) i_piyo``val``; `define PIYO_SET(val,init) i_piyo``val`` = new(init``); \ piyo_h_array[``val``] = i_piyo``val``; //宣言(一部抜粋) `PIYO_INSTANCE(0) //piyo#(test_model_A) i_piyo0; `PIYO_INSTANCE(1) //piyo#(test_model_B) i_piyo1; `PIYO_INSTANCE(2) //piyo#(test_model_C) i_piyo2; `PIYO_INSTANCE(3) //piyo#(test_model_D) i_piyo3; `PIYO_INSTANCE(4) //piyo#(test_model_E) i_piyo4; initial begin `PIYO_SET(0,10) //i_piyo0 = new(10); piyo_h_array[test_model_A] = i_piyo0; `PIYO_SET(1,20) //i_piyo1 = new(20); piyo_h_array[test_model_B] = i_piyo1; `PIYO_SET(2,30) //i_piyo2 = new(30); piyo_h_array[test_model_C] = i_piyo2; `PIYO_SET(3,40) //i_piyo3 = new(40); piyo_h_array[test_model_D] = i_piyo3; `PIYO_SET(4,50) //i_piyo4 = new(50); piyo_h_array[test_model_E] = i_piyo4;
ちょっと記述は少なくなったかな?
本当は↓の様にループで書ければ良かったのだが残念ながらエラーになりました。
generate genvar j; for(j=0; j<MODEL_NUM;j=j+1)begin : model_loop `PIYO_INSTANCE(j) end endgenerate
SystemVerilogのパラメータ付きクラスを試してみた
[SystemVerilog] 接続記述をもっとエクストリーム的に書こうという記事で
パラメータがついたクラスが紹介されているので試してみた。
まずはパラメータが反映されているかテスト
module top(); class c_hoge #(int k = 0); function print(); $display("k = %d",k); endfunction endclass:c_hoge initial begin c_hoge #(0)i0_c_hoge; c_hoge #(1)i1_c_hoge; c_hoge #(2)i2_c_hoge; c_hoge #(3)i3_c_hoge; i0_c_hoge = new(); i1_c_hoge = new(); i2_c_hoge = new(); i3_c_hoge = new(); i0_c_hoge.print(); i1_c_hoge.print(); i2_c_hoge.print(); i3_c_hoge.print(); end endmodule
ModelSimで実行すると
# k = 0 # k = 1 # k = 2 # k = 3
おぉ!ちゃんと入ってる!
で、私がやりたいのはこれをデータクラスとして使って
キューや連想配列に入れる事だったのだが・・・
エラーで動かなかった。書いたコードは↓
module top(); class c_hoge #(int k = 0); function print(); $display("k = %d",k); endfunction endclass:c_hoge c_hoge q_c_hoge[$]; c_hoge h_c_hoge[*]; initial begin c_hoge#(0) i0_c_hoge; c_hoge#(1) i1_c_hoge; c_hoge#(2) i2_c_hoge; c_hoge#(3) i3_c_hoge; i0_c_hoge = new(); i1_c_hoge = new(); i2_c_hoge = new(); i3_c_hoge = new(); i0_c_hoge.print(); i1_c_hoge.print(); i2_c_hoge.print(); i3_c_hoge.print(); q_c_hoge.push_back(i0_c_hoge); h_c_hoge["hoge0"] = i0_c_hoge; q_c_hoge.push_back(i1_c_hoge); //ここでエラー h_c_hoge["hoge1"] = i1_c_hoge; end endmodule
実行
# k = 0 # k = 1 # k = 2 # k = 3 # ** Fatal: Illegal assignment to class work.top/c_hoge #(0) from class work.top/c_hoge #(1) # # Time: 0 ps Iteration: 0 Process: /top/#INITIAL#14(#ublk#0#15) File: E:/altera/13.0/test/test.sv # Fatal error in Module top at E:/altera/13.0/test/test.sv line 33 #
パラメータが初期値(k=0)の時は問題無い様ですが
パラメータに値が入るとエラーになります。
多分キューや連想配列を宣言する時の型c_hogeはc_hoge#(0)と同じなので
c_hoge#(1)という型(?)が入らないと言う事かな?
C++のtemplate的な使い方を想定してたのだが・・・(´・ω・`)
7/3追記 : Twitterで色々教えて頂き解決しました。
SystemVerilogのパラメータ付きクラスを試してみた(解決編)
プログラミング言語? NyarukoでLet's\(・ω・)/にゃーしてみた-2-
前回の足し算は1桁しか表示出来なかったので2桁表示に改造してみた。
それが以下プログラム
adder2.nyaruko
(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃーcosmic!(」・ω・)」うー(/・ω・)/にゃーcosmic!(」・ω・)」うー!!(/・ω・)/にゃー!! Let's\(・ω・)/にゃー(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!Let's\(・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃーLet's\(・ω・)/にゃー(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!Let's\(・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー(/・ω・)/にゃー CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!! (」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!! CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃーCHAOS☆CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!I WANNA CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!I WANNA CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃーCHAOS☆CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!Let's\(・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!Let's\(・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃーI WANNA CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃーCHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー(/・ω・)/にゃーLet's\(・ω・)/にゃー(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!I WANNA CHAOS!
しかし、このプログラム問題はない(はず)ですが実行しても動作しません。
これを元のBrainf**kで書いたコードが以下になります。
+++++++[>++++++>++++++++>+>+++++++<<<<-]>+>+++++>++>->,>,< .<<<<.>>>>>.<<<<.>> [>->->+<<<-]> [>+<-]< +< [>>>[<]<[>>->>+<<<]<<-]>>> [>[<+<<+>>>-]<<<.>>-.>]<<[>>>[>+<-]>.<<<]
これはBrainf**k系の処理系で実行する事ができて2桁表示も動作しています。
どうもr-fxxkの[]処理がBrainf**kとは異なる様です。
その為条件分岐を書くと挙動がおかしくなります。
書き換えれるか試しましたがRuby経験0の私には無理でしたorz
プログラミング言語? NyarukoでLet's\(・ω・)/にゃーしてみた-1-
Brainf**kを調べてたらnyarukoという言語を見つけたのでプログラミングしてみた。
https://github.com/masarakki/nyaruko_lang
命令は簡単。たった8つしかない。
(」・ω・)」うー(/・ω・)/にゃー - ポインタを右へ移動 (」・ω・)」うー!(/・ω・)/にゃー! - ポインタの指す値を1増やす (」・ω・)」うー!!(/・ω・)/にゃー!! - ポインタを左へ移動 (」・ω・)」うー!!!(/・ω・)/にゃー!!! - ポインタの指す値を1減らす CHAOS☆CHAOS! ポインタの指す値が0なら 対応する 'I WANNA CHAOS!' までジャンプする I WANNA CHAOS! ポインタの指す値が0で無いなら 対応する 'CHAOS☆CHAOS!' までジャンプする Let's\(・ω・)/にゃー ポインタの指す値を出力する cosmic! 入力から1バイト読み込こむ
元のBrainf**kの命令(>+<-[].,)を置き換えているだけのネタ言語なのだが
これでもチューリング完全みたいです。
実行には同じ作者さんが公開している「r-fxxk」が必要なので予めダウンロードしてRUBYPATHを設定。
付属しているサンプルを以下で実行できる。
./nyaruko haiyoru_konton.nyaruko
「Hello World!」が表示されればOK!
さっそく足し算プログラムを作成してみました。
一桁の数値を2つ入力し加算して表示するプログラムです。
ただし表示も一桁しかないので10以上は表示できません。
r-fxxkは1バイト読み込み命令が実装されてないので以下を追加。
r-fxxk/lib/r-fxxk.rb
69 when :get 70 cell[ptr] = STDIN.getc.bytes.to_a[0] #これを追加@Ruby1.9.2 cell[ptr] = STDIN.getc #Ruby1.8系だとこっち
adder.nyaruko
(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃーcosmic!(」・ω・)」うー(/・ω・)/にゃーcosmic!(」・ω・)」うー!!(/・ω・)/にゃー!! Let's\(・ω・)/にゃー(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!Let's\(・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃーLet's\(・ω・)/にゃー(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!Let's\(・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー(/・ω・)/にゃー CHAOS☆CHAOS!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!! (」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー!!(/・ω・)/にゃー!! (」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー(/・ω・)/にゃーCHAOS☆CHAOS!(」・ω・)」うー!!(/・ω・)/にゃー!!(」・ω・)」うー!(/・ω・)/にゃー!(」・ω・)」うー(/・ω・)/にゃー(」・ω・)」うー!!!(/・ω・)/にゃー!!!I WANNA CHAOS! (」・ω・)」うー!!(/・ω・)/にゃー!!Let's\(・ω・)/にゃー
実行
./nyaruko adder.nyaruko
12 <-数字2つ入力してEnter
1+2=3
ZedboardにDACを接続してみた-TLC7528C編-
AM変調した信号を出力するためにDACをいくつか買いましたのでZedboardに接続して信号を出力してみます。
まずは手持ちにあるTIのTLC7528C(10Msps)を使います。
今はまだFMCコネクタを使えないので使えるのはPmodしかありませんがPmodは8pinしかありません。
それに対してDACのブロック図は以下になっています。
データは8bitなのでピッタリに見えますがそうすると制御線が繋げません。
Pmodを2つ使えば16bit分確保できますがPmod間で信号がずれないか心配なのでなるだけ8ピンに抑えます。
その為にデータを7bitデータ+WEの構成にします。
制御線は他にCSとDAC選択線(TLC7528CはA/B 2chのDAC搭載)がありますが固定にします。
(仕様書を見る限りWEも固定で大丈夫そうですが、オシロでデータを見やすくする為に出力)
ZedboardからDDSの出力をさせ、オシロスコープで観測した結果が以下になります。
正弦波っぽく見えないのはOUTAをオシロに直結したので
ローパスフィルターを入れてないのが原因だと思います。
ノイズが多いのはブレットボードで空中配線をしているからでしょうか?