?? rec.v
字號:
/********************************版權聲明**************************************
** 廣州致遠電子有限公司
**
** http://www.embedtools.com
**
**-------------------------------------------文件信息----------------------------------------------------------
** 文件名稱: rec.v
** 創建者:
** 創建日期: 2007. 10.20
** 版本號: V1.0
** 功能描述: UART的接收模塊
**
**--------------------------------------修改文件的相關信息--------------------------------------------------
** 修改人:
** 修改日期: 2008.7.8
** 版本號: V1.01
** 修改內容: 整理
**
*******************************************************************************/
module rec(
clk,
clkout,
dataout,
RXD,
RI,
rst
);
input rst;
input clk,RXD; //時鐘與數據輸入
output clkout,RI; //時鐘輸入、接收中斷輸出
output [7:0] dataout; //并行數據輸出
reg StartF,RI; //開始與接收中斷標志
reg [9:0] UartBuff; //接收緩存區
reg [3:0] count,count_bit; //位接收計數器
reg [15:0] cnt; //時鐘節拍計數器
reg [2:0] bit_collect; //采集數據緩存區
wire clk_equ,bit1,bit2,bit3,bit4; //連線
parameter cout = 312; //時鐘是48M所以16*9600的分頻數為312.5,這里取整數
/********************************************************************************
** 模塊名稱:
** 功能描述:波特率發生進程
********************************************************************************/
always@(posedge clk) //時鐘節拍計數器
begin
if(rst)
cnt <= 16'd0;
else
begin
if(clk_equ)
cnt <= 16'd0;
else
cnt <= cnt + 1'b1;
end
end
assign clk_equ = (cnt == cout); //采樣時鐘
assign clkout = clk_equ;
assign bit1 = bit_collect[0]&bit_collect[1]; //對采樣數據進行判斷
assign bit2 = bit_collect[1]&bit_collect[2]; //對采樣數據進行判斷
assign bit3 = bit_collect[0]&bit_collect[2]; //對采樣數據進行判斷
assign bit4 = bit1|bit2|bit3; //對采樣數據進行判斷,只要有兩次相同就可以
/********************************************************************************
** 模塊名稱:
** 功能描述:UART的接收模塊,接收采樣率為波特率的16倍
********************************************************************************/
always@(posedge clk)
begin
if(rst)
begin
count <= 4'd0;
RI <= 1'b1;
StartF <= 1'b0;
bit_collect <= 3'd0;
UartBuff <= 10'd0;
end
else
begin
if(clk_equ)
begin
if(!StartF) //是否處于接收狀態
begin
if(!RXD)
begin
count <= 4'b0; //復位計數器
count_bit <= 4'b0;
RI <= 1'b0;
StartF <= 1'b1;
end
else RI <= 1'b1;
end
else
begin
count <= count+1'b1; //位接收狀態加1
if(count==4'd6)
bit_collect[0] <= RXD; //數據采集
if(count==4'd7)
bit_collect[1] <= RXD; //數據采集
if(count==4'd8)
begin
bit_collect[2] <= RXD; //數據采集
UartBuff[count_bit] <= bit4;
count_bit <= count_bit+1'b1; //位計數器加1
if((count_bit==4'd1)&&(UartBuff[0]==1'b1)) //判斷開始位是否為0
begin
StartF <= 1'b0; //標志開始接收
end
RI <= 1'b0; //中斷標志位低
end
if(count_bit>4'd9) //檢測是否接收結束
begin
RI <= 1'b1; //中斷標志為高標志轉換結束
StartF <= 1'b0;
end
end
end
end
end
assign dataout = UartBuff[8:1]; //取出數據位
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -