調歩同期式シリアル通信の受信 IP とその後の 3 軸加速度センサー・データの処理 IP を作成した。今回は、調歩同期式シリアル通信の送信 IP (uart_tx)を Vitis HLS で作成しようとうことで、前回は、uart_tx のソースコードとテストベンチ・コードを貼って、Vitis HLS 2020.2 の uart_tx プロジェクトを作成した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行っていこう。
まずは、C シミュレーションからやってみるが、txst にシリアルデータを出力するだけなので、このテストベンチでは、芸がない。。。
C コードの合成をやってみた。結果を示す。
Latency は 1923 クロックだった。
12 分周 x 16 サンプル x ( 1 スタートビット + 8 キャラクタ + 1 ストップビット) = 1920 クロック
良いところだと思う。
C/RTL 協調シミュレーションを行った。
C/RTL 協調シミュレーションの全体波形を示す。
ピンクの楕円の部分を拡大した。
txst_V_din が X の部分があるので、これは良くない。。。
txst_V_din を出力する uart_tx.v のコードを見てみると、 else の場合が X に指定されていた。
C 言語ベースで修正できないようなので、Verilog HDL コードを書き換えてしまった。(禁断の術だ。。。)
これで、C/RTL 協調シミュレーションをして、波形を表示した。
先ほどと同じ部分を拡大すると、txst_V_din は 1 のままなので、これで OK だ。
しかし、txst_V_din が組み合わせ回路出力なのはいただけないので、もう一度、 FF 出力に変更した。
always @ (posedge ap_clk) begin
if (ap_rst_n_inv == 1'b1) begin
txst_V_din = 1'd1;
end else if ((txst_V_full_n == 1'b1)) begin
if ((1'b1 == ap_CS_fsm_state6)) begin
txst_V_din = 1'd1;
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'd0;
end else begin
txst_V_din = 1'd1;
end
end else begin
txst_V_din = 1'd1;
end
end
これで、C/RTL 協調シミュレーションを行った。
C/RTL 協調シミュレーションの波形を表示した。
2 クロック分ロスしているだけのようだ。問題無さそう。
uart_tx.v は修正したファイルになっている。
Export RTL を行った。結果を示す。
uart_tx IP も確認したが、修正済みの Verilog HDL ファイルになっている。
内部で使用されていない出力ポートのレベルを変更することや、レジスタ化はやっても良いと思っている。ただ、ソースコードを修正した時は、Verilog HDL の再修正を忘れないようにする必要がある。