December
SU MO TU WE TH FR SA
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


November
SU MO TU WE TH FR SA
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


October
SU MO TU WE TH FR SA
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


September
SU MO TU WE TH FR SA
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


August
SU MO TU WE TH FR SA
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


July
SU MO TU WE TH FR SA
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


June
SU MO TU WE TH FR SA
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


May
SU MO TU WE TH FR SA
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


April
SU MO TU WE TH FR SA
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


March
SU MO TU WE TH FR SA
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


February
SU MO TU WE TH FR SA
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


January
SU MO TU WE TH FR SA
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


[ ANALOG DISCOVERY 2 ]
2019/01/09
2019/01/19

[ Audio Processor ]
2019/05/09
2019/05/10
2019/05/11
2019/05/12
2019/05/19
2019/05/22
2019/05/24
2019/05/26
2019/05/28
2019/10/02
2019/10/06
2019/10/07
2019/10/17
2019/10/18
2019/10/19
2019/10/20
2019/11/01
2019/11/04
2019/11/10
2019/11/25
2019/12/01

[ DSP ]
2019/10/17
2019/10/18
2019/10/19
2019/10/20
2019/11/01

[ FPGA ]
2019/03/15
2019/04/11
2019/05/02
2019/05/03
2019/05/04
2019/10/17
2019/10/18
2019/10/19
2019/10/20
2019/11/01
2019/11/25
2019/12/01

[ Fedora ]
2019/01/13

[ Fusion PCB ]
2019/10/01
2019/10/07
2019/10/15
2019/10/16
2019/11/04
2019/11/07
2019/11/08
2019/11/10

[ LVM サイズ変更方法 ]
2019/01/08

[ MAX10 ]
2019/03/15
2019/04/11
2019/05/02
2019/05/03
2019/05/04
2019/10/17
2019/10/18
2019/10/19
2019/10/20
2019/11/01
2019/11/25

[ NextCloud ]
2019/02/03

[ OpenVPN ]
2019/02/03

[ PIC ]
2019/06/23

[ Perfume ]
2019/03/31

[ Perl ]
2019/02/03

[ Python3 ]
2019/02/09
2019/02/10
2019/03/08

[ Raspberry Pi ]
2019/10/15
2019/10/17
2019/10/18

[ define _RE_PHASEA (0x00000001) ]
2019/12/01

[ define _RE_PHASEB (0x00000002) ]
2019/12/01

[ hashtag ]
2019/02/09
2019/02/10

[ include <stdio.h> ]
2019/12/01

[ include <stdlib.h> ]
2019/12/01

[ おみくじ ]
2019/03/16

[ お気に入りの曲 ]
2019/03/30

[ かりんとう ]
2019/01/31

[ さつまいも ]
2019/01/31

[ オシロスコープ ]
2019/01/09
2019/01/19

[ サイクリングギア ]
2019/08/23

[ サーバー更新 ]
2019/01/13
2019/01/19
2019/02/03
2019/03/08

[ シグナルジェネレーター ]
2019/01/09
2019/01/19

[ スパムメール ]
2019/08/09

[ タピオカ ]
2019/02/06

[ プリント基板 ]
2019/06/22
2019/10/01
2019/10/07
2019/10/15
2019/10/16
2019/11/04
2019/11/07
2019/11/08
2019/11/10

[ プログラム開発 ]
2019/06/23

[ プロジェクトびっくりちゃん ]
2019/11/25
2019/12/01

[ ユニゾイン ]
2019/02/26
2019/02/27

[ ロジックアナライザー ]
2019/01/09
2019/01/19

[ 不正アクセス ]
2019/08/09
2019/10/10

[ 今年の目標 ]
2019/01/06

[ 初乗り ]
2019/03/21

[ 初詣 ]
2019/03/16

[ 半田付け ]
2019/11/10

[ 回路設計 ]
2019/11/04
2019/11/10

[ 散髪 ]
2019/03/01
2019/05/10
2019/07/12
2019/10/04

[ 新年会 ]
2019/03/16

[ 新幹線 ]
2019/02/26
2019/02/27

[ ]
2019/03/25
2019/03/26
2019/03/27
2019/03/28
2019/03/29
2019/04/01
2019/04/02
2019/04/03
2019/04/04
2019/04/05
2019/04/08
2019/04/09
2019/04/10
2019/04/11
2019/04/15
2019/04/16
2019/04/17
2019/04/18
2019/04/19

[ 流行 ]
2019/02/06

