User:ストリーミングベースの線形層アクレーター用のFPGAハードウェアアクセラレータを作成するHLSソースコードを作成してください。`hls_math.h`、` hls_stream.h`、 `ap_fixed.h`などのVitis HLS Libaraiesを使用してください。カーネルへの入力は、入力ベクトルの1つのストリームと、重みとバイアス用の2つの固定配列です。すべてが固定点タイプの `ap_fixed <32,10>`を使用します。 Assistant:確かに、Vitis HLSライブラリを使用したストリーミングベースの線形層アクセラレータ用のFPGAハードウェアアクセラレータのサンプルコードです
`` `
#include "hls_math.h"
#include "hls_stream.h"
#include "ap_fixed.h"

//データ型を定義します
typedef ap_fixed <32,10> sixt_type;
typedef hls :: stream <sixt_type> stream_type;

//線形層関数を定義します
void linear_layer（stream_type＆input_stream、sixt_type weight []、sixt_type bias []、stream_type＆output_stream）{
    //入力値と出力値の数を設定します
    const int n = 1024;

    //線形層計算を実行します
    for（int i = 0; i <n; i ++）{
        sixt_type input_value = input_stream.read（）;
        sixed_type weighted_sum = 0;
        for（int j = 0; j <n; j ++）{
            weighted_sum + = input_value * weight [i * n + j];
        }
        sixt_type output_value = hls :: tanh（weighted_sum + bias [i]）;
        output_stream.write（output_value）;
    }
}

//アクセラレータのトップレベル関数
void linear_accelerator（stream_type＆input_stream、sixt_type weight []、sixt_type bias []、stream_type＆output_stream）{
    #pragma HLSインターフェイス軸ポート= input_stream
    #Pragma HLSインターフェイス軸ポート= output_stream
    #pragma HLSインターフェイスm_axiポート=重量オフセット=スレーブバンドル= gmem
    #pragma HLSインターフェイスm_axiポート=バイアスオフセット=スレーブバンドル= gmem

    //線形層関数を呼び出します
    linear_layer（input_stream、weight、bias、output_stream）; `` `` 
User:コードを書き換えて、8ビット固定点タイプを使用し、線形層の後にReluの非線形性をコードします。
#include "hls_math.h"
#include "hls_stream.h"
#include "ap_fixed.h"

//データ型を定義します
typedef ap_fixed <8,3> fixed_type;// 8ビット固定点タイプ
typedef hls :: stream <sixt_type> stream_type;

//線形層関数を定義します
void linear_layer（stream_type＆input_stream、sixt_type weight []、sixt_type bias []、stream_type＆output_stream）{
    //入力値と出力値の数を設定します
    const int n = 1024;

    //線形層計算を実行します
    for（int i = 0; i <n; i ++）{
        sixt_type input_value = input_stream.read（）;
        sixed_type weighted_sum = 0;
        for（int j = 0; j <n; j ++）{
            weighted_sum + = input_value * weight [i * n + j];
        }
        sixt_type output_value = hls :: max（weighted_sum + bias [i]）;
        output_stream.write（output_value）;
    }
}

//アクセラレータのトップレベル関数
void linear_accelerator（stream_type＆input_stream、sixt_type weight []、sixt_type bias []、stream_type＆output_stream）{
    #pragma HLSインターフェイス軸ポート= input_stream
    #Pragma HLSインターフェイス軸ポート= output_stream
    #pragma HLSインターフェイスm_axiポート=重量オフセット=スレーブバンドル= gmem
    #pragma HLSインターフェイスm_axiポート=バイアスオフセット=スレーブバンドル= gmem

    //線形層関数を呼び出します
    linear_layer（input_stream、weight、bias、output_stream）; `` ``