串口接收模块——verilog实现
1、设计想法原理与之前的串口发送模块一样,1位的数据位和8位的数据位再加上1位的停止位。唯一不同的是在接收的时候要考虑到有干扰的情况下,为了避免干扰,我们对每位数据进行多次采样,按出现概率大的值为该数据位的值。
https://img2023.cnblogs.com/blog/2968697/202212/2968697-20221217003408693-513704446.png
如果按照通常想法在每bits位中间取值的话,bit3位出现图中的干扰很有可能会读出错误的值。所以需要对每位进行多次抽样进行判断。
https://img2023.cnblogs.com/blog/2968697/202212/2968697-20221217005533346-1449131581.png
每位要抽8次的话,那需要将每个波特段分成9等分。
2、状态机设定
https://img2023.cnblogs.com/blog/2968697/202212/2968697-20221217004743679-274583589.png
3、模块代码
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: Lclone// // Create Date: 2022/12/16 15:37:44// Design Name: uart_byte_rx// Module Name: uart_byte_rx// Project Name: uart_byte_rx// Target Devices: // Tool Versions: // Description: 8位串口发送模块// // Dependencies: // // Revision:// Revision 0.01 - File Created// Additional Comments:// //////////////////////////////////////////////////////////////////////////////////module uart_byte_rx# ( parameter RX_BAUD= 9600, //波特率 parameter CLK_FQC= 50_000_000, //模块时钟频率 parameter BAUD_CNT = CLK_FQC/RX_BAUD) //模块每波特需要计数的次数(设置此端口方便仿真用) ( input Clk, //时钟频率接口 input Rst_n, //复位接口 input Uart_rx, //串口接收接口 outputregData //接收到的数据接口 ); reg uart_rx_r; //延一拍 reg uart_rx_rr; //延两拍 reg receiv_begin; //接收开始信号 reg receiv_flag; //接收状态信号 reg [ 3:0] state; //状态机寄存器 reg baud_cnt; //波及计数器 reg [ 3:0] sampel_cnt; //采样计数器 reg sampel_en; //采样使能 reg sampel_ref; //样本寄存器 reg [ 3:0] acc; //累加寄存器 reg [ 3:0] bit_cnt; //数据位寄存器 always @(posedge Clk) begin //下降沿捕获 uart_rx_r
页:
[1]