FPGA——UART Verilog程序设计 (二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qr_ljj/article/details/80684429

FPGA到PC的UART tx的程序设计

顶层设计

module top
(
	CLK,RSTn,
	TX_Pin_Out
);

input CLK;
input RSTn;

output TX_Pin_Out;

wire[7:0] TX_Data;
wire TX_EN_Sig;

control_module m1(.CLK(CLK),.RSTn(RSTn),.TX_Done_Sig(TX_Done_Sig),.TX_En_Sig(TX_En_Sig),.TX_Data(TX_Data));
UART_Tx m2(.CLK(CLK),.RSTn(RSTn),.TX_Data(TX_Data),.TX_En_Sig(TX_En_Sig),.TX_Pin_Out(TX_Pin_Out),.TX_Done_Sig(TX_Done_Sig));

endmodule 

数据传输:传输00~FF的数据

module control_module
(
	CLK,RSTn,
	TX_Done_Sig,
	TX_En_Sig,TX_Data
);
input CLK;
input	RSTn;
input	TX_Done_Sig;
output TX_En_Sig;
output[7:0]	TX_Data;

parameter  N1=50000; 
reg[24:0]	count;
reg isEn;
reg[7:0] rData;
wire TX_En_Sig;
wire[7:0] TX_Data;

always@(posedge CLK or negedge RSTn)
begin
	if( !RSTn)
		count <= 24'd0;
	else if(count == N1)
		count <= 24'd0;
	else
		count<=count+1'b1;
end

always@(posedge CLK or negedge RSTn)
begin
	if(!RSTn)
	begin
		isEn <= 1'b0;
		rData <= 8'h00;
	end
	else if( TX_Done_Sig)
	begin
		rData <= rData + 1'b1;
		isEn <= 1'b0;
	end
	else if(count == N1)
		isEn <= 1'b1;
end	

assign TX_Data = rData;
assign TX_En_Sig = isEn;

endmodule 

UART——tx封装

module UART_Tx
(
	CLK,RSTn,
	TX_Data,TX_En_Sig,
	TX_Pin_Out,TX_Done_Sig
);
input CLK;
input RSTn;
input[7:0] TX_Data;
input TX_En_Sig;

output TX_Pin_Out;

output TX_Done_Sig;

tx_control_module U1(.clk2(CLK), .rst2(RSTn),.TX_En_Sig(TX_En_Sig), .TX_Data(TX_Data),
 .BPS_CLK(BPS_CLK), .TX_Done_Sig(TX_Done_Sig), .TX_Pin_Out(TX_Pin_Out));

tx_bps_module U2(.clk1(CLK), .rst1(RSTn),.Count_Sig(TX_En_Sig), .BPS_CLK(BPS_CLK));

endmodule 

波特率:9600

module tx_bps_module//数据位中心定位模块
(
    clk1, rst1,
	 Count_Sig, 
	 BPS_CLK
);

input clk1;
input rst1;			//复位信号 RSTn,当RSTn=0,系统复位
input Count_Sig;	//串口数据帧开始确认信号:Count_Sig,当 Count_Sig=1,表示串口输入帧开始时刻,持续一个系统时钟周期
output BPS_CLK;	//BPS_CLK,当计数至每一位的中间位置,BPS_CLK=1,提示信号采集时间到,否则不进行信号采集

reg[12:0] Count_BPS;
	 
always @ ( posedge clk1 or negedge rst1 )
	if( !rst1 )
		Count_BPS <= 13'd0;
	else if( Count_BPS == 13'd5207 )
		Count_BPS <= 13'd0;
	else if( Count_Sig )
		Count_BPS <= Count_BPS + 1'b1;
	else
		Count_BPS <= 13'd0;

assign BPS_CLK = ( Count_BPS == 12'd2604 ) ? 1'b1 : 1'b0;

endmodule 

UART_tx数据传输模块

module tx_control_module
(
    clk2, rst2,
	 TX_En_Sig, TX_Data, BPS_CLK, 
    TX_Done_Sig, TX_Pin_Out
	 
);

input clk2;
input rst2;
input TX_En_Sig;
input[7:0] TX_Data;
input BPS_CLK;
	 
output TX_Done_Sig;
output TX_Pin_Out;

reg[3:0] i;
reg rTX;
reg isDone;
	
always @ ( posedge clk2 or negedge rst2 )
	if( !rst2 )
	begin
		i <= 4'd0;
		rTX <= 1'b1;
		isDone 	<= 1'b0;
	end
	else if( TX_En_Sig )
	case ( i )
		4'd0 :
				if( BPS_CLK )
				begin
					i <= i + 1'b1; rTX <= 1'b0;
				end
		4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 :
				if( BPS_CLK )
				begin
					i <= i + 1'b1;
					rTX <= TX_Data[ i - 1 ];
				end
		4'd9 :
				if( BPS_CLK )
				begin
					i <= i + 1'b1;
					rTX <= 1'b1;
				end			 			 
		4'd10 :
				if( BPS_CLK )
				begin
					i <= i + 1'b1;
					rTX <= 1'b1;
				end
		4'd11 :
				if( BPS_CLK )
				begin
					i <= i + 1'b1;
					isDone <= 1'b1;
				end
		4'd12 :
				begin
					i <= 4'd0;
					isDone <= 1'b0;
				end
	endcase
				
assign TX_Pin_Out = rTX;
assign TX_Done_Sig = isDone;
	  
endmodule 

猜你喜欢

转载自blog.csdn.net/qr_ljj/article/details/80684429