FC2カウンター FPGAの部屋 uart_rx を使用して 3 軸加速度センサー用のデータを作成する uart_rx_axi4ls IP の作成1
fc2ブログ

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

FPGAの部屋

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

uart_rx を使用して 3 軸加速度センサー用のデータを作成する uart_rx_axi4ls IP の作成1

調歩同期式シリアル通信の受信 IP (uart_rx)を Vitis HLS で作成する3”の続き。

調歩同期方式シリアル通信の受信 IP を Vitis HLS で作成することにしたということで、前回は、Vivado 2020.2 の uart_rx プロジェクトを作成し、合成された uart_rx の Verilog HDL ファイルをコピーし、SystemVerilog のテストベンチファイルを作成して、Vivado 上でシミュレーションして、問題なく動作しそうだということが分かった。今度は、その uart_rx の後段で 3 軸加速度センサー用のデータを作成する IP である uart_rx_axi4ls IP を作成していこう。
どういうことか?というと 3 軸加速度センサーからのシリアルデータは、キーコード、 x 軸データ 1, 2, 3 と 3 個のデータをまとめて 32 ビット幅データにする。次の 3 個のデータは y 軸データなので、 32 ビット幅データにする。次の 3 個のデータは z 軸データなので、同様に 32 ビット幅データにする。そして、 x 軸、 y 軸、 z 軸のデータを AXI4 Lite のレジスタとしてマップして、 Zynq の ARM プロセッサから見えるようにするのがこの IP の目的となる。

さて、ソースコードを貼っておく。
まずは、ソースコードの uart_rx_axi4ls.cpp から貼っておく。
AXI4 Lite インターフェースを指示子で指定できるので、Vitis HLS で書くと行数が少なくなり楽に書けると思う。

// uart_rx_axi4ls.cpp
// 2021/02/17 by marsee
//

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

int uart_rx_axi4ls(hls::stream<ap_uint<8> >&rx_data, ap_uint<32> &x_data,
        ap_uint<32> &y_data, ap_uint<32> &z_data){
#pragma HLS INTERFACE axis port=rx_data register_mode=both register
#pragma HLS INTERFACE s_axilite port=z_data
#pragma HLS INTERFACE s_axilite port=y_data
#pragma HLS INTERFACE s_axilite port=x_data
#pragma HLS INTERFACE ap_ctrl_hs port=return
    ap_uint<32> xd=0, yd=0, zd=0;
    ap_uint<8> rd;

    LOOP_X: for(int i=0; i<4; i++){ // key + x_data
#pragma HLS PIPELINE II=1 rewind
        xd <<= 8;
        rx_data >> rd;
        xd = xd | rd;
    }
    x_data = xd;

    LOOP_Y: for(int i=0; i<3; i++){ // y_data
#pragma HLS PIPELINE II=1 rewind
        yd <<= 8;
        rx_data >> rd;
        yd = yd | rd;
    }
    y_data = yd;

    LOOP_Z: for(int i=0; i<3; i++){ // Z_data
#pragma HLS PIPELINE II=1 rewind
        zd <<= 8;
        rx_data >> rd;
        zd = zd | rd;
    }
    z_data = zd;

    return(0);
}


次にテストベンチの uart_rx_axi4ls_tb.cpp を貼っておく。

// uart_rx_axi4ls_tb.cpp
// 2021/02/18 by marsee
//

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

int uart_rx_axi4ls(hls::stream<ap_uint<8> >&rx_data, ap_uint<32> &x_data,
        ap_uint<32> &y_data, ap_uint<32> &z_data);

int main(){
    hls::stream<ap_uint<8> > rx_data;
    ap_uint<32> x_data, y_data, z_data;

    ap_uint<8> rxd[10] = {0x55, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
    // key-code + x_data 3 bytes, y_data 3 bytes, z_data 3 bytes

    for(int i=0; i<10; i++){
        rx_data << rxd[i];
    }

    uart_rx_axi4ls(rx_data, x_data, y_data, z_data);

    printf("x_data = %x, y_data = %x, z_data = %x\n",
        (unsigned int)x_data, (unsigned int)y_data, (unsigned int)z_data);

    return(0);
}


Vitis HLS 2020.2 で ZYBO Z7-20 用の uart_rx_axi4ls プロジェクトを作成した。
uart_rx_21_210222.png
  1. 2021年02月23日 04:32 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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