FPGA串口收发(二):串口接收 - 源代码与仿真测试

本文详细介绍了一种基于FPGA的串口接收模块设计,包括源代码与仿真测试过程。设计采用三段式状态机接收8位数据,适用于115200波特率,通过仿真验证了串行数据1101_1000转换为并行数据的正确性。

FPGA串口收发(二):串口接收 - 源代码与仿真测试

串行接收数据 1101_1000 ,转换为并行数据, 并显示 D8。

时钟40MHz,波特率115200

1、源文件

uart_rx.v

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Myminieye
// Engineer: Nill
//
// Create Date:  2020-05-29
// Design Name:
// Module Name:  uart_rx
// Project Name:
// Target Devices:
// Tool Versions:
// Description: 串口接收
// 三段式状态机,接收8位数据。波特率指定 115200
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////
/////////////////////
///
`define UD #1

module uart_rx #(
   parameter   BPS_NUM =  16'd347  // 时钟/波特率,用时钟周期构造波特率周期
   	//  BPS_NUM = 40_000_000/115200 = 347.22 = 16'd347
    //  1 bit位宽所需时钟周期的个数。最长的波特率计数,10417,二进制有14位,取16位
	//  parameter BPS_4800: 40MHz set 8333 ; 50MHz set 10417  
	//  parameter BPS_9600: 40MHz set 4167 ; 50MHz set 5208  
	//  parameter BPS_115200: 40MHz set 347; 50MHz set 434    
)
(
    //input ports
    input clk,
    //input rst_n,             //没用上
    input uart_rx,        //接收模块串口接收信号线

    //output ports
    output reg [7:0] rx_data = 8'h00,
    output reg rx_finish = 1'b0     	//串口接收数据有效,接收完成拉高1个BPS
    //output rx_end   				    //接收到停止位,拉高1个clk,没啥用
);

//==========================================================================
//wire and reg 定义:信号与参数
//==========================================================================

    localparam  [15:0] BPS_NUM_MID = (BPS_NUM + 2'd1) / 2'd2 - 2'd1; //波特率周期的中间点
	
    reg [3:0] rx_cur_st = 0;    //current state of rx state machine.
    reg [3:0] rx_nxt_st = 0;    //next state of rx state machine.

    reg       uart_rx_1d;       //保存uart_rx数据 1个时钟周期
    reg       uart_rx_2d;       //保存uart_rx 前2个时钟周期

    wire      rx_start;         //检测到start信号标志

    reg [15:0] clk_div_cnt = 0; //波特周期计数,计到一个波特周期
    reg [2:0]  rx_bit_cnt = 0;  //接收数据位bit计数

    reg [7:0] rx_data_reg = 8'h00;      //接收数据缓冲寄存器

    //=================================================
    // FSM Statement:状态声明
    // 发送状态机4个状态:等待、发送起始位、发送数据、发送结束
    //=================================================
    //one hot with zero idle
    localparam  [3:0] IDLE     = 4'b0000, //空闲状态,等待开始信号到来
                RECEIVE_START  = 4'b0001, //接收Uart开始信号,低电平一个波特周期.
                RECEIVE_DATA   = 4'b0010, //接收Uart传输数据信号,传输8bit,每个波特周期中间位置取值,8个周期后跳转到stop状态.
                RECEIVE_STOP   = 4'b0100, /
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值