libero soc 11.9 UART IP核测试

发送测试
**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

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值