设计目标:PC机通过串口助手发送数据,FPGA接收之后再发送给PC机并在串口助手上显示
串口接收和发送模块在前面已经给出相关代码。下面是顶层文件和测试文件。
module top_uart(
input clk_50m,
input rst_n,
input rx_in,
output wire tx_out,//必须为wire型
output wire tx_done//必须为wire型
);
wire[7:0] data;
wire rx_done;
uart_rx m0(
.clk_50m(clk_50m),
.rst_n(rst_n),
.data_in(rx_in),
.rx_data(data),
.rx_done(rx_done)
);
uart_tx m1(
.clk_50m(clk_50m),
.rst_n(rst_n),
.uart_tx_en(rx_done),
.data_in(data),
.tx_data(tx_out),
.tx_done(tx_done)
);
endmodule
testbench文件
`timescale 1ns/1ns
`define clk_period 20
module top_uart_tb;
reg clk_50m;
reg rst_n;
reg rx_in;
wire tx_out;//必须为wire型
wire tx_done;//必须为wire型
top_uart uart1(
.clk_50m(clk_50m),
.rst_n(rst_n),
.rx_in(rx_in),
.tx_out(tx_out),//必须为wire型
.tx_done(tx_done)//必须为wire型
);
initial clk_50m = 1;
always #(`clk_period / 2 ) clk_50m = ~clk_50m;
initial begin
rst_n = 0;
rx_in = 1;
#(`clk_period * 500 +2)
rst_n = 1;
#(`clk_period * 1000)
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0; //起始位
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0; //数据1100_1010
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1; //停止位
#(`clk_period * ( 50_000_000 / 9600))
// rx_in = 1;
// #(`clk_period * ( 50_000_000 / 9600))
rx_in = 0; //起始位
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0; //数据1110_0110
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1; //停止位
#(`clk_period * ( 50_000_000 / 9600))
// rx_in = 1;
// #(`clk_period * ( 50_000_000 / 9600))
rx_in = 0; //起始位
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1; //数据0110_1001
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 0;
#(`clk_period * ( 50_000_000 / 9600))
rx_in = 1; //停止位
#(`clk_period * ( 50_000_000 / 9600))
#(`clk_period * 90_000)
$stop;
end
endmodule