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, /

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

被折叠的 条评论
为什么被折叠?



