硬件需求
带有CH340的FPAG开发板文章来源:https://www.toymoban.com/news/detail-434383.html
接收模块
该模块的功能是接收通过 PC 机上的串口调试助手发送的固定波特率的数据,串口接收模块按照串口的协议准确接收串行数据,解析提取有用数据后需将其转化为并行数据;简单的说,接收模块的功能就是解析+串转并;
具体实现步骤如下:
1、算出波特率和FPGA时钟的对应关系
每个码元的持续时间=FPGA时钟计数Fclk/Baud次
例如波特率为9600,代表着每秒传输9600个码元,每个码元的持续时间为1/9600秒,设FPGA时钟为50MHz,则需要计数约5028次(细微的近似计数差别不会产生数据错误)。
2、产生读取数据标志
在1的例子中,每个码元都持续了5028个时钟周期,那我们该什么时候取数据呢?理论上讲,在中间位置时取数最稳定,所以我们选择当计数器计数到 2603时取数据。
3、串并转换
串口发送的每一帧包含了10bit数据,其中第一个码元是开始位,最后一个码元是停止位,第2位到第9位的数据为有效数据。我们取出中间的8位有效数据转换为并行数据即可。
4、串口状态的确定
我们可以设置一个使能信号。当串口处于空闲状态时,数据线为高电平,当起始位到来时变为低电平,我们只要找到第一个下降沿就认为串口开始进行数据传输。此时拉高使能信号,等待10bit数据传输完成,再将使能信号拉低,等待下一个下降沿的到来。因此可以通过设置使能信号来确定串口状态,当使能信号为高时串口在传输数据,使能信号为低时串口处于空闲状态。文章来源地址https://www.toymoban.com/news/detail-434383.html
module usart232_rx(
input wire sys_clk,
input wire sys_rst,
input wire data_in_1bit,
output reg [7:0] po_data,
output reg po_flag
);
parameter BOUND_CNT_MAX = 13'd5208;//波特率9600,时钟频率50MHz
reg reg1;
reg reg2;
reg reg3;
reg [7:0]data_out;
reg [12:0] bound_cnt;//波特率计数器
reg start_flag;//开始标志(下降沿标志)
reg enable;//使能信号
reg bit_flag;//读取数据标志
reg [3:0] bit_cnt;//用于计数该时刻接收的数据是第几个比特的计数器
reg data_out_flag;//串并转换完成标志
//时钟同步数据
always@(posedge sys_clk or negedge sys_rst)
if (sys_rst==0)
reg1<=1;
else
reg1<=data_in_1bit;
//打一拍,减少出现亚稳态的概率
always@(posedge sys_clk or negedge sys_rst)
if (sys_rst==0)
reg2<=1;
else
reg2<=reg1;
//再打一拍,再次减少出现亚稳态的概率
always@(posedge sys_clk or negedge sys_rst)
if (sys_rst==0)
reg3<=1;
else
reg3<=reg2;
//时钟计数
always@(posedge sys_clk or negedge sys_rst)
if (sys_rst==0)
bound_cnt<=0;
else if (bound_cnt==BOUND_CNT_MAX-1'b1||enable==0)
bound_cnt<=
到了这里,关于FPGA实现串口通信(RS232)含代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!