各位老司机,小弟最近在学Verilog /FPGA。目前是跟着开发板卖家给来的教程敲代码来熟悉FPGA开发,可是最近想到编写好的Verilog模块还是要写一个测试平台来验证功能才算是懂开发。这几天在模仿教程里的串口例程。可是到了仿真验证阶段的时候却发现怎么搞都不对,串口接收的结果没有一次正确的。例程基本上是照抄的,应该是测试平台写的有问题。唉,实在是不怎么会写测试平台。教材上讲的测试平台都是极其简单的,例子又少。初学者真的一下子写不出串口接收的测试代码。现在是厚着脸皮把自己抄的例程和自己写的测试代码贴上来,希望大家指点指点。另外也将卖家配套的代码贴上来供大家参考。
首先,照抄的代码:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module UART_RX(
input RX, // UART的RX
input clk_div, // 时钟
output rx_flag, // 接收完成标志
output dataerror, // 数据错误标志
output frameerror, // 帧错误
output [7:0]data
);
reg[7:0]data;
reg[7:0]cnt;
reg rxbuf,rxfall,receive;
parameter paritymoed = 1'b0;
reg presult,idle;
always@(posedge clk_div) // 下降沿信号
begin
rxbuf <= RX;
rxfall <= rxbuf&(~RX);
end
always@(posedge clk_div)
begin
if(rxfall && (~idle))
begin
receive <= 1'b1;
end
else if(cnt == 8'd168)
receive <= 1'b0;
end
always@(posedge clk_div)
begin
if(receive == 1'b1)
begin
case(cnt)
8'd0:begin // 起始位
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
end
8'd24:begin // bit 0
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[0] <= RX;
presult <= paritymoed ^ RX;
end
8'd40:begin // bit 1
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[1] <= RX;
presult <= presult ^ RX;
end
8'd56:begin // bit 2
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[2] <= RX;
presult <= presult ^ RX;
end
8'd72:begin // bit 3
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[3] <= RX;
presult <= presult ^ RX;
end
8'd88:begin // bit 4
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[4] <= RX;
presult <= presult ^ RX;
end
8'd104:begin // bit 5
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[5] <= RX;
presult <= presult ^ RX;
end
8'd120:begin // bit 6
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[6] <= RX;
presult <= presult ^ RX;
end
8'd136:begin // bit 7
idle <= 1'b1;
cnt <= cnt + 1'b1;
rx_flag <= 1'b0;
data[7] <= RX;
presult <= presult ^ RX;
end
8'd152:begin // bit 校验位
idle <= 1'b1;
cnt <= cnt + 1'b1;
if(presult == RX)
dataerror <= 1'b0;
else
dataerror <= 1'b1;
rx_flag <= 1'b1;
end
8'd168:begin // bit 停止位
idle <= 1'b1;
cnt <= cnt + 1'b1;
if(1'b1 == RX)
frameerror <= 1'b0;
else
frameerror <= 1'b1;
rx_flag <= 1'b1;
end
default: cnt <= cnt + 8'b1;
endcase
end
else
begin
cnt <= 8'b0;
idle <= 1'b0;
rx_flag <= 1'b0;
end
end
endmodule
然后是我自己写的测试 平台:
`include "UART_RX.v"
module RX_tb;
reg RX,clk_div;
wire rx_flag,dataerror,frameerror;
wire [7:0]data;
// 例化
UART_RX RX_U1(
.RX(RX), // UART的RX
.clk_div(clk_div), // 时钟
.rx_flag(rx_flag), // 接收完成标志
.dataerror(dataerror), // 数据错误标志
.frameerror(frameerror), // 帧错误
.data(data)
);
initial
begin
RX = 1;
clk_div = 1;
#10 RX = 0;
#22 RX = 1;
end
always #1 clk_div = ~clk_div;
endmodule
最后,是卖家给的官方例程,只有例程,没给测试平台:
黑金Sparten6开发板AX309 Verilog教程V3.2.pdf
(807.92 KB, 下载次数: 9)
|