曾经在学单片机的时分,觉得串口通讯其实很简略,只需一个指令数据就能容易的接纳或许发送。前几天试着用FPGA完成,发现里边的学识还不少,并没有幻想的那么简略。当然代码肯定是参阅他人的,不过我仍是仔细研讨了整段代码的,下面的程序便是我在看懂了他人代码后自己敲的,花了也不少时刻,了解的也差不多,下面我就在这儿给那些和我相同的初学者介绍一下吧,解说的不对的当地还望各位大神纠正,咱们好一同学习~
1、顶层模块
写程序都相同,不能多有的程序都写在一个模块里,那样看起来很费事,出了过错也欠好保护,关于一些小的程序咱们能够写在一个模块里,但程序一旦杂乱起来仍是要懂得模块化编程的,关于顶层模块,最好是只写接口就好了,例如:
这段代码中,rx_232是咱们的底层模块名,后边跟着的那个rx呢是咱们自己取的姓名,是恣意的。后边的一大串呢便是接口,为了直观呢,主张咱们选用我的这种写法,看上去比较清楚理解,括号里边的接口是咱们顶层文件的接口,括号外面的是咱们调用底层模块的接口,这些接口要一一对应正确才干确保数据之间的传输。
在顶层模块中,咱们只界说了数据输入接口,用来接纳数据,数据输出接口,用于发送数据,时钟接口,和复位接口。这四个接口是有输入输出联系的,关于其他的接口,是归于咱们整个模块内部的接口,是模块与模块之间的接口,既非输入,也非输出,相当于一根导线相同,所以咱们把他们界说成wire型变量
2、波特率挑选模块
单片机或许计算机在串口通讯时的传输速率用波特率表明,9600bps表明的便是每秒钟传送9600位的数据
这儿之所以计数到5027,在这儿算一下。
1秒传送9600位,那么传送一位的时刻就能够算出,即1s=1000_000_000ns,所以传送一位数据需求1000_000_000/9600=
104166ns,而咱们的时钟周期为20ns,因而需求计数到104166/20=5028个时钟周期
下面是串口通讯时序图
我再来解说一下这个图吧,我其时学单片机的时分还真是没怎样注重这张图,只知道只需一个指令就能够发送,没有真实搞清楚是怎样发送和承受的,那就在这儿温习一下吧
计算机和单片机之间进行通讯,这儿用的是rs232通讯方法,即通讯之前,计算机和单片机之前要设定好相同的波特率,只要波特率相同了才干进行通讯。
其次,计算机发送数据时要先发送一个开端位,一般是低电平,后边跟着的是8位数据位,奇偶校验位,中止位等,当开端位低电平信号传送到咱们的接纳端口时,在接纳模块中会发送一个指令给波特率时钟计数器,开端计时,计时到一半的时分会发生一个采样高脉冲信号,当接纳模块检测到这个高脉冲之后就会将数据存到寄存器中,当检测到第11个脉冲信号时,也便是代表一帧的数据接纳结束,发送模块就给波特率挑选模块发送一个中止信号告知它中止计时。一起,当数据接纳结束之后也会发生一个信号告知发送模块,信号现已接纳结束,预备发送,这个时分发送模块再给波特率计时模块发送一个信号开端计时,计数到某一位的中心时发生一个采样信号,当发送模块检测到采样信号之后就将寄存器里的数据送到发送端,每次只送一位,这样就完成了数据的接纳与发送。
下面是波特率计时模块的首要程序部分
3、数据接纳模块
在接纳模块中,为了精确的检测计算机发送来的数据开端位的那个低电平信号,用到了边缘脉冲检测法,能够有用的防止毛刺现象带来的问题
下面是发送部分的首要程序段
4、数据发送模块
发送模块原理上和承受模块是相同的,不同点便是接纳模块经过边缘检测法检测开端位低电平信号来发动接纳数据,而发送模块是经过检测数据发送结束后,咱们以为的置一个低电平信号,发送模块经过检测这个低电平信号来发动发送。见下图
下面是生成的RTL视图
下面是测验成果