quartus使用串口IP模块
阅读原文时间:2023年07月11日阅读:1

在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 \[:\]delay\_cnt;  
always@(posedge clk)  
begin  
    if(delay\_cnt>='d35530)begin  
        delay\_cnt <= delay\_cnt;  
        rst\_n <= 'b1;  
    end  
    else begin  
        rst\_n <= 'b0;  
        delay\_cnt <= delay\_cnt + 'b1;  
    end  
end  
//指示灯  
//assign txd = led;  
reg \[:\]cnt;  
reg led\_f1,tx\_flag;  
always@(posedge clk)  
begin  
    led\_f1 <= led;  
    tx\_flag <= led &(~led\_f1);  
    if(cnt >= 'd25000000 - 1)  
    begin  
        cnt <= ;  
        led <=~led;  
    end  
    else begin  
        cnt <= cnt + 'b1 ;  
    end  
end  
//--------------------------------------------  
localparam s\_s1=;  
localparam s\_s2=;  
localparam s\_s3=;  
localparam s\_s4=;  
reg \[:\]send\_data;  
reg to\_uart\_valid , to\_uart\_ready;  
reg \[:\]send\_st;  
reg \[:\]data\_cnt;  
always@(posedge clk)  
begin  
    if(!rst\_n)begin  
        to\_uart\_ready <= 'b0;  
        to\_uart\_valid <= 'b0;  
        send\_data <= 'd0;  
        send\_st<= s\_s1;  
        data\_cnt <= 'd0;  
    end  
    else begin  
        case(send\_st)  
            s\_s1:begin//待机  
                    if(tx\_flag)begin  
                        send\_st <= s\_s2;  
                        to\_uart\_valid <= 'b0;  
                        to\_uart\_ready<= 'b0;  
                        data\_cnt <= 'd0;  
                        send\_data <= ;  
                    end  
                    else begin  
                        to\_uart\_valid <= 'b0;  
                        to\_uart\_ready<= 'b0;  
                    end  
                end  
            s\_s2:begin  
                    if(data\_cnt <= 'd8-1'b1)begin  
                        to\_uart\_valid <= 'b1;  
                        //to\_uart\_ready <= (data\_cnt >= 8'd5-1)?1'b0:1'b1;  
                        send\_data <= data\_cnt+;  
                        data\_cnt <= data\_cnt + 'b1;  
                        send\_st <= (data\_cnt >= 'd5-1)?s\_s3:s\_s2;  
                    end  
                end  
            s\_s3:begin  
                    to\_uart\_valid <= 'b0;  
                    to\_uart\_ready <= 'b1;  
                    send\_st <= s\_s1;  
                    data\_cnt<='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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器