FPGA UART TX,簡單的FPGA串列埠傳送模組
阿新 • • 發佈:2019-01-03
串列埠資料大家網上找找,我也是個新手,歡迎交流.
//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