1. 程式人生 > >FPGA UART TX,簡單的FPGA串列埠傳送模組

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