quartus使用串口IP模塊


在quartus平台中使用串口模塊的IP,需要使用到platform designer軟件來實現。

1、在quartus界面調出IP Catalog界面。

 

 2、在IP catalog中搜索UART,找到RS2323模塊,並雙擊打開,選擇合適的路徑和存放。

 

 

3、使用該模塊若不搭建nios軟核,則使用streaming。

 

在右上角電機Block Symbol或者在菜單選擇View->Block Symbol打開模塊符號。

 

 

 4、串口配置了波特率,其自動配置的參數與時鍾有關,因此需要加入時鍾模塊,告知系統輸入時鍾為多少。
操作如下:

 

 5、打開系統連接的界面,為其添加時鍾輸入模塊。

 

 

6、在IP搜索欄搜索clock,雙擊選擇的模塊添加時鍾模塊,輸入模塊。

 

 7、根據板載資源,設置時鍾的參考時鍾。

 

 8、連接時鍾模塊和串口模塊的clk和reset。

9、點擊Generate HDL生成模塊。

 

 10、在quartus中添加生成的sys系統。

 

 

 

 

 

 

 

 11、從platform designer生成模塊實例將實例拷貝到添加到quartus的頂層文件中,添加寫數據和讀數據的時序。

 

 

 

 

 

 這里只測試一下串口發送數據的功能,接收數據的操作基本是一樣的。

12、在platform designer查看串口模塊發送數據的時序。

 

 

 

 

同理在這里一樣可以查看到接收數據的時序。
需要注意的是,時序中的數據其實是在to_uart_valid信號為1時,數據會被寫入。
下面是測試串口發送數據的頂層文件。

module top2( input wire clk,//50MHz時鍾 //rst,//     output reg led, //用於指示
 input wire rxd, output wire txd, inout dht_io ); //*********************************PROCESS************************************** // 復位模塊 //****************************************************************************** 
 reg rst_n ; reg [15:0]delay_cnt; always@(posedge clk) begin if(delay_cnt>=16'd35530)begin
            delay_cnt <= delay_cnt; rst_n <= 1'b1;
 end else begin rst_n <= 1'b0;
            delay_cnt <= delay_cnt + 1'b1;
 end end //指示燈 //assign txd = led;
    reg [31:0]cnt; reg led_f1,tx_flag; always@(posedge clk) begin led_f1 <= led; tx_flag <= led &(~led_f1); if(cnt >= 32'd25000000 - 1)
 begin cnt <= 0; led <=~led; end else begin cnt <= cnt + 1'b1 ;
 end end //--------------------------------------------
    localparam s_s1=0; localparam s_s2=1; localparam s_s3=2; localparam s_s4=3; reg [7:0]send_data; reg to_uart_valid , to_uart_ready; reg [2:0]send_st; reg [7:0]data_cnt; always@(posedge clk) begin if(!rst_n)begin to_uart_ready <= 1'b0;
            to_uart_valid <= 1'b0;
            send_data <= 8'd0;
            send_st<= s_s1; data_cnt <= 8'd0;
 end else begin case(send_st) s_s1:begin//待機
                        if(tx_flag)begin send_st <= s_s2; to_uart_valid <= 1'b0;
                            to_uart_ready<= 1'b0;
                            data_cnt <= 8'd0;
                            send_data <= 9; end else begin to_uart_valid <= 1'b0;
                            to_uart_ready<= 1'b0;
 end end s_s2:begin if(data_cnt <= 8'd8-1'b1)begin to_uart_valid <= 1'b1;
                            //to_uart_ready <= (data_cnt >= 8'd5-1)?1'b0:1'b1;
                            send_data <= data_cnt+1; data_cnt <= data_cnt + 1'b1;
                            send_st <= (data_cnt >= 8'd5-1)?s_s3:s_s2;
 end end s_s3:begin to_uart_valid <= 1'b0;
                        to_uart_ready <= 1'b1;
                        send_st <= s_s1; data_cnt<=8'd0;
 end default :send_st <= s_s1; endcase end end IP_UART u0 ( //.rs232_0_from_uart_ready (<connected-to-rs232_0_from_uart_ready>), // rs232_0_avalon_data_receive_source.ready //.rs232_0_from_uart_data (<connected-to-rs232_0_from_uart_data>), // .data //.rs232_0_from_uart_error (<connected-to-rs232_0_from_uart_error>), // .error //.rs232_0_from_uart_valid (<connected-to-rs232_0_from_uart_valid>), // .valid
        .rs232_0_to_uart_data    (send_data),    // rs232_0_avalon_data_transmit_sink.data
        .rs232_0_to_uart_error   (),   // .error
        .rs232_0_to_uart_valid   (to_uart_valid),   // .valid
        .rs232_0_to_uart_ready   (),   // 這是輸入信號 .ready
        .rs232_0_UART_RXD        (rxd),        // rs232_0_external_interface.RXD
        .rs232_0_UART_TXD        (txd),        // .TXD
        .clk_clk                 (clk),                 // clk.clk
        .reset_reset_n           (rst_n)            // reset.reset_n
 ); endmodule

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM