?? send.v
字號:
/********************************版權聲明**************************************
** 廣州致遠電子有限公司
**
** http://www.embedtools.com
**
**-------------------------------------------文件信息----------------------------------------------------------
** 文件名稱: send.v
** 創建者:
** 創建日期: 2007. 10.20
** 版本號: V1.0
** 功能描述: UART的發送模塊
**
**--------------------------------------修改文件的相關信息--------------------------------------------------
** 修改人:
** 修改日期: 2008.7.8
** 版本號: V1.01
** 修改內容: 整理
**
*******************************************************************************/
module send(
clk, //時鐘
clkout, //輸出
datain, //需要發送的一個字節數據
TXD, //uart發送引腳
TI, //發送中斷
WR, //寫控制信號
rst //復位
);
input rst;
input clk; //輸入時鐘
input WR; //寫信號
input [7:0] datain; //發送的一字節數據
output clkout; //輸出時鐘
output TXD,TI; //串行數據,發送中斷
reg [9:0] datainbuf,datainbuf2; //發送數據緩存
reg WR_ctr,TI,TXD_reg; //寫標志、中斷標志、一位發送寄存器
reg [3:0] bincnt; //發送數據計數器
reg [15:0] cnt; //計數器
wire clk_equ; //分頻時鐘
parameter cout = 5000; //根據具體的時鐘來設定分頻系數
//這里是48M時鐘,波特率選擇是9600,所以分頻系數為48000000/9600= 5000;
/********************************************************************************
** 模塊名稱:
** 功能描述:波特率發生進程
********************************************************************************/
always@(posedge clk)
begin
if(rst)
cnt <= 16'd0;
else
if(clk_equ)
cnt <= 16'd0;
else
cnt<=cnt+1'b1;
end
assign clk_equ = (cnt == cout);
assign clkout = clk_equ;
/********************************************************************************
** 模塊名稱:
** 功能描述:讀數據到緩存進程
********************************************************************************/
always@(posedge clk)
begin
if(rst)
begin
datainbuf <= 10'd0;
WR_ctr <= 1'b0;
end
else
if(WR)
begin
datainbuf <= {1'b1,datain[7:0],1'b0}; //讀入數據,并把緩存組成一幀數據,10位 datain[7:0]
WR_ctr <= 1'b1; //置開始標志位
end
else if(TI==0)
WR_ctr <= 1'b0;
end
/********************************************************************************
** 模塊名稱:
** 功能描述:主程序進程
********************************************************************************/
always@(posedge clk)
begin
if(rst)
begin
TXD_reg <= 1'b1;
TI <= 1'b1;
bincnt <= 4'd0;
end
else if(clk_equ) //發送條件判斷,保證發送數據的完整性
begin
if(WR_ctr==1||TI==0)
if(bincnt<4'd10)
begin
TXD_reg <= datainbuf>>bincnt; //移位輸出
bincnt <= bincnt + 4'd1; //發送數據位計數
TI <= 1'b0;
end
else
begin
bincnt <= 4'd0;
TI <= 1'b1;
TXD_reg <= 1'b1;
end
end
end
assign TXD = TXD_reg; //TXD連續輸出
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -