FC2カウンター FPGAの部屋 調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する1
fc2ブログ

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

FPGAの部屋

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

調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成する1

調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。残りっている調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しよう。
今回は、 uart_tx のソースコードとテストベンチ・コードを貼っておく。

ソースコードの uart_tx.h を貼っておく。

/// uart_tx.h
// 2021/02/18 by marsee
//

#ifndef __UART_TX_H__
#define __UART_TX_H__

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

#define DIV_8M  12
#define DIV_500k 16

#endif


uart_tx.cpp を貼っておく。

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

#include "uart_tx.h"

bool send_zero_bit(hls::stream<ap_uint<1> >& txst){
    const ap_uint<1> tx=0;

    LOOP_DZB1: for(int i=0; i<DIV_8M; i++){
        LOOP_DZB2: for(int j=0; j<DIV_500k; j++){
#pragma HLS PIPELINE II=1 rewind
            txst << tx;
        }
    }
    return(true);
}

bool send_data_byte(ap_uint<8> tx_data, hls::stream<ap_uint<1> >& txst){
    ap_uint<1> tx;

    LOOP_DDB1: for(int k=0; k<8; k++){
        LOOP_DDB2: for(int i=0; i<DIV_8M; i++){
            LOOP_DDB3: for(int j=0; j<DIV_500k; j++){
#pragma HLS PIPELINE II=1 rewind
                tx = tx_data & 1;
                txst << tx;
                if(i==(DIV_8M-1) && j==(DIV_500k-1)){
                    tx_data >>= 1;
                }
            }
        }
    }
    return(true);

}

bool send_stop_bit(hls::stream<ap_uint<1> >& txst){
    const ap_uint<1> tx = 1;

    LOOP_CSB1: for(int i=0; i<DIV_8M; i++){
        LOOP_CSB2: for(int j=0; j<DIV_500k; j++){
#pragma HLS PIPELINE II=1 rewind
            txst << tx;
        }
    }
    return(true);
}

int uart_tx(ap_uint<8> tx_data, hls::stream<ap_uint<1> >& txst){
#pragma HLS INTERFACE s_axilite port=tx_data
#pragma HLS INTERFACE ap_ctrl_hs port=return
    send_zero_bit(txst);
    send_data_byte(tx_data, txst);
    send_stop_bit(txst);

    return(0);
}


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

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

#include "uart_tx.h"

int uart_tx(ap_uint<8> tx_data, hls::stream<ap_uint<1> >& txst);

int main(){
    ap_uint<8> tx_data;
    hls::stream<ap_uint<1> > txst;

    tx_data = 0x55;
    uart_tx(tx_data, txst);

    tx_data = 0xaa;
    uart_tx(tx_data, txst);

    return(0);
}


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

コメント

コメントの投稿


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

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