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

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

FPGAの部屋

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

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

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

調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。今回は、調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しようということで、前回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。今回は、ブロックレベルのインターフェースを s_axilite にしてみようと思う。

uart_tx.cpp を書き換えた。
uart_tx_17_210228.png

// 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 s_axilite port=return
    send_zero_bit(txst);
    send_data_byte(tx_data, txst);
    send_stop_bit(txst);

    return(0);
}


C コードの合成を行った。結果を示す。
uart_tx_18_210228.png
uart_tx_19_210228.png

uart_tx.v の txst_V_din を出力する always 文を書き換えて、通常は 1 出力にし、そしてレジスタ出力に変更した。
uart_tx_20_210228.png

always @ (posedge ap_clk) begin
    if (ap_rst_n_inv == 1'b1) begin
        txst_V_din <= 1'b1;
    end else if ((txst_V_full_n == 1'b1)) begin
        if ((1'b1 == ap_CS_fsm_state6)) begin
            txst_V_din <= 1'b1;
        end else if ((1'b1 == ap_CS_fsm_state4)) begin
            txst_V_din <= trunc_ln213_fu_307_p1;
        end else if ((1'b1 == ap_CS_fsm_state2)) begin
            txst_V_din <= 1'b0;
        end else begin
            txst_V_din <= 1'b1;
        end
    end else begin
        txst_V_din <= 1'b1;
    end
end


C/RTL 協調シミュレーションを行った。結果を示す。
uart_tx_21_210228.png

C/RTL 協調シミュレーションの波形を示す。
uart_tx_22_210228.png

良さそうだ。
スタートビットの後で 1 クロック、ストップビットの前で 1 クロック伸びているが、影響は少ないと思う。

Export RTL を行った。結果を示す。
uart_tx_23_210228.png

(2021/03/26:追記)
リセットが遅れていると、コンフィギュレーションで txst_V_din が 0 にセットされているので、相手側でフレーミング・エラーが出てしまって良くない。よって uart_tx.v の 76 行を以下の様に書き換えた。

reg[0:0] txst_V_din = 1'b1;

  1. 2021年03月01日 03:26 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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