本篇文章将实现整个uart回环测试的小项目。首先查看FPGA开发板的电路设计,找准需要绑定的FPGA引脚。
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几乎一样,同学们可以很容易读懂。
引脚约束文件与开发板电路有直接关系,这里使用的米联客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]
将整个项目下板测试之后如下图:
从串口助手中可以发现,该串口回环的项目成功实现。
如果同学们感觉这篇文章对大家有帮助,大家可以收藏点赞,以后会推出更加精彩的文章。对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群: