当前位置: 首页 > news >正文

FPGA即插即用Verilog驱动系列——UART串口接收

实现功能:

  1. FPGA实现串口接收,波特率可修改
  2. 按字节接收,有完成标志位输出
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
//
//                      模块 1: UART 字节接收器 (修正版)
//
// 文件名: Uart_Rec.v
// 描述:
//   - 用户提供的UART接收模块。
//   - **FIXED**: 将系统时钟参数 CLK_FREQ 修改为 50MHz,以匹配顶层设计,
//     确保波特率计算正确。
//
//////////////////////////////////////////////////////////////////////////////////
module Uart_Rec(input                 sys_clk,     //系统时钟input                 sys_rst_n,   //系统复位,低电平有效input                 uart_rxd,    //UART接收端口output reg            uart_done,   //接收一帧数据完成标志output reg [7:0]      uart_data    //接收的数据
);//parameter defineparameter  CLK_FREQ = 50000000; // **FIXED**: 系统时钟频率为50MHzparameter  UART_BPS = 115200;   // 串口波特率localparam BPS_CNT  = CLK_FREQ/UART_BPS; // 计算每个比特位的时钟周期数//reg definereg        uart_rxd_d0;reg        uart_rxd_d1;reg [15:0] clk_cnt;reg [3:0]  rx_cnt;reg [7:0]  rxdata;reg        rx_flag;//wire definewire       start_flag;assign start_flag = uart_rxd_d1 & (~uart_rxd_d0);always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n) beginuart_rxd_d0 <= 1'b1;uart_rxd_d1 <= 1'b1;endelse beginuart_rxd_d0 <= uart_rxd;uart_rxd_d1 <= uart_rxd_d0;endendalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)rx_flag <= 1'b0;else beginif(start_flag)rx_flag <= 1'b1;else if((rx_cnt == 4'd9) && (clk_cnt == BPS_CNT/2))rx_flag <= 1'b0;endendalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)clk_cnt <= 16'd0;else if (rx_flag) beginif (clk_cnt < BPS_CNT - 1)clk_cnt <= clk_cnt + 1'b1;elseclk_cnt <= 16'd0;endelseclk_cnt <= 16'd0;endalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)rx_cnt  <= 4'd0;else if (rx_flag) beginif (clk_cnt == BPS_CNT - 1)rx_cnt <= rx_cnt + 1'b1;endelserx_cnt  <= 4'd0;endalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)rxdata <= 8'd0;else if(rx_flag)if (clk_cnt == BPS_CNT/2) begincase (rx_cnt)4'd1 : rxdata[0] <= uart_rxd_d1;4'd2 : rxdata[1] <= uart_rxd_d1;4'd3 : rxdata[2] <= uart_rxd_d1;4'd4 : rxdata[3] <= uart_rxd_d1;4'd5 : rxdata[4] <= uart_rxd_d1;4'd6 : rxdata[5] <= uart_rxd_d1;4'd7 : rxdata[6] <= uart_rxd_d1;4'd8 : rxdata[7] <= uart_rxd_d1;default:;endcaseendendalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n) beginuart_data <= 8'd0;uart_done <= 1'b0;endelse if(rx_cnt == 4'd9 && clk_cnt == BPS_CNT/2) beginuart_data <= rxdata;uart_done <= 1'b1;endelse beginuart_done <= 1'b0;endend
endmodule

http://www.dtcms.com/a/328180.html

相关文章:

  • 医疗智慧大屏系统 - Flask + Vue实现
  • nextTick和setTimeout的区别
  • Docker概述与安装Dockerfile文件
  • k8s-scheduler 解析
  • 1小时 MySQL 数据库基础速通
  • log4cplus的功能是什么,我们如何来使用它?
  • 调整UOS在VMware中的分辨率
  • Linux系统启动过程详解
  • CTO 如何从“干活的人”转变成“带方向的人”?
  • 需求沟通会议如何组织
  • 云手机在电商行业中的作用
  • 知名车企门户漏洞或致攻击者远程解锁汽车并窃取数据
  • C++ 学习与 CLion 使用:(二)using namespace std 语句详解,以及 std 空间的标识符罗列
  • 消防安全预警系统助力安全生产
  • 【工作笔记】win11系统docker desktop配置国内mirror不生效解决方案汇总整理
  • `SHOW PROCESSLIST;` 返回列详解(含义 + 单位)
  • django celery 动态添加定时任务后不生效问题
  • 【SDR课堂第35讲】通用软件无线电平台USRP7440- RFSOC NCO性能测试(一)
  • android 换肤框架详解3-自动换肤原理梳理
  • JDK 9~17 新特性及升级建议
  • 【154页PPT】某大型再生资源集团管控企业数字化转型SAP解决方案(附下载方式)
  • 麒麟信安“操作系统+云”双驱动,推进某市公安局智慧警务建设
  • 云部署 MCP 服务计费
  • Java 包
  • 飞算JavaAI:Java智能开发工具的技术解析、应用实践
  • 燕山大学计算机网络实验(2025最新)
  • Python科学计算与可视化领域工具TVTK、Mayavi、Mlab、Traits(附视频教程)
  • 【AI】Pycharm中要注意Python程序文件的位置
  • 【C#】正则表达式
  • Lyapunov与SAC算法的数学结构对比:从二次漂移到TD损失