FC2カウンター FPGAの部屋 PmodHB5 のセンサー・フィードバック処理IP を作ってみた2
fc2ブログ

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

FPGAの部屋

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

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

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/3501-18ef9140
この記事にトラックバックする(FC2ブログユーザー)