系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
书接上回,上回完成了modelsim仿真,这次进行串口的学习。我也是一边查CSDN一边写代码,慢慢学习。
这个链接中有对串口原理的详细说明。
串口通信其实就是两根线上面的电平变化,从而实现通信的目的。本文主要针对串口发送开展工作。
一、串口
借用@Crazzy_M老哥的一张图片,如图所示,以115200的波特率为例。波特率表示1s的时间内传输的数据量,115200baud表示1s传输115200个bit,相当于每个bit需要用时8.68us,下图红色矩形框框出来的就是一个bit。那么如何准确定时8.68us呢?开发板上有源时钟频率为50MHz,即,1s计数50x106次,每次20ns,则8.68us需要计数434次。
其次,串口每个帧传输8bit数据,数据前面有一个起始位,数据后有一个停止位。起始位就是把信号线保持在低电平的位置,停止位就是将信号线保持在高电平位置。想来想去,好像也没有其他东西了。
二、需求
由于只是实现简单串口发送功能,所以内容也就不太多。现在对代码块进行分析。
/*******************计数********************/
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_bps_clk<=1'd0;
else if(cnt_bps_clk>=BPS_115200-1)
cnt_bps_clk<=1'd0;
else
cnt_bps_clk<=cnt_bps_clk+1'd1;
end
上面这段代码实现计数功能,BPS_115200数值为434,这也就可以知道这段代码就是要计数434次,其作用后面还会用上。
/******************串口帧计数*********************/
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps_cnt<=3'd0;
else if(bps_cnt==4'd10)
bps_cnt=3'd0;