FPGA UART TX,简单的FPGA串口发送模块

串口资料大家网上找找,我也是个新手,欢迎交流.
//UART发送模块,波特率9600
//陈鹏
//20120118 	

module UART_TX	(
						sys_clk,//系统时钟输入
						reset_n,//异步复位输入
						Tx,//数据线
						TxData,//发送数据的数据线
						Tx_Start,//启动发送信号
						TX_STATE//发送器的状态
					);
					
				
					
	input		sys_clk,reset_n,Tx_Start;
	input [7 : 0] TxData;
	output	Tx,TX_STATE;
	reg 		Tx,TX_STATE;
	
	parameter SYS_CLK = 20000000;//系统时钟
	parameter Tx_CLK = 9600;//9600bps
	parameter TxDATA_W = 12;//波特率时钟发生器分频寄存器位宽
	parameter TXCLK_DATA = SYS_CLK / Tx_CLK - 1;//波特率分频器时钟分频值
	
	//波特率时钟发生器
	reg	[TxDATA_W-1 : 0] clk_cnt;
	reg	EN_TXCLK;//使能发送时钟
	wire	TX_CLK;//发送波特率时钟
	always @ (posedge sys_clk or negedge reset_n)
		if(!reset_n)
			clk_cnt <= 12'd0;	
		else if(!EN_TXCLK)//不需要使能时钟
			clk_cnt <= 12'd0;	
		else if(clk_cnt == TXCLK_DATA)
			clk_cnt <= 12'd0;
		else
			clk_cnt <= clk_cnt + 1'b1;
			
	assign TX_CLK = (clk_cnt == 0);//产生接收时钟
	
	
	//发送控制状态机
	reg [3 : 0] TxState;
	reg [7 : 0] TxTemp;//存放需要发送的数据
	
	always @ (posedge sys_clk or negedge reset_n)
		if(!reset_n) begin
			TxState = 4'd0;
			TxTemp = 8'd0;
			TX_STATE = 1'b0;
			EN_TXCLK = 1'b0;
			end
		else if ((TxState == 0) && (TX_STATE == 0) && Tx_Start) begin//总线空闲,并且有开始信号,那么开始发送数据
			EN_TXCLK <= 1'b1;//使能发送时钟
			TxState <= 4'd1;//开始发送的第一个状态
			TX_STATE <= 1'd1;//发送忙
			TxTemp <= TxData;//载入需要发送的数据
			end
		else if(TX_CLK) begin
			case (TxState) //synthesis full_case
				4'd1	:	begin //发送起始位					
							Tx <= 1'b0;
							TxState <= 4'd2;
							end
				4'd2	:	begin //发送bit0			
							Tx <= TxTemp[0];
							TxState <= 4'd3;
							end
				4'd3	:	begin //发送bit1			
							Tx <= TxTemp[1];
							TxState <= 4'd4;
							end			
				4'd4	:	begin //发送bit2						
							Tx <= TxTemp[2];
							TxState <= 4'd5;
							end
				4'd5	:	begin //发送bit3						
							Tx <= TxTemp[3];
							TxState <= 4'd6;
							end
				4'd6	:	begin //发送bit4						
							Tx <= TxTemp[4];
							TxState <= 4'd7;
							end
				4'd7	:	begin //发送bit5						
							Tx <= TxTemp[5];
							TxState <= 4'd8;
							end
				4'd8	:	begin //发送bit6						
							Tx <= TxTemp[6];
							TxState <= 4'd9;
							end
				4'd9	:	begin //发送bit7						
							Tx <= TxTemp[7];
							TxState <= 4'd10;
							end
				4'd10	:	begin //发送奇偶校验位,随便发					
							Tx <= 1'b0;
							TxState <= 4'd11;
							end
				4'd11	:	begin //发送停止位,高电平					
							Tx <= 1'b1;
							TxState <= 4'd0;//进入空闲状态
							EN_TXCLK <= 1'b0;//发送波特率时钟停在
							TX_STATE <= 1'd0;//发送逻辑空闲
							end
				endcase
		end //end else if
						
			
endmodule

	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cp1300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值