FC2カウンター FPGAの部屋 uart_rx と uart_rx_axi4ls を連結してシミュレーションする1
fc2ブログ

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

FPGAの部屋

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

uart_rx と uart_rx_axi4ls を連結してシミュレーションする1

3 軸加速度センサーの RS-422 インターフェースのデータを受けるために uart_rx とその後段の uart_rx_axi4ls を Vitis HLS で作ってきたが、それらを連結してシミュレーションしてみよう。
今回は、Vivado 2020.2 の uart_rx_axi4ls_top プロジェクトを作成し、 uart_rx IP と uart_rx_axi4ls IP を IP Catalog に追加した。そてひ、 uart_rx_axi4ls_top_tb.sv のソースコードを貼った。

まずは、Viavdo 2020.2 で uart_rx_axi4ls_top プロジェクトを作成した。
uart_rx_32_210224.png

uart_rx_axi4ls_top プロジェクトのディレクトリに uart_rx と uart_rx_axi4ls ディレクトリを新規作成した。

uart_rx ディレクトリには、uart_rx/solution1/impl/export.zip を展開して、コピーした。
uart_rx_30_210224.png

uart_rx_axi4ls ディレクトリには、uart_rx_axi4ls/solution1/impl/export.zip を展開して、コピーした。
uart_rx_31_210224.png

uart_rx IP と uart_rx_axi4ls IP を IP catalog に追加した。
uart_rx_32_210224.png

最後に、次回使用する SystemVerilog のテストベンチの uart_rx_axi4ls_top_tb.sv を貼っておく。
uart_rx にシリアル・データを入力して、

task automatic axi_master_rd_reg(input logic [5:0] araddr)

で AXI4 Lite インターフェースでキーコード + x 軸、 y 軸、 z軸のデータを読み出す。

`timescale 100ps / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 02/17/2021
// Design Name: 
// Module Name: uart_rx_axi4ls_top_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module uart_rx_axi4ls_top_tb;
    parameter DELAY = 10; // delay = 1 ns
    
    logic ap_clk;
    logic ap_rst;
    logic ap_start;
    logic ap_done;
    logic ap_idle;
    logic ap_ready;
    logic ap_start_0;
    logic ap_done_0;
    logic ap_idle_0;
    logic ap_ready_0;
    logic rxst_V_dout;
    logic [5:0] s_axi_control_araddr;
    logic s_axi_control_arready;
    logic s_axi_control_arvalid;
    logic [5:0] s_axi_control_awaddr;
    logic s_axi_control_awready;
    logic s_axi_control_awvalid;
    logic s_axi_control_bready;
    logic [1:0] s_axi_control_bresp;
    logic s_axi_control_bvalid;
    logic [31:0] s_axi_control_rdata;
    logic s_axi_control_rready;
    logic [1:0] s_axi_control_rresp;
    logic s_axi_control_rvalid;
    logic [31:0] s_axi_control_wdata;
    logic s_axi_control_wready;
    logic [3:0] s_axi_control_wstrb;
    logic s_axi_control_wvalid;
   
    uart_rx_axi4ls_top_wrapper uart_rx_axi4ls_top_i(.*);
    
    task gen_ap_clk;
        forever begin
            #52 ap_clk <= ~ap_clk; // 10.4 ns = 96.15 MHz
        end
    endtask
    
    task start_bit_gen;
        begin
            @(posedge ap_clk);
            #DELAY
            rxst_V_dout <= 1'b0;
            repeat(12*16)@(posedge ap_clk);
        end
    endtask
    
    task rx_data_gen(input logic [7:0] rxd);
        begin
            for(int i=0; i<8; i++) begin
                #DELAY
                rxst_V_dout <= rxd[i];
                repeat(12*16)@(posedge ap_clk);
             end
         end
     endtask
     
    task stop_bit_gen;
        begin
            #DELAY
            rxst_V_dout <= 1'b1;
            repeat(12*16)@(posedge ap_clk);
        end
    endtask
    
    task automatic axi_master_rd_reg(input logic [5:0] araddr);
        @(posedge ap_clk);
        #DELAY
        s_axi_control_araddr <= araddr;
        s_axi_control_arvalid <= 1'b1;
        do begin
            @(posedge ap_clk);
        end while (s_axi_control_arready == 1'b0);

        #DELAY
        s_axi_control_arvalid <= 1'b0;
        s_axi_control_rvalid <= 1'b1;
        do begin
            @(posedge ap_clk);
        end while (s_axi_control_rready == 1'b0);
        #DELAY
        s_axi_control_rvalid <= 1'b0;
    endtask //automatic

    initial begin
        ap_clk <= 1'b0;
        ap_rst <= 1'b1;
        ap_start <= 1'b0;
        ap_start_0 <= 1'b0;
        rxst_V_dout <= 1'b1;
        s_axi_control_araddr <= 0;
        s_axi_control_arvalid <= 1'b0;
        s_axi_control_awaddr <= 0;
        s_axi_control_awvalid <= 1'b0;
        s_axi_control_bready <= 1'b1;
        s_axi_control_rready <= 1'b1;
        s_axi_control_wdata <= 0;
        s_axi_control_wstrb <= 0;
        s_axi_control_wvalid <= 1'b0;
        
        #300 fork
            gen_ap_clk;
        join_none
        
        #300 ap_rst <= 1'b0;
        #300 ap_start <= 1'b1;
        ap_start_0 <= 1'b1;
        repeat(12*16)@(posedge ap_clk);
        
        #300 // X key
        start_bit_gen;
        rx_data_gen(0'h5A);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);
        
        #300 // x_data_0
        start_bit_gen;
        rx_data_gen(0'h11);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // x_data_1
        start_bit_gen;
        rx_data_gen(0'h22);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // x_data_2
        start_bit_gen;
        rx_data_gen(0'h33);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // y_data_0
        start_bit_gen;
        rx_data_gen(0'h44);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // y_data_1
        start_bit_gen;
        rx_data_gen(0'h55);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // y_data_2
        start_bit_gen;
        rx_data_gen(0'h66);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // z_data_0
        start_bit_gen;
        rx_data_gen(0'h77);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // z_data_1
        start_bit_gen;
        rx_data_gen(0'h88);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300 // y_data_2
        start_bit_gen;
        rx_data_gen(0'h99);
        stop_bit_gen;
        repeat(12*16)@(posedge ap_clk);

        #300
        axi_master_rd_reg(6'b01_0000); // 0x10 x_data
        #300
        axi_master_rd_reg(6'b10_0000); // 0x20 y_data
        #300
        axi_master_rd_reg(6'b11_0000); // 0x30 z_data
        repeat(12*16)@(posedge ap_clk);

        $stop;
    end
endmodule


uart_rx_axi4ls IP の AXI4 Lite のアドレスマップを貼っておく。

//------------------------Address Info-------------------
// 0x00 : reserved
// 0x04 : reserved
// 0x08 : reserved
// 0x0c : reserved
// 0x10 : Data signal of x_data
//        bit 31~0 - x_data[31:0] (Read)
// 0x14 : Control signal of x_data
//        bit 0  - x_data_ap_vld (Read/COR)
//        others - reserved
// 0x20 : Data signal of y_data
//        bit 31~0 - y_data[31:0] (Read)
// 0x24 : Control signal of y_data
//        bit 0  - y_data_ap_vld (Read/COR)
//        others - reserved
// 0x30 : Data signal of z_data
//        bit 31~0 - z_data[31:0] (Read)
// 0x34 : Control signal of z_data
//        bit 0  - z_data_ap_vld (Read/COR)
//        others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)

  1. 2021年02月25日 05:07 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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