通用异步收发器UART设计文档格式.docx
《通用异步收发器UART设计文档格式.docx》由会员分享,可在线阅读,更多相关《通用异步收发器UART设计文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
r_stop:
无论停止位是1位还是1.5位,或是2位,状态机载r_stop状态下不具体检测RXD,只是输出帧接收完毕信号(rec_done<
=1)停止位后状态机转回到r_start状态,等待下一帧的起始位。
发送器
发送器状态转化图如下:
x_Idle:
空闲状态。
当UART被reset复位后,进入这一状态,在此状态中,UART的发送器一直在等待一个数据帧发送命令xmit_cmd。
Xmit_cmd_p信号是对xmit_cmd的处理,xmit_cmd_p是一个短脉冲信号。
当xmit_cmd_p=1时,进入x_start,准备发送起始位。
x_start:
起始位。
在此状态下,UART的发送器一个时间宽度的逻辑0信号至TXD,即起始位,紧接着状态机进入x_wait状态,xcnt16时bclk的计数器。
x_wait:
移位等待。
接收x_wait类似。
x_shift:
移位状态。
实现待发数据的并串转换。
x_stop:
停止位。
数据帧发送完毕,转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位,发送完停止位后回到x_Idle状态,并等待另外一个数据帧的发送命令。
总模块
其实相当于UART的外部线路接口,就是成品的引脚图,它的接口一部份连接着其它模块,另一部份连接外部通信设备,其程序就是一些接口间数据的传送和接收。
以下是对UART总模块中涉及的外部接口的简要说明。
时钟信号clk(输入):
UART的系统时钟。
复位信号rest(输入)):
UART系统总复位。
16倍时钟bclk(输出):
16倍于波特率时钟。
UART发送txd(输出):
UART异步串行发送端。
发送缓冲xbuf(输入):
带发送数据输入。
发送命令xmit_cmd(输入):
启动发送器发送一个UART帧。
发送完成xmit_done(输出):
UART帧发送完成,等待新的发送命令。
UART接收rxd(输入):
UART异步串行接收端。
接收缓冲rbuf(输出):
接收数据缓冲,在下一个帧数据接收完毕时,数据缓冲rbuf会被更新,需要在此之前取走数据。
接收准备rec_ready(输出):
接收协调信号,接收完毕后的下一帧接收准备好信号,在rec_ready有效时,rbuf已被更新。
二、实验原程序:
整体分四个模块,一个顶层模块,三个子模块
顶层模块:
uart
A.:
uart
//uart.v
moduleuart(clk,bclk,reset,rxd,txd,xmit_cmd,xmit_done,rec_ready,xbuf,rbuf);
inputclk;
inputreset;
inputrxd;
inputxmit_cmd;
input[7:
0]xbuf;
outputbclk;
outputtxd;
outputxmit_done;
outputrec_ready;
output[7:
0]rbuf;
wirebclk16;
baudbaud(.clk(clk),.reset(reset),.bclk(bclk),.bclk16(bclk16));
u_recu_rec(.bclk16(bclk16),.reset(reset),.rxd(rxd),.rec_ready(rec_ready),.rbuf(rbuf));
u_xmitu_xmit(.bclk(bclk),.reset(reset),.txd(txd),.xmit_cmd(xmit_cmd),.xbuf(xbuf),.xmit_done(xmit_done));
endmodule
B.//波特率发生子模块:
baud
//baud.v
modulebaud(clk,reset,bclk,bclk16);
//波特率时钟,给发送模块
outputbclk16;
//16倍波特率时钟,给接收模块
regbclk;
regbclk16;
reg[7:
0]div_16baud;
reg[3:
0]div_baud;
//parameterXTAL=12000000;
//(83ns)
//parameterBAUD=9600;
parameterdiv_clk=36;
//时钟的分频系数=XTAL/(BAUD*16*2)
always@(negedgeclkornegedgereset)
begin
if(!
reset)
div_16baud<
=8'
d0;
bclk16<
=1'
b0;
bclk<
div_baud<
=4'
d1;
end
else
if(div_16baud==div_clk)
=div_baud+4'
=~bclk16;
if(div_baud==4'
d15)
=~bclk;
=div_16baud+8'
C.//接收子模块:
u_rec
//u_rec.v
moduleu_rec(bclk16,reset,rxd,rec_ready,rbuf);
inputbclk16;
regrxd_sync;
//接收端同步信号
regShift;
//右移使能信号
//接收数据缓冲器
0]rec_shftreg;
//接收数据移位寄存器
0]samplecnt;
//采样间隔判断计数器
regcenter;
//采样间隔判断计数器使能信号
reg[4:
0]datacnt;
//数据位长度判断计数器
regdatawait;
//数据位长度判断计数器使能信号
0]state;
//当前状态位
regrec_ready;
//数据接收完毕信号(等待接受信号)3
parameterFramelen=4'
d8;
//数据位长度
//状态机状态编码,使用独热码
parameterr_Start=5'
b00001;
parameterr_Center=5'
b00010;
parameterr_Wait=5'
b00100;
parameterr_Sample=5'
b01000;
parameterr_Stop=5'
b10000;
//同步信号
always@(posedgebclk16ornegedgereset)
if(!
rxd_sync<
=rxd;
//右移寄存器
rec_shftreg<
rbuf<
if(Shift)
rec_shftreg[6:
0]<
=rec_shftreg[7:
1];
rec_shftreg[7]<
=rxd_sync;
elserbuf<
=rec_shftreg;
samplecnt<
if(center)
=samplecnt+4'
//*********状态机*********
state<
=r_Start;
Shift<
center<
datawait<
datacnt<
case(state)
r_Start:
rxd_sync)
=r_Center;
rec_ready<
r_Center:
if(samplecnt==2'
h3)
=r_Wait;
b1;
r_Wait:
if(samplecnt==4'
d13)
if(datacnt==Framelen)
=r_Stop;
=r_Sample;
=datacnt+4'
r_Sample:
r_Stop:
=3'
default:
endcase
D.//发送子模块:
u_xmit
//u_xmit.v
moduleu_xmit(bclk,reset,txd,xmit_cmd,xbuf,xmit_done);
inputbclk;
regxmit_cmd_p;
//发送命令脉冲
regflag;
//发送命令判断标志位
regtxd;
0]xmit_shftreg;
reg[2:
regxmit_done;
//发送完毕信号
regstart;
//起始位标志
parameterFramelen=3'
d7;
//数据位长度
parameterx_Idle=5'
parameterx_Start=5'
parameterx_Wait=5'
parameterx_Shift=5'
parameterx_Stop=5'
//发送命令脉冲发生器
always@(posedgebclkornegedgereset)
xmit_cmd_p<
flag<
elseif(xmit_cmd&
&
(!
flag))
elseif(!
xmit_cmd)
elsexmit_cmd_p<
xmit_shftreg<
txd<
elseif(Shift)
=xmit_shftreg[0];
xmit_shftreg[6:
=xmit_shftreg[7:
xmit_shftreg[7]<
elseif(start)
=xbuf;
if(datawait)
=datacnt+3'
=x_Idle;
start<
if(xmit_cmd_p)
=x_Start;
xmit_done<
x_Start:
=x_Wait;
x_Wait:
=x_Stop;
=x_Shift;
x_Shift:
x_Stop:
end
三、实验UART的部件图:
✧Ⅰ、系统RTL级电路
✧Ⅱ、波特率发生器模块RTL级电路
✧Ⅲ、接收模块RTL级电路
✧Ⅳ、接收模块状态机图
✧Ⅴ、发送部分状态机图
四、仿真波形:
五、锁定管脚:
六、下载:
七、验证实验:
结果良好,只是速度感觉不是瞬时传送完毕的。
八、体会:
经过这次实习,感觉收集和整理资料是最麻烦的,它基本上占了整个实习阶段的三分之二左右的时间。
因为在这个过程中,不仅要对资料进行必要检索,还要进行学习。
收集完之后,还要对这些资料做最后的整理,使这些资料变成自己想要的东西。
而就算你已经学会了这些知识,要应用到实验箱上来也不是一件容易的事。
通过这次实习,基本了解到传统的数字电子系统或IC设计中,手工设计的比例占了很大的部分,而手工设计有很多的缺点:
复杂电路的设计、调试十分的困难;
由于无法进行硬件系统功能仿真,如果某一过程出现错误,查找和修改十分不便;
设计过程中产生大量的文档,不便于管理;
对于IC设计而言,设计实现过程与具体生产工艺相关,因此可移植性差;
只有在设计出样机或芯片才能进行实测。
而EDA技术对数字系统进行行为与功能描述到具体的内部线路结构,从而可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可以大大的降低设计成本、缩短设计周期。