?? send.v
字號:
// send.v
/********************send*************************
**模塊名稱:send
**功能描述:UART的發送程序
**************************************************/
module send(
clk, //系統同步時鐘
WR, //寫數據到發送緩存的使能信號
Datain, //需要發送的一個字節數據
TXD, //uart發送引腳
TI, //發送中斷--TI = 0,表示正在發送數據;
reset //TI = 1,表示等待發送數據或發送數據完畢;
);
input clk; //輸入時鐘
input WR; //寫信號
input [7:0] Datain; //發送的一字節數據
input reset;
output TXD,TI; //串行數據,發送中斷
reg [9:0] Datainbuf,Datainbuf2; //發送數據緩存
reg WR_ctr; //寫標志
reg TI,txd_reg; //中斷標志、一位發送寄存器
reg [3:0] bincnt; //發送數據計數器
reg [15:0] cnt; //計數器
wire clk_equ; //分頻時鐘
parameter COUNT = 2500; //19200 //根據具體的時鐘來設定分頻系數
//這里是48M時鐘,波特率選擇是9600,所以分頻系數為48000000/9600= 5000;
/*************波特率發生進程****************************/
always@(posedge clk)
begin
if(reset)
begin
cnt<=0;
end
else
begin
if(clk_equ)
cnt<= 16'd0;
else
cnt<=cnt+1'b1;
end
end
assign clk_equ =(cnt == COUNT);
/*************讀數據到緩存進程****************************/
always@(posedge clk)
begin
if(WR) //有數據寫入緩存
begin
Datainbuf <= {1'b1,Datain[7:0],1'b0}; //讀入數據,并把緩存組成一幀數據,10位
WR_ctr <= 1'b1; //置開始標志位
end
else
if(TI==0) //正在發送數據;
WR_ctr <= 1'b0;
end
/*************主程序進程****************************/
always@(posedge clk)
begin
if(clk_equ)
begin
if(WR_ctr==1||bincnt<4'd10) //發送條件判斷,保證發送數據的完整性
//滿足WR_ctr==1,開始發送最低位
begin
if(bincnt<4'd10)
begin
txd_reg = Datainbuf2[0]; //從最低位開始發送
Datainbuf2 = Datainbuf>>bincnt; //移位輸出
bincnt = bincnt+4'd1; //發送數據位計數
TI = 1'b0;
end
else
bincnt = 4'd0;
end
else
begin //發送完畢或者處于等待狀態時TXD和TI為高
txd_reg = 1'b1;
TI = 1'b1;
end
end
end
//-------------------------------------------------
assign TXD = txd_reg; //TXD連續輸出
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -