基于FPGA的UART回环设计(3)

基于FPGA的UART顶层模块化设计

  • FPGA电路设计
  • 顶层代码设计
  • 整个项目测试代码设计
  • 约束文件.XDC的书写
  • 项目下板现象
  • 结束语

FPGA电路设计

本篇文章将实现整个uart回环测试的小项目。首先查看FPGA开发板的电路设计,找准需要绑定的FPGA引脚。
基于FPGA的UART回环设计(3)_第1张图片

顶层代码设计

uart回环测试的项目的顶层代码如下:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : 
// Module Name  : top.v
// Create Time  : 2020-01-04 15:18:18
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

module top(
    input                   sclk            ,
    input                   rst_n           ,
    input                   rx              ,
    output                  tx              
);
 
//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================/
wire            [ 7:0]      pi_data         ;
wire            [ 7:0]      po_data         ;
wire                        po_flag         ;
wire                        rd_en           ;
wire                        fifo_empty      ;
 
//========================================================================================\
//**************     Main      Code        **********************************
//========================================================================================/
    

uart_rx uart_rx_inst(
    .sclk               (sclk               ),
    .rst_n              (rst_n              ),
    .rx                 (rx                 ),
    .po_flag            (po_flag            ),
    .po_data            (po_data            )       
);

uart_tx uart_tx_inst(
    .sclk               (sclk               ),
    .rst_n              (rst_n              ),
    .pi_data            (pi_data            ),
    .fifo_empty         (fifo_empty         ),
    .rd_en              (rd_en              ),
    .tx                 (tx                 )              
);

fifo_generator_0 fifo_generator_0_inst (
    .clk                (sclk               ),      // input wire clk
    .srst               (!rst_n             ),    // input wire srst
    .din                (po_data            ),      // input wire [7 : 0] din
    .wr_en              (po_flag            ),  // input wire wr_en
    .rd_en              (rd_en              ),  // input wire rd_en
    .dout               (pi_data            ),    // output wire [7 : 0] dout
    .full               (                   ),    // output wire full
    .empty              (fifo_empty         )  // output wire empty
);
 
endmodule

从代码中可以看到,为了防止串口发送和接收间速度的不匹配,这里使用了FIFO做缓存作用。FIFOIP的使用这里就不多说明了,这是vivado中最常用的IP没有之一。

整个项目测试代码设计

整个项目的测试代码如下,结合前两篇文章,该测试代码可以直接运行。

`timescale 1ns / 1ps
`define     CLOCK       20
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : [email protected]
// Website      : 
// Module Name  : top_tb.v
// Create Time  : 2020-01-04 15:31:18
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

module top_tb();
reg                     sclk            ;
reg                     rst_n           ;
reg                     rx              ;
wire                    tx              ;

initial begin
    sclk        <=          1'b0;
    rst_n       =           1'b0;
    rx          =           1'b1;
    #(100*`CLOCK)
    rst_n       =           1'b1;
    data_send(0);
    data_send(1);
    data_send(2);
    data_send(3);
    data_send(4);
    data_send(5);

    data_send(10);
    data_send(11);
    data_send(12);
    data_send(13);
    data_send(14);
    data_send(15);

    data_send(100);
    data_send(101);
    data_send(102);
    data_send(103);
    data_send(104);
    data_send(105);
end
always  #(`CLOCK/2)         sclk        <=          ~sclk;

task  data_send ;
    input       [ 7:0]          data        ;
    integer                     i           ;           
    begin
        rx          <=          1'b0        ;
        #(433*`CLOCK);         
        for(i = 0;i <= 7;i = i+1)begin               
            rx      <=          data[i];
            #(433*`CLOCK); 
        end
         rx          <=          1'b1        ;
        #(433*`CLOCK); 
    end
            


endtask

top top_inst(
    .sclk               (sclk               ),
    .rst_n              (rst_n              ),
    .rx                 (rx                 ),
    .tx                 (tx                 )      
);
endmodule

从代码中可以看书,该测试代码与uart_rx几乎一样,同学们可以很容易读懂。

约束文件.XDC的书写

引脚约束文件与开发板电路有直接关系,这里使用的米联客MA7035FA 100T版本,约束文件如下:

set_property PACKAGE_PIN V4 [get_ports sclk]
set_property PACKAGE_PIN R14 [get_ports rst_n]
set_property PACKAGE_PIN P16 [get_ports rx]
set_property PACKAGE_PIN R17 [get_ports tx]

set_property IOSTANDARD LVCMOS15 [get_ports sclk]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rx]
set_property IOSTANDARD LVCMOS33 [get_ports tx]

项目下板现象

将整个项目下板测试之后如下图:
基于FPGA的UART回环设计(3)_第2张图片
从串口助手中可以发现,该串口回环的项目成功实现。

结束语

如果同学们感觉这篇文章对大家有帮助,大家可以收藏点赞,以后会推出更加精彩的文章。对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群:
基于FPGA的UART回环设计(3)_第3张图片

你可能感兴趣的:(FPGA)