RS-232串口通信的verilog实现
RS-232是一种串行数据通信的接口标准,广泛应用于计算机串行接口外设连接。
具有以下几个特征:
(1)异步通信
(2)能够进行全双工通信
RS-232可以使用DB-9连接器,如下所示,共有9个管脚
实际上,只需要三个管脚就可以实现RS-232串行通信了
pin2 :RxD (reciever data)
pin3:TxD(transmitter data)
pin5:GND
下面用verilog代码来实现该过程的仿真
语言:verilog
运行环境:modelsim 10.4
代码设计思路如下:
说明:
(1)由于要将发和收的频率统一起来,所以设计了一个脉冲发生器BaudGen,脉冲的频率就是通信的波特率。
(2)在发送阶段,每到一个脉冲,TxD_data[7:0]中的一位传送到TxD端口。
(3)在接收阶段,在每个脉冲处采样一个RxD数据,将其送入RxD_data[7:0]
因此,代码分为三个module设计
(1)波特率发生器,用于设定发出信号的频率和接受信号的频率
(2)发射器,在TxD_start有效时,发射数据,数据由一个起始位(低电平),8位有效数据,2个停止位组成。
(3)接收器,在RxD端口信号采集到低电平后,开始对8个有效数据进行采样,将每次采到的样放入寄存器RxD_state中。
代码部分如下:
(1)波特率发生模块。此处使用了一个OverSampling参数,可以在调用这个模块时设置这个参数,当OverSampling=8,就会输出一个频率为8倍的脉冲波形,这可以用于接收模块的排除偶然的异常跳转。
module BaudGen(clk,Clk_Sampling);
input clk;
output Clk_Sampling;
reg Clk_Sampling = 0;
reg [7:0] Baud_Count = 0;
parameter OverSampling = 1;
parameter N1 = 176/OverSampling;
//50000000HZ clk/ x bps = 176
//actually 176 is a number you can set according to the baud
parameter N2 = N1/2-1;//half of N1
always @(posedge clk) begin
if(Baud_Count == N1-1)
Baud_Count <= 0;
else
Baud_Count <= Baud_Count + 1;
end
always @(posedge clk) begin
if(Baud_Count == N2)
Clk_Sampling <= 1;
else
Clk_Sampling <= 0;
end
endmodule
(2)发射模块。
module transmitter(clk,TxD_start,TxD_data,TxD