FC2カウンター FPGAの部屋 2016年06月25日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

舌下免疫療法(スギ花粉症)

舌下免疫療法(スギ花粉症)を今日からやり始めた。

舌下免疫療法とは、スギ花粉を薄めたの?を毎日、舌下に入れて、スギ花粉に体を慣らす療法だ。

参考、トリーさんの免疫療法ナビ

この療法は、研修を受けた医師がいる医療機関でしか受けることができない。舌下免疫療法を受けられる医療機関は上の参考のURLにある。
始めの日は、シダトレン スギ花粉 200JAU/mLのボトルをもらって、1日1回、1プッシュを舌下に投与した。これは医療機関で行って、30分間そこにいなくてはいけない。重篤なアレルギー症状、アナフィラキシーショックにならないかを見るためだ。
大丈夫だったら、次の日は自宅で、1日に1プッシュ、舌下に投与する。
3日目からは2プッシュ、5日目に3プッシュ、6日目は4プッシュ、7日目は5プッシュというようにだんだんと増やしていく。

8日目からは、2,000JAU/mL のボトルとなる。つまり濃度は10倍だ。それをまた同様に増やしていく。なお、このときは医療機関を受診する必要がある。

15日目からは、2,000JAU/mL のパックを1本舌下に投与する。これを3年から5年程度続けるそうだ。

途中で具合が悪くなったら、当然中止するようだ。薬価は割と安いようだ。今日のボトルは保険使わなくても400円くらいらしい。(保険は適用されます)
これで、スギ花粉症が良くなるとよいな。あと、ヒノキの方がひどいので、ヒノキもやりたい。
  1. 2016年06月25日 19:01 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

PmodHB5 のセンサー・フィードバック処理IP を作ってみた2

PmodHB5 のセンサー・フィードバック処理IP を作ってみた”の続き。

(2016/07/02 修正: ”PmodHB5 のセンサー・フィードバック処理IP を作ってみた3”で大幅に修正しました。そちらをご覧ください)

PmodHB5 のセンサー・フィードバック処理IP motor_monitor.cpp などを修正した。
まずは、overflow 引数と return 値の両方で overflow を知らせているのは無駄なので、return 値で overflow を知らせることにして、overflow 引数は削除した。
motor_monitor.cpp を示す。

// motor_monitor.cpp
// 2016/06/15 by marsee
// 2016/06/25 : overflow を削除、return 1 のときがoverflow
//

#include <ap_int.h>
#include <hls_stream.h>

#include "motor_monitor.h"

int motor_monitor(hls::stream<ap_uint_1 >& sa, hls::stream<ap_uint_1 >& sb,
        ap_uint<32> & sa_count, ap_uint_1 & sb_level){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE s_axilite port=sb_level
#pragma HLS INTERFACE s_axilite port=sa_count
#pragma HLS INTERFACE ap_hs port=sa
#pragma HLS INTERFACE ap_hs port=sb

    ap_uint_1 sad;
    ap_uint_1 sbd;

    for (sa_count=0; sa_count!=0xffffffff; sa_count++){ // sa=1の間はループ
#pragma HLS PIPELINE II=1
        sa >> sad;
        sb >> sbd;
        if (!sad)
            break;
    }
    if (sa_count == 0xffffffff) // overflow
        return 1;

    for (sa_count=1; sa_count!=0xffffffff; sa_count++){ // sa=0の間はループ
#pragma HLS PIPELINE II=1
        sa >> sad;
        sb >> sbd;
        if (sad)
            break;
    }
    if (sa_count == 0xffffffff) // overflow
        return 1;

    sb_level = sbd; // saが立ち上がった時のsbの値

    for (sa_count++; sa_count!=0xffffffff; sa_count++){ // sa=1の間はループ
#pragma HLS PIPELINE II=1
        sa >> sad;
        sb >> sbd;
        if (!sad)
            break;
    }
    if (sa_count == 0xffffffff) // overflow
        return 1;

    return 0;
}


motor_monitor_tb.cpp を示す。

// motor_monitor_tb.cpp
// 2016/06/15 by marsee
// 2016/06/25 : overflow を削除、return 1 のときがoverflow
//

#include <ap_int.h>
#include <hls_stream.h>

#include "motor_monitor.h"

#define DATASIZE 20

int motor_monitor(hls::stream<ap_uint_1 >& sa, hls::stream<ap_uint_1 >& sb,
        ap_uint<32> & sa_count, ap_uint_1 & sb_level);

int main(){
    using namespace std;

    ap_uint_1 saa[DATASIZE] = {1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1};
    ap_uint_1 sba[DATASIZE] = {0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1};

    hls::stream<ap_uint_1> sa;
    hls::stream<ap_uint_1> sb;

    ap_uint<32> sa_count;
    ap_uint_1 sb_level;

    for (int i=0; i<DATASIZE; i++){
        sa << saa[i];
        sb << sba[i];
    }
    int ret_val = motor_monitor(sa, sb, sa_count, sb_level);

    printf("sa_count = %d, sb_level = %d, return value = %d\n",
            (unsigned int)sa_count, (unsigned int)sb_level, ret_val);

    return 0;
}


なお、motor_monitor.h には修正がない。

これでC シミュレーションを行った。
motor_monitor_1_160625.png

C コードの合成を行った。
motor_monitor_2_160625.png

リソースが少なくなった。

C/RTLコシミュレーションを行った。
motor_monitor_3_160625.png

Latency は 2 クロック分少なくなっている。

C/RTLコシミュレーションの波形を示す。
motor_monitor_4_160625.png

Wait が合計3クロックから 1 + 1 = 2 クロックに減少した。
  1. 2016年06月25日 05:22 |
  2. Zybot
  3. | トラックバック:0
  4. | コメント:0