发送测试
**1、创建IP核,**使能TX FIFO,使能RX FIFO。
官方文件波形如下:
2、发送测试程序,随便产生了一个写信号WEN,写信号每写一次,发送一次。
我使用的16M时钟。想要测试波特率100K。则16000000/(16*1000000)-1=9;
所以BAUD_VAL=9;测试程序如下。
module TESTUART
(
CLK_16M,
RST_N,
TX,
RX,
DATA_OUT,
WEN,
OEN
);
input CLK_16M;
input RST_N;
output TX;
input RX;
output DATA_OUT;
output WEN;
output OEN;
//--------------------------------------------------------------------
// input
//--------------------------------------------------------------------
//reg [12:0] BAUD_VAL;
parameter BAUD_VAL = 13’d9; //100K
//reg BIT8; //8 bits
parameter BIT8 = 1’b1;
//reg CSN; //enable
parameter CSN = 1’b0;
//reg [7:0] DATA_IN; //TX data
parameter DATA_IN = 8’h99;
reg ODD_N_EVEN; //disable Parity
//reg PARITY_EN; //disable Parity
parameter PARITY_EN = 1’b0;
//reg OEN; //Active low read enable.
assign OEN = 1’b1;
reg WEN; //Active low write enable
//--------------------------------------------------------------------
// Output
//--------------------------------------------------------------------
wire [7:0] DATA_OUT;
wire FRAMING_ERR;
wire OVERFLOW;
wire PARITY_ERR;
wire RXRDY;
wire TXRDY;
UART UART_int
(
// Inputs
.BAUD_VAL (BAUD_VAL),
.BIT8 (BIT8),
.CLK (CLK_16M),
.CSN (CSN),
.DATA_IN (DATA_IN),
.ODD_N_EVEN (ODD_N_EVEN),
.OEN (OEN),
.PARITY_EN (PARITY_EN),
.RESET_N (RST_N),
.RX (RX),
.WEN (WEN),
// Outputs
.DATA_OUT (DATA_OUT),
.FRAMING_ERR (FRAMING_ERR),
.OVERFLOW (OVERFLOW),
.PARITY_ERR (PARITY_ERR),
.RXRDY (RXRDY),
.TX (TX),
.TXRDY (TXRDY)
);
reg [15:0] cnta;
always@(posedge CLK_16M or negedge RST_N)
begin
if(!RST_N)
begin
cnta <= 16’b0;
end
else
begin
if(cnta ==10000)
cnta <= 16’b0;
else
cnta <= cnta + 1’b1;
end
end
always@(*)
begin
if(cnta ==0)
WEN = 1’b0;
else
WEN = 1’b1;
end
endmodule
3、写testbench
`timescale 1ns/100ps
module TESTUARTTT;
wire TX;
wire [7:0] DATA_OUT;
wire WEN;
wire OEN;
parameter SYSCLK_PERIOD = 62.5;// 16MHZ
reg SYSCLK;
reg NSYSRESET;
initial
begin
SYSCLK = 1’b0;
NSYSRESET = 1’b0;
end
//
// Reset Pulse
//
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1’b1;
end
//
// Clock Driver
//
always @(SYSCLK)
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
//
// Instantiate Unit Under Test: TESTUART
//
TESTUART TESTUART_0 (
// Inputs
.CLK_16M(SYSCLK),
.RST_N(NSYSRESET),
.RX({1{1’b0}}),
// Outputs
.TX(TX),
.DATA_OUT(DATA_OUT),
.WEN(WEN),
.OEN(OEN)
// Inouts
);
endmodule
4、仿真波形如下,在wen为0以后TX以波特率100K,发送了8’h99
5、关于使能FIFO作用,就是可以一次性写入多个数值,然后TX慢慢发送。
例如:模拟产生的WEN信号假如由原来的==0改成<5,如下。则会连续发送5次数据,波形如下。
always@(*)
begin
if(cnta <5)
WEN = 1’b0;
else
WEN = 1’b1;
end
6,实际应用中如果不使能TX FIFO,假如要发送5个数。
在赋值时也要注意,TX有两个buff。TXRDY为高,第一个数赋值到buffer1,TXRDY为高,第二数赋值到buffer2,此时如果还没发送完第一个字节,TXRDY一直都是低的,直到发送完第一个字节,此时TXRDY变高,第三个数赋值到buffer。可以理解为赋值可以提前到发送两个字节位置。因为有两个发送buffer.
下图是一个modelsim仿真波形图,最上面是TX,第二个TXRDY,第三个WEN.可以看到TX发送之前WEN已经写两次了,准备好了两次发送数据。
接收测试
官方文件波形如下:
1、测试程序如下:
module TESTUART
(
CLK_16M,
RST_N,
TX,
RX,
DATA_OUT,
WEN,
OEN,
RXRDY
);
input CLK_16M;
input RST_N;
output TX;
input RX;
output DATA_OUT;
output WEN;
output OEN;
output RXRDY;
//--------------------------------------------------------------------
// input
//--------------------------------------------------------------------
//reg [12:0] BAUD_VAL;
parameter BAUD_VAL = 13’d9; //100K
//reg BIT8; //8 bits
parameter BIT8 = 1’b1;
//reg CSN; //enable
parameter CSN = 1’b0;
//reg [7:0] DATA_IN; //TX data
parameter DATA_IN = 8’h99;
reg ODD_N_EVEN; //disable Parity
//reg PARITY_EN; //disable Parity
parameter PARITY_EN = 1’b0;
//reg OEN; //Active low read enable.
assign OEN = 1’b0;
//reg WEN; //Active low write enable
assign WEN = 1’b1;
//--------------------------------------------------------------------
// Output
//--------------------------------------------------------------------
wire [7:0] DATA_OUT;
wire FRAMING_ERR;
wire OVERFLOW;
wire PARITY_ERR;
wire RXRDY;
wire TXRDY;
UART UART_int
(
// Inputs
.BAUD_VAL (BAUD_VAL),
.BIT8 (BIT8),
.CLK (CLK_16M),
.CSN (CSN),
.DATA_IN (DATA_IN),
.ODD_N_EVEN (ODD_N_EVEN),
.OEN (OEN),
.PARITY_EN (PARITY_EN),
.RESET_N (RST_N),
.RX (RX),
.WEN (WEN),
// Outputs
.DATA_OUT (DATA_OUT),
.FRAMING_ERR (FRAMING_ERR),
.OVERFLOW (OVERFLOW),
.PARITY_ERR (PARITY_ERR),
.RXRDY (RXRDY),
.TX (TX),
.TXRDY (TXRDY)
);
endmodule
2、testbench如下
`timescale 1ns/100ps
module TESTUARTTT;
reg RX;
wire TX;
wire [7:0] DATA_OUT;
wire WEN;
wire OEN;
wire RXRDY;
parameter SYSCLK_PERIOD = 62.5;// 16MHZ
reg SYSCLK;
reg NSYSRESET;
initial
begin
SYSCLK = 1’b0;
NSYSRESET = 1’b0;
end
//
// Reset Pulse
//
initial
begin
#(SYSCLK_PERIOD * 10 )
NSYSRESET = 1’b1;
end
//
// Clock Driver
//
always @(SYSCLK)
#(SYSCLK_PERIOD / 2.0) SYSCLK <= !SYSCLK;
//
// Instantiate Unit Under Test: TESTUART
//
TESTUART TESTUART_0 (
// Inputs
.CLK_16M(SYSCLK),
.RST_N(NSYSRESET),
.RX(RX),
// Outputs
.TX(TX),
.DATA_OUT(DATA_OUT),
.WEN(WEN),
.OEN(OEN),
.RXRDY(RXRDY)
// Inouts
);
always
begin
#800000 RX=1’b1;
#10000 RX=1’b0; //start
#10000 RX=1’b0; //8 bits。5a
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1;
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1; //stop
#10000 RX=1’b1;
end
endmodule
**3、仿真波形如下,**RXRADY变高以后DATA_OUT变为5A,正确
4,把RX处改成如下,也就是连发两个字节8’h58、8’h6c,接收波形如下。
always
begin
#800000 RX=1’b1;
#10000 RX=1’b0; //start
#10000 RX=1’b0; //8 bits
#10000 RX=1’b0;
#10000 RX=1’b0;
#10000 RX=1’b1;
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1; //stop
#10000 RX=1’b1;
#10000 RX=1’b0; //start
#10000 RX=1’b0; //8 bits
#10000 RX=1’b0;
#10000 RX=1’b1;
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1;
#10000 RX=1’b1;
#10000 RX=1’b0;
#10000 RX=1’b1; //stop
#10000 RX=1’b1;
end