[ 盛岡市 ]
2019/02/26
2019/02/27

[ 積雪 ]
2019/02/10

[ 自動日記更新 ]
2019/02/09
2019/02/10
2019/03/08

[ 行天優莉奈 ]
2019/02/28
2019/04/15

[ 趣味の工作 ]
2019/04/26
2019/04/27
2019/04/28
2019/04/29
2019/04/30
2019/05/01
2019/05/02
2019/05/09
2019/05/10
2019/05/11
2019/05/12
2019/05/19
2019/05/22
2019/05/24
2019/05/26
2019/05/28
2019/06/22
2019/06/23

[ 電子レンジで一人分○○○ ]
2019/01/26
2019/01/27
2019/02/01

[ 飲み会 ]
2019/02/09


2019年12月06日(金) 9.9/3.9℃

Update: 07:47:04
サイクリング
今日もサイクリングは無しでした。
寒すぎて起きれません。(┳◇┳)




2019年12月05日(木) 15.4/2.0℃

Update: 06:37:11
サイクリング
今日もサイクリングは無しでした。
起きたら 06:30 前でした。 うわ、寝坊しちゃってやばいです。
昨日も早く寝たんですけどね。 早起きすらできなくなっちゃいました。




2019年12月04日(水) 16.4/3.0℃

Update: 06:08:32
サイクリング
今日もサイクリングは無しでした。
昨日は会社でなんだかとっても眠くて、昨日は早めにねたと思うのですが、今朝は起きれたのは 06:00 前でした。
今日も寒いです。




2019年12月03日(火) 16.1/6.1℃

