注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
凔海的个人空间
https://home.eeworld.com.cn/space-uid-641902.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
凔海笔记之FPGA(八):Verilog描述RS232 UART
已有 2022 次阅读
2016-5-17 00:03
借做项目催着急的由头给了自己一个多月不发帖的借口,现在我又来冒泡了。
在我看来,有些代码会用,但未必理解,有些代码理解,但未必会写,有些代码会写,但未必能用自己的话说出来。当能够以自己的想法深入浅出的讲解所学知识,那也就可以说自己掌握了,所以,我还是来发帖吧。
记得刚用单片机学习串口通讯的时候,我以为串口通讯=uart=RS232。o(╯□╰)o
直到最近我才明白
串口通讯(Serial Communication):是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式,就是一类通讯方式。
UART(Universal Asynchronous Receiver and Transmitter):通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。
RS232:COM口是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。
这里所说的串口通讯,准确的说,应该是RS232 UART串口通讯,说白了,它就是一种数据传输的方式,一次能发送或接收一串数据。
首先,我们要了解下这个协议。
RS232 UART串口通讯就是将传输数据的每个字符一位接一位地按照一定时间间隔传输,这个数据是被包装起来的,首先,由起始位(0)+八位数据+奇偶校验+停止位构成。
那个一定的时间间隔称之为波特率,波特率就是发送一位所用的时间,在发送的时候,每一位的发送都是在这个时间段内的。
如果波特率为9600,也就是每秒发送9600个数据,这样的话发送一个数据的时间就是1÷9600=0.0001041667s=104166ns我们晶振是50MHZ,则始终周期是20ns,所以奇数个数为104166÷20=5208.所以,当我们在计数5208过程中要完成一位数据的传输,但为了保险起见,我们在这个数的中间进行传输,也就是2604时一位发送数据。
起始位:顾名思义,就是开始发送数据的标志位。当我们检测到X电平时,则是起始位,然后就可以发送八位数据了。
奇偶校验:如果发生的数据为计数,则置1,否则为0,但这并不能精准的检测是否发送正确,所以,既不能精准,便是无用,置一置零看你心情了,
停止位:如果为高电平,则发送数据完成且正确,反之,你懂得。
通过Verilog描述RS232的串口通讯,那怎么描述嘞,这就需要我们写写画画了。首先,要产生波特率,如果我们用9600bps,也就是以每104166ns发送一个字节的方式把11个数据发送给PC机,然后通过串口助手接收发来的数据。其实就是来个分频模块,其次要实现数据的发送,就是发送数据,那发送的数据从哪来呢,所以再来个数据源模块,它来控制数据的发送。综上,我们要建立三个模块分别完成波特率的产生,数据的发送,还有控制它们的工作。
波特率的产生模块命名为pbs_module.v
数据发送命名为tx_module
控制数据的发送命名为ctrl_module
首先,先描述三个模块的沟通吧
pbs_module.v“生产”9600波特率,每计数5 208完成一个数据的发送,但是,为了保险起见,我们再计数到2604就发送一个数据。所以assign pbs_ctrl_sig = (pbs_cnt == pbs_half) ? 1'b1 : 1'b0;当pbs_ctrl_sig=1则开始数据的发送
例如:
发送起始位:
4'd0:
if(pbs_ctrl_sig)
begin
tx <= 1'b0;
i <= i + 1'b1;
end
但是,不能说pbs_ctrl_sig=1我们就发送数据,那样的话容易乱套,所以我们还需要start_sig信号tx_module.v模块和pbs_module.v模块同时干活,注意是同时干活,这样保证了不会出错。
当数据发送完后,再来个完成信号告诉ctrl_module活干完了,这样,该模块就会不让波特率计数,更不让数据发送
else if(ctrl_sig)
begin
start <= 1'b0;
t_data <= 8'h32;
end
歇息1s再干活。
else if(cnt == T1S)
start <= 1'b1;
上面所说的是数据的发送,那么接收呢?也是类似的。先发送起始位,也就是0,接着接收八位数据,最后是奇偶校验位和停止位。所以了,先检测到低电平是否产生,然后在接收数据。
对于起始位的检测采用边沿检测法,在闲暇时,它一直都是高电平,当检测到低电平后又检测到高电平,这说明起始位来了,所以,要检测到低电平而后又转为高电平,就是起始位。
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
begin_sig_1 <= 1'b1;
begin_sig_2 <= 1'b1;
end
else
begin
begin_sig_1 <= rx_pin;
begin_sig_2 <= begin_sig_1;
end
assign rx_begin = begin_sig_2 & ~begin_sig_1;
起始位的检测,使产生bps的模块开始工作,当
assign pbs_ctrl_sig = (pbs_cnt == pbs_half) ? 1'b1 : 1'b0;
为1的时候,采集一位数据,
4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:
if(pbs_ctrl_sig)
begin
rx_data[i-2] <= rx_pin;
i <= i + 1'b1;
end
同样,低位在前,高位在后。
至于奇偶校验位和停止位,咱就这样对待吧,没啥用呀。
4'd10:
if(pbs_ctrl_sig)
i <= i + 1'b1;
4'd11:
if(pbs_ctrl_sig)
begin
i <= 4'b0;
ctrl <= 1'b0;
end
最后,有没有发现,我们发送方式是
起始位(0)+八位数据+奇偶校验+停止位
接收方式还是
起始位(0)+八位数据+奇偶校验+停止位
先发送给PC机的,PC机就先发送给下位机,也就是先进来的现出去。这个就是FIFO。做项目的时候总是用到这玩意。
学识浅薄出拙文,如察错误望赐教,小弟在此感涕零。
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
全部
作者的其他最新日志
•
凔海笔记之FPGA(十一):SDRAM(づ。◕‿‿◕。)づ
•
凔海笔记之FPGA(九):玩一玩DS1302
•
凔海笔记之FPGA(十):Verilog描述IIC单字节读写协议
•
凔海笔记之FPGA(七):触发器和锁存器
•
凔海笔记之FPGA(六):二进制的加法番外篇
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
凔海
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
神州数码:未与华为就荣耀出售一事达成任何协议
三分钟,带您了解尖端电源技术Nano系列
英特尔“用”上了RISC-V
紫光国微发布2019年业绩报告,营收利润双创新高
数十家芯片厂,用上了台积电3nm?
比亚迪称王,多亏特斯拉?
新增数据手册
SM1040DS1
MAL213825479E3
KFPC050X-R3-7T
BF060-18-I-B-0250-0250-0250-L-G
R66ED3150AA7-J
SIP-U4769-03-3321-Q-Q-5
热搜器件
HSC12DRYN-S93
CDR03BX153BKUSAB
SZ1SMB22AT3G
7105J64ZQE1
RC0201FR-07240KP
8821
推荐下载
0347、使用PWM得到精密的输出电压.rar
ZigBee-Specification-2007.rar
电子元器件检测与维修完全学习手册
[资料]-JIS C6122-1-3-2011 光増幅器-測定方法-第1-3部:パワーパラメータ及び利得パラ.pdf
三角波振荡器一些介绍
华为-通信电源技术基础.pdf
推荐关注
《Linux内核深度解析》-- 中断控制器注册逻辑
减速机速比对照表相关内容
ESP-NOW WIFI 收发不稳定问题
Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示
瑞芯微开发板/主板Android配置APK默认开启性能模式方法
linux系统串口终端软件显示异常解决方法,触觉智能出品