一、要点
参考上一篇发送模块https://blog.csdn.net/a1254484594/article/details/100190162
二、实现
1.架构:使用有限状态机实现,主要包含两部分:数据采样、状态转移。
数据采样一般在每个数据位的中间采样,因为此时离上升沿或下降沿最远。
状态机可定义11个状态,对应到一帧数据中,依照时间顺序为:WAIT等待起始位状态,STARD起始位,D0、D1、D2、D3、 D4、D5、D6、D7 8bit数据,END停止位。使用一个计数器,定时一定波特率下每bit所需要的时间,在各状态间进行转移。
2.新建一个uart_rx.v文件,使用Verilog语言进行描述
`timescale 1ns/1ps
module uart_rx(
input clk,
input nrst,
input rx_en,
input rx_pin,
output reg [7:0]rx_data,
output reg rx_done
);
parameter INPUT_CLK = 125000000 , BUDO = 115200;
localparam B_CNT_MAX = (INPUT_CLK/BUDO)-1;//波特率计数器最大值
parameter [3:0]
WAIT = 4'd12, //等待起始位状态
STARD= 4'd13, //起始位
END = 4'd8, //停止位
D0 = 0, D1 = 1, D2 = 2, D3 &#