Update: 05:46:59
サイクリング
今日もサイクリングは無しでした。
寒いし雨降るし。 もう無理。(´△`)




2019年12月02日(月) 19.2/6.5℃

Update: 05:53:36
サイクリング
今日もサイクリングば無しでした。
朝方から雨の予報だったので、目覚ましセットせずに寝ました。 セットしてても起きないけどねぇ。
起きたのは 05:30 でした。
てか雨降ってないですけど? これから降るのかな?




2019年12月01日(日) 12.0/2.0℃

Update: 08:19:29
サイクリング
今日もサイクリングは無しでした。
03:00 に目が覚めて YouTube を観てたんですが、残念ながら 04:30 に目覚ましが鳴っても外に出る気にはなりませんでした。
いやぁ、寒いですよ。
なので、05:00 過ぎに二度寝しました。

Update: 18:52:38
プロジェクト「びっくりちゃん」
先日「FPGA にカスタムでデザインした MCU を組み込む」と書いてから、なんとなく構想が固まってきました。
やるべきことは、大きく分けて
 (1) MCU のアーキテクチャを固める
 (2) ちゃんとした命令セットをデザインする
 (3) コンパイラも作らないとね
でしたね。

(1) のMCUアーキテクチャ(最大型)は、こんな感じです。 あくまでラスボス的な最大型で(笑)、PIC のプログラムを組み込むくらいなら MCU コアを含むイベント制御ブロック1個と GPIO だけで十分です。
ちなみに、私が組み込もうとしている MCU では レジスター(REGISTERS)は、32ビット(16ビットもありかもね)で、256個あります。 ほとんどの処理はレジスターだけで事足りるので、イベント制御ブロックの中の RAM はオプションになります。 スタックとか配列処理とか必要になったら組み込みます。


(2) と (3) については、LLVM を使わせてもらうことにしました。 LLVM については、clang というと知っている人が多いと思います。 clang は、GCC の何か新げなやつと思っている人もいるかもしれないですが、ライブラリの互換性はあるものの、全く違うものと思って良いと思います。
LLVM の基本的なアイデアは、コンパイラーやその他ツール類をモジュール化して、色々と柔軟性を持たせようというものです。
構成としては、(間違っているかもしれないですが)大まかには、
 (A) 多種多様な高級言語をハード依存のない中間言語に翻訳する「フロントエンド」
 (B) 中間言語を最適化する「最適処理」
 (C) 中間言語を機械語に翻訳する「バックエンド」
 (D) 翻訳された機械語をライブラリと結合して最終的な実行形式にする「リンカー」
 (E) その他のツール
のようになっています。
前記の clang は、(A) の部分に入っていて、C、C++、Mac でお馴染みの Objective-C などをコンパイルしてくれるプログラムです。

LLVM を使わせてもらうことの最大の利点は、Eclipse 等の統合環境(IDE)があるところですね。 C言語で開発して、最適化された中間言語コードまで半自動で出力してくれます。 最高ですよね。 私がやらなくちゃいけないのは、バックエンドを書くことです。 これは大したことではないですね。
私の場合のバックエンドの処理は、中間言語コードを自分で設計した MCU の機械語に変換して、FPGA の ROM イメージ(VHDLとか)に出力することです。 上図の ROM ってところに組み込むコードですね。

それでは、その中間言語ってどなものなのかという点ですが、LLVM では LLVM Intermediate Representation(IR) というアセンブラに似た言語になります。
例として、ロータリーエンコーダーの回転方向をチェックしてボリュームを上げ下げする処理を書きますと、C言語ではこんな感じですかね。 この re_event_handler() は、例えば 10[ms] のタイマーイベントとか、GPIO ポートの pahse-A のビットが変化したというイベントとかが発生したときに イベント制御から実行されるようにします。 GPIO ポートのアドレスは、仮に 0x80000000 としておきました。


#include <stdio.h>
#include <stdlib.h>

#define  _RE_PHASEA    (0x00000001)
#define  _RE_PHASEB    (0x00000002)
unsigned int*  GPIO = (unsigned int*)0x80000000u;

volatile static unsigned int  re_oPhaseA;
volatile static unsigned int  volume = 0;

int  re_event_handler()
{
    unsigned int  v;

    // check the phase-A for the value change
    v = *GPIO & _RE_PHASEA;
    if (re_oPhaseA != v) {
        // save the current value
        re_oPhaseA = v;

        // check the phase-B at phase-A rising-up timing
        if (v) {
            // check the phase-B for the rotation direction
            if ((*GPIO & _RE_PHASEB) == _RE_PHASEB) {
                // volume up
                ++volume;
            } else {
                // volume down
                --volume;
            }
        }
    }

    return 0;
}

で、このプログラムを clang にかけて、中間言語で最適化するとこんな感じのコードが生成されます。 実際に自分で設計した MCU コードに落とす段階で もうちょっと最適化が必要ですが、ここまで自動でやってくれるのなら、あとは屁でもないですよね。

@GPIO = dso_local local_unnamed_addr global i32* inttoptr (i64 2147483648 to i32*), align 8
@re_oPhaseA = internal global i32 0, align 4
@volume = internal global i32 0, align 4

; Function Attrs: norecurse nounwind uwtable
define dso_local i32 @re_event_handler() local_unnamed_addr #0 {
  %1 = load i32*, i32** @GPIO, align 8, !tbaa !2
  %2 = load i32, i32* %1, align 4, !tbaa !6
  %3 = and i32 %2, 1
  %4 = load volatile i32, i32* @re_oPhaseA, align 4, !tbaa !6
  %5 = icmp eq i32 %4, %3
  br i1 %5, label %16, label %6

; <label>:6:                                      ; preds = %0
  store volatile i32 %3, i32* @re_oPhaseA, align 4, !tbaa !6
  %7 = icmp eq i32 %3, 0
  br i1 %7, label %16, label %8

; <label>:8:                                      ; preds = %6
  %9 = and i32 %2, 2
  %10 = icmp eq i32 %9, 0
  %11 = load volatile i32, i32* @volume, align 4, !tbaa !6
  br i1 %10, label %14, label %12

; <label>:12:                                     ; preds = %8
  %13 = add i32 %11, 1
  store volatile i32 %13, i32* @volume, align 4, !tbaa !6
  br label %16

; <label>:14:                                     ; preds = %8
  %15 = add i32 %11, -1
  store volatile i32 %15, i32* @volume, align 4, !tbaa !6
  br label %16

; <label>:16:                                     ; preds = %6, %0, %14, %12
  ret i32 0
}

なんでこれが屁でもないのかが分からないという人のために解説します。(笑)
なんかごちゃごちゃした魔法みたいな訳の分からないコードに見えますが、アセンブラがわかる人ならすぐに理解できますが、基本的に処理するべき命令は  load
 store
 and
 icmp
 br
 label(命令じゃないけど)
しかないんですよ。 あとは全部飾りです。(笑) つまり、上記の5つの命令を組み込めば、ロータリーエンコーダーの処理ができちゃうんですよ。 屁でもないでしょ!(笑)
実際のところ、マイコンでやっている処理なんて 上記の5つくらいの命令(あと足し算と、引き算と、掛け算が欲しいかも)がごちゃごちゃ組み合わされている程度のものなのですよ。 屁でもないでしょ?(笑)

#FPGA #プロジェクトびっくりちゃん #Audio Processor