前段时间笔者已经就STM32的通讯协议发了一篇总结,最近在学FPGA时决定重新写一篇关于fpga的通讯协议的内容。本章将着重介绍异步UART协议和USB、RS232。
1. 接口标准
在两个设备进行数据传输时,从硬件层面将数据定义为1为高电平,0为低电平,我们就可以通过改变传输线电平的高低实现这组数据的顺利传输。为了对这种硬件层面的数据传输形式进行规范定义便有了硬件通信接口协议,目前常用的接口标准有RS232、RS422、RS485等。
接口标准 | 逻辑1 | 逻辑0 | 说明 | 优缺点 |
---|---|---|---|---|
TTL | +3.3/5V | 0 | 常见的控制芯片引脚均支持 | |
RS232 | -15V | +15V | 负逻辑电平,3线全双工,点对点通信 | 传输速度低且距离短 |
RS422 | 差值电压+(2~6)V | 差值电压 -(2~6)V | 差分传输,4线全双工,主从通信 | 抗干扰能力强,传输距离远且高速 |
RS485 | 差值电压+(2~6)V | 差值电压 -(2~6)V | 差分传输,2线半双工,多点双向通信 | 能够实现多个设备的双向通讯 |
1.1 RS232接口
RS-232标准采用的接口是9针或25针的D型插头,常用的一般是9针插头(DB9M)。
引脚号 | 引脚名称 | 功能说明 |
---|---|---|
Pin1 | DCD | 载波检+测,接收线信号检出(Received Line detection-RLSD) |
Pin2 | RXD | 接受数据,为接收数据的引脚 |
Pin3 | TXD | 发送数据(TXD) ,为发送数据的引脚 |
Pin4 | DTR | 数据终端准备好 |
Pin5 | GND | 信号地线 |
Pin6 | DSR | 当调制/解调器启动时,在经过自身检测后,用来声明准备就绪 |
Pin7 | RTS | 请求发送,取得发送信息 |
Pin8 | CTS | 清除发送,清除数据 |
Pin9 | RI | 振铃指示,发出提示 |
1.2 USB
USB是一种常用的pc接口,他只有4根线,两根电源两根信号,故信号是串行传输的。USB接口的输出电压和电流是:+5V、500mA 实际上有误差,最大不能超过+/-0.2V 也就是4.8~5.2V 。usb接口的4根线一般是下面这样分配的,需要注意的是千万不要把正负极弄反了。
引脚号 | 颜色 | 名称 | 说明 |
---|---|---|---|
1 | 红 | VBUS | +5V |
2 | 白 | Data - | 数据- |
3 | 绿 | Data + | 数据 + |
4 | ID | A型与地线连接,B型浮空 | |
5 | 黑 | GND | 地 |
2. 程序设计
由上图可以看到,当uart_rxd处于下降沿时会产生起始条件,此时star_flag和传输标志rx_flag会拉高,随后star_flag复位并开始传输数据,在8位数据后产生一个结束位(为了防止影响下次传输,我们这里一般让停止位只有半个位周期),并产生uart_done信号表示传输结束。
值得注意的是,这里需要考虑到时钟周期和串口波特率的关系,我们将二者相比便可以得到 每一位所需要的时钟间隔(位周期),并且以时钟间隔为切换数据位的判断量。例如:
Clk_cycle=Frequence(sys_clk)/Bps(clk_cnt);
当count<Clk_cycle时,count<=count+1'b1;当count==Clk_cycle时,count<=1'b0且bit_count<=bit_count+1'b1,此时可以改变状态机的“状态”,具体如下:
2.1 接收模块
串口接收模块是个参数化可配置模块,参数“CLK_FRE”定义接收模块的系统时钟频率,单位是 Mhz,参数“BAUD_RATE”是波特率。接收状态机状态转换图如下:
“S_IDLE”状态为空闲状态,上电后进入“S_IDLE”,如果信号“RXD”有下降沿,我们认为是串口的起始位,进入状态“S_START”,等一个 BIT 时间起始位结束后进入数据位接收状态“S_REC_BYTE”,接收完成以后进入“S_STOP”状态,在“S_STOP”没有等待一个 BIT 周期,只等待了半个 BIT 时间,这是因为如果等待了一个周期,有可能会错过下一个数据的起始位判断,最后进入“S_DATA”状态,将接收到的数据送到其他模块。
2.2 发送模块
发送模式设计和接收模块相似,也是使用状态机,状态转换图如下:
上电后进入“S_IDLE”空闲状态,如果有发送请求,进入发送起始位状态“S_START”,起始位发送完成后进入发送数据位状态“S_SEND_BYTE”,数据位发送完成后进入发送停止位状态“S_STOP”,停止位发送完成后又进入空闲状态。在数据发送模块中,从顶层模块写入的数据直接传递给寄存器‘tx_reg’,并通过‘tx_reg’寄存器模拟串口传输协议在状态机的条件转换下进行 。