FPGA实现串口回环实验

设计目标: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

仿真图片
FPGA实现串口回环实验_第1张图片实际测试结果:
FPGA实现串口回环实验_第2张图片

你可能感兴趣的:(FPGA+Verilog)