串行通讯
数据以每次一位的方式传输;每条线用来传输一个方向的数据。由于计算机通常至少需要若干位数据,因此数据在发送之前先“串行化”。通常是以8位数据为1组的。。先发送最低有效位,最后发送最高有效位。
异步通讯
RS-232使用异步通讯协议。也就是说数据的传输没有时钟信号。接收端必须有某种方式,使之与接收数据同步。
对于RS-232来说,是这样处理的:
1.
2.
3.
4.
5.
让我们来看看0x55是如何传输的:
0x55的二进制表示为:01010101。
但是由于先发送的是最低有效位,所以发送序列是这样的:
下面是另外一个例子
传输的数据为0xC4,你能看出来吗?
从图中很难看出来所传输的数据,这也说明了事先知道传输的速率对于接收端有多么重要。
RS-232发送模块
下面是我们所想要实现的:
它应该能像这样工作:
·
·
RS-232模块的参数是固定的:
数据串行化
假设我们已经有了一个115200波特的"BaudTick"信号.
我们需要产生开始位、8位数据以及停止位。
用状态机来实现看起来比较合适。
reg
always
case(state)
4'b0000:
4'b0100:
4'b1000:
4'b1001:
4'b1010:
4'b1011:
4'b1100:
4'b1101:
4'b1110:
4'b1111:
4'b0001:
4'b0010:
default:
endcase
注意看这个状态机是怎样实现当"TxD_start"有效就开始,但只在"BaudTick"有效的时候才转换状态的。.
现在,我们只需要产生"TxD"输出即可.
reg
always
case(state[2:0])
0:
1:
2:
3:
4:
5:
6:
7:
endcase
//将开始位、数据以及停止位结合起来
assign
RS232接收模块
下面是我们想要实现的模块:
我们的设计目的是这样的:
注意:只有当"data_ready"有效时,"data"总线的数据才有效,其他的时间里不要使用"data"总线上的数据,因为新的数据可能已经改变了其中的部分数据。
过采样
异步接收机必须通过一定的机制与接收到的输入信号同步(接收端没有办法得到发送断的时钟)。这里采用如下办法。
典型的过采样时钟频率为接收到的信号的波特率的16倍,这里我们使用8倍的采样时钟。当波特率为115200时,采样时钟为921600Hz。(115200*8=921600)
假设我们已经有了一个8倍于波特率的时钟信号