串口通信Usart發送程序

使用Verilog代碼編寫的USART發送程序:

數據位8位,停止位1位,校驗位沒有,流控沒有

波特率由波特率模塊生成

串口時序大致如下圖所示:


module uart_trans(GClk,clk_bps,reset,tx_en,datain,Txd,tx_ok);
input GClk,clk_bps,reset,tx_en;//全局時鐘,波特率時鐘,全局復位,發送啓動信號
input [7:0]datain;
output Txd,tx_ok;
//tx_en:__/^\____________________

wire clk_bps;
reg Txd,tx_ok;
reg [7:0]data;//數據緩存
reg [3:0]BitPos;//狀態位

reg tx_en0,tx_en1,tx_en2;    //rx_int信號寄存器,捕捉下降沿濾波用
always @ (posedge GClk or negedge reset) 
    if(!reset) begin
        tx_en0 <= 1'b0;
        tx_en1 <= 1'b0;
        tx_en2 <= 1'b0;
    end
    else begin
        tx_en0 <= tx_en;
        tx_en1 <= tx_en0;
        tx_en2 <= tx_en1;
    end
assign pos_tx_en =  tx_en & ~tx_en0;    //捕捉到下降沿後,neg_rx_int拉高保持一個主時鐘週期
 
reg TxAv;//發送有效信號,其控制信號具有優先級
always @(posedge GClk or negedge reset)
begin
if(!reset) begin//當接收寄存器讀時,位有效信號復位
TxAv <= 1'b0;
end
else if(tx_en)//接收模塊接收到數據,立即發送出去pos_tx_en
TxAv <= 1'b1;
else if(BitPos==4'd10)
TxAv<= 1'b0;//發送模塊發送完畢
else TxAv<=TxAv;
end

//tx_en:__/^\____________________
//tx_ok:___________________/^\____
//TxAv:___/^^^^^^^^^^^^^^^\_______

always @(posedge GClk or negedge reset)
begin
if(!reset) begin//當接收寄存器讀時,位有效信號復位
tx_ok<=1'b1;
end
else if(BitPos==4'd10) begin
tx_ok<=1'b1;
end
else begin
tx_ok<=1'b0;
end
end

/* 讀入數據 */
always @(posedge GClk or negedge reset)
begin
if(!reset) begin
data<=8'd0;
end
else if((BitPos==4'd0)&(pos_tx_en))
data<=datain;
else data<=data;
end

always @(posedge GClk or negedge reset)
begin
if(!reset) begin
Txd <= 1'b1;
BitPos<=4'd10;
end
else if(TxAv) begin
if(clk_bps) begin
BitPos<=BitPos+1'b1;
case(BitPos)
4'd0: Txd <= 1'b0;//起始位
4'd1: Txd <= data[0];//數據位 開始
4'd2: Txd <= data[1];
4'd3: Txd <= data[2];
4'd4: Txd <= data[3];
4'd5: Txd <= data[4];
4'd6: Txd <= data[5];
4'd7: Txd <= data[6];
4'd8: Txd <= data[7];
4'd9: Txd <= 1'b1;//數據結束位,1位
4'd10:;
default:;
endcase
end
else begin
if(BitPos==4'd10)
BitPos<=4'd0;
end
end
else Txd <= 1'b1;
end
endmodule


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章