tsx81428 发表于 2022-12-17 01:11:09

串口接收模块——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]
查看完整版本: 串口接收模块——verilog实现