串口篇
串口在单片机调试中也算是调试代码的利器,可是以前单片机基本上都有串口,我们所要做的无非就是把要发送的数据写给某一寄存器,然后等他发完就OK啦,接收也是同样的道理,那时候的我虽然经常在用串口,但是对串口还是没有真正的理解,波特率?起始停止位?奇偶校验位?统统只要配置寄存器。学到FPGA就不一样啦,啥也没有,我想这也正体现了FPGA的灵活性嘛。现在我们要开始模拟串口时序啦。
我将工程分为四个模块:波特率发生器,串口接收,串口发送。
模块1(波特率发生器):什么是波特率呢?波特率就是每秒发送/接收位(bit)的个数,比如1s发2个字节,1个字节8bit,那么波特率就是16,一般串口都用9600,115200啥的,说到这里,大家都应该知道了,这个模块其实就是一个分频器罢了,如果要9600的波特率,那么只要将频率为50M的时钟分成频率为9600*8Hz就好啦,大家会说,乘以8做啥呀,一会儿后面说。
模块2(串口接收):首先判断第一位是不是“0”(不要问我为什么,这是串口协议规定,起始位为0),若为0,则开始判断接下来8位的值,这8位才是真正的数据,8位数据判断完了,再判断奇偶校验位(如果发送方有的话),最后“判断”停止位,说是判断,其实谁关心停止位是啥呀,你说是吧,说白了就是给它面子,让时间流过停止位而已。但是呢,你要按我说的做呢,十有八九在串口调试助手里是木有结果的,为什么呢?这里要说说模块1中的“乘以8”,其实在判断每一位时,我们都要判断8次,取值呢就取8次判断中出现次数超过半数的1”或“0”,这样能更好的抗干扰能力,嘿嘿,这样就算成功了一大半啦。
模块3(串口发送):发送要比接收简单多了,毕竟主动权在自己手中呀,同样的,也要发送“起始位+数据位+奇偶校验位(有的话)+停止位”,这里每一位要保持8个周期哦,因为波特率是9600*8呀。
整个工程的功能呢就是将串口接收的数据再发回串口调试助手。
视频观看: