串口通信是系统设计中比较基部分,其原理其实也很通俗易懂。单次建立通信会传输8个bit,其时序也很简单,这里就不再赘述了。其对应的实例代码如下所示;

首先是接受部分(因为我的变量命名也很规范,通俗易懂,所以我不再详细介绍):

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/03/13 12:00:48
// Design Name: 
// Module Name: uart_rx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module uart_rx(input                               clk                        ,input                               rst_n                      ,input                               uart_rxd                   ,output reg                          uart_rx_done               ,output reg         [   7: 0]        uart_rx_data                );// parameter to defineparameter                           CLK_FREQ                   = 50000000;parameter                           UART_BPS                   = 115200;localparam                          BAUD_CNT_MAX               = CLK_FREQ / UART_BPS;// reg definereg                                 uart_rxd_d0                 ;reg                                 uart_rxd_d1                 ;reg                                 uart_rxd_d2                 ;reg                                 rx_flag                     ;reg                [   3: 0]        rx_cnt                      ;reg                [  15: 0]        baud_cnt                    ;reg                [   7: 0]        rx_data_t                   ;// wire definewire                                start_en                    ;
// Main Code
// Because the sign fall from high to low, use this to catch the signal;assign                              start_en                    = uart_rxd_d2 & (~uart_rxd_d1) & (~rx_flag);// aiming to asynchronous signal processing
always @(posedge clk or negedge rst_n)
beginif (!rst_n) beginuart_rxd_d0 <= 0;uart_rxd_d1 <= 0;uart_rxd_d2 <= 0;endelse beginuart_rxd_d0 <= uart_rxd;uart_rxd_d1 <= uart_rxd_d0;uart_rxd_d2 <= uart_rxd_d1;end
end// define the rx_flag
always @(posedge clk or negedge rst_n)
beginif (!rst_n)rx_flag <= 0;else if (start_en)rx_flag <= 1'b1;else if ((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX / 2 - 1'b1))rx_flag <= 0;elserx_flag <= rx_flag;
end// Baud rate counter amplitude
always @(posedge clk or negedge rst_n)
beginif (!rst_n)baud_cnt <= 0;else if (rx_flag) beginif (baud_cnt <= BAUD_CNT_MAX - 1)baud_cnt <= baud_cnt + 1;elsebaud_cnt <= 0;endelsebaud_cnt <= 0;
end// Accept data(rx_cnt) assignment
always @(posedge clk or negedge rst_n)
beginif (!rst_n)rx_cnt <= 0;else if (rx_flag) beginif (baud_cnt == BAUD_CNT_MAX-1) beginrx_cnt <= rx_cnt + 1;endelserx_cnt <= rx_cnt;endelserx_cnt <= 0;
end// based on the rx_cnt to restore the rxd data
always @(posedge clk or negedge rst_n)
beginif (!rst_n)rx_data_t <= 0;else if (rx_flag) beginif (baud_cnt == BAUD_CNT_MAX / 2 - 1) begincase (rx_cnt)4'd1: rx_data_t[0] <= uart_rxd_d2;4'd2: rx_data_t[1] <= uart_rxd_d2;4'd3: rx_data_t[2] <= uart_rxd_d2;4'd4: rx_data_t[3] <= uart_rxd_d2;4'd5: rx_data_t[4] <= uart_rxd_d2;4'd6: rx_data_t[5] <= uart_rxd_d2;4'd7: rx_data_t[6] <= uart_rxd_d2;4'd8: rx_data_t[7] <= uart_rxd_d2;default: ;endcaseendelserx_data_t <= rx_data_t;endelserx_data_t <= 0;
end// assignment the data received
always @(posedge clk or negedge rst_n)
beginif (!rst_n) beginuart_rx_done <= 0;uart_rx_data <= 0;endelse if (rx_cnt == 4'd9 && baud_cnt == BAUD_CNT_MAX / 2 - 1) beginuart_rx_done <= 1;uart_rx_data <= rx_data_t;endelse beginuart_rx_done <= 0;uart_rx_data <= uart_rx_data;end
endendmodule

然后是发送部分:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/03/13 17:14:19
// Design Name: 
// Module Name: uart_tx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module uart_tx(input                               clk                        ,input                               rst_n                      ,input                               uart_tx_en                 ,input              [   7: 0]        uart_tx_data               ,output reg                          uart_txd                   ,output reg                          uart_tx_busy                );// parameter defineparameter                           CLK_FREQ                   = 50000000;parameter                           UART_BPS                   = 115200;localparam                          BAUD_CNT_MAX               = CLK_FREQ/UART_BPS;// reg definereg                [   7: 0]        tx_data_t                   ;reg                [   3: 0]        tx_cnt                      ;reg                [  15: 0]        baud_cnt                    ;// Main Code
always @(posedge clk or negedge rst_n)beginif(!rst_n)     begintx_data_t<=0;uart_tx_busy<=0;endelse if(uart_tx_en)        begintx_data_t<=uart_tx_data;uart_tx_busy<=1;endelse if(tx_cnt==4'd9&&baud_cnt==BAUD_CNT_MAX-1) begintx_data_t<=0;uart_tx_busy<=0;endelse begintx_data_t<=tx_data_t;uart_tx_busy<=uart_tx_busy;endend// Baud counter
always @(posedge clk or negedge rst_n)beginif(!rst_n)baud_cnt<=0;else if(uart_tx_en)baud_cnt<=0;else if(uart_tx_busy) beginif(baud_cnt<BAUD_CNT_MAX-1)baud_cnt<=baud_cnt+1;elsebaud_cnt<=0;endelsebaud_cnt<=0;end// assign the tx_cnt
always @(posedge clk or negedge rst_n)beginif(!rst_n)tx_cnt<=0;else if(uart_tx_busy) beginif(baud_cnt==BAUD_CNT_MAX-1)tx_cnt<=tx_cnt+1;elsetx_cnt<=tx_cnt;endelsetx_cnt<=0;endalways @(posedge clk or negedge rst_n)beginif(!rst_n)uart_txd<=1;else if(uart_tx_busy) begincase(tx_cnt)4'd0: uart_txd<=1'b0;4'd1: uart_txd<=tx_data_t[0];4'd2: uart_txd<=tx_data_t[1];4'd3: uart_txd<=tx_data_t[2];4'd4: uart_txd<=tx_data_t[3];4'd5: uart_txd<=tx_data_t[4];4'd6: uart_txd<=tx_data_t[5];4'd7: uart_txd<=tx_data_t[6];4'd8: uart_txd<=tx_data_t[7];4'd9: uart_txd<=1;default: uart_txd<=1;endcaseendelseuart_txd<=1'b1;endendmodule

参考文献:

达芬奇之 FPGA 开发指南  V2.2  -正点原子 达芬奇开发板教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87551.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87551.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87551.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言安装教程(Windows 系统)

2025年07月02日 准备工作 确认系统为 Windows 7 及以上版本&#xff08;推荐 Windows 10/11&#xff09;。64 位系统选择 amd64 版本安装包&#xff0c;32 位系统选择 386 版本。确保安装目录&#xff08;默认 C:\Program Files\Go\&#xff09;有至少 1GB 空间。 下载安装包…

接口测试之postman

一、Postman功能简介 3天精通Postman接口测试&#xff0c;全套项目实战教程&#xff01;&#xff01; Postman是由Postdot Technologies公司打造的一款功能强大的调试HTTP接口的工具。在做接口测试的时候&#xff0c;Postman相当于一个客户端&#xff0c;它可以模拟用户发起的各…

【记录】Ubuntu安装Mysql

本文记录Ubuntu系统下安装Mysql 1 查看系统信息 lsb_release -a 2 使用apt下载安装Mysql 1 打开终端,首先更新你的系统包索引,以确保所有包都是最新的 sudo apt update 2 安装mysql服务器 sudo apt install mysql-server (也可以选择对应的mysql-server 版本) 3 查看mysql状…

【深度学习:进阶篇】--4.1.循环神经网络(改进)

RNN存在的问题&#xff1a;梯度爆炸&#xff0c;长期依赖参数量过大等问题 目录 1.GRU(门控循环单元) 1.1.什么是GRU 1.2.直观理解 1.3.本质解决问题 2.LSTM(长短记忆网络) 2.1.作用 3.结构扩展与效率优化​ 1.GRU(门控循环单元) 2014年&#xff0c;出现的算法&#x…

中心化钱包安全方案

先来看独立的密钥安全技术 1 自建或单租户 CloudHSM 优点&#xff1a;密钥永不出硬件&#xff0c;无法导出&#xff0c;只能对外提供公钥。 交易时&#xff0c;外部应用把消息哈希传进去签名&#xff0c;再把签好名的结果拿出来用。 这种方式安全性拉满&#xff0c;但成本高、…

Android 实现底部弹窗

文章目录在 Android 中创建优雅的底部选项弹窗 (BottomSheetDialogFragment) &#x1f4f1;第一步&#xff1a;设计底部弹窗的布局 &#x1f3a8;第二步&#xff1a;创建 BottomSheetDialogFragment 类 ⚙️第三步&#xff1a;触发并显示底部弹窗 &#x1f680;在 Android 中创…

LAN8720 寄存器概览和STM32 HAL库读写测试

目录 寄存器0x00:Basic Control Register&#xff08;BCR&#xff09;0x01:Basic Status Register&#xff08;BSR&#xff09; 连接测试寄存器读写测试 补充 寄存器 // 0x00:Basic Control Register&#xff08;BCR&#xff09; BIT15:Soft Reset 写1复位&#xff0c;写1之…

渗透测试深度分析:空密码Administrator账户引发的安全风暴

渗透测试深度分析&#xff1a;空密码Administrator账户引发的安全风暴0x01 测试背景 在内网渗透测试中&#xff0c;对Windows主机 192.168.1.98 使用 enum4linux 进行枚举&#xff1a; enum4linux -u Administrator -p -a 192.168.1.98关键发现&#xff1a;Administrator账户空…

OpenCV CUDA模块设备层-----高效地计算两个 uint 类型值的带权重平均值

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cudev&#xff09; 中的一个设备端内联函数&#xff0c;用于高效地计算两个 uint 类型值的带权重平均值。 该函…

[学习记录]Unity毛发渲染[URP]-Shell基础版

毛发&#xff0c;无论是人类的头发、动物的皮毛&#xff0c;还是奇幻生物的绒毛&#xff0c;都是构成生命感和真实感不可或缺的元素。它对光线的独特散射、吸收和反射&#xff0c;赋予了物体柔软、蓬松、有生命力的质感。它不仅仅是让角色看起来更“毛茸茸”那么简单&#xff0…

数字孪生技术引领UI前端设计潮流:增强现实(AR)的集成应用

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;AR 与数字孪生融合的设计革新浪潮在体验经济与技术融合的双重驱动下&…

碰一碰发视频源码搭建与定制化开发:支持OEM

在近场通信&#xff08;NFC&#xff09;技术与移动终端深度融合的背景下&#xff0c;“碰一碰发视频” 功能凭借便捷的交互体验&#xff0c;在商业推广、信息传递等场景中快速落地。不同于标准化解决方案的黑盒模式&#xff0c;基于源码的定制化开发能从底层优化传输效率、提升…

Ubuntu 24.04 安装配置 Redis 7.0 开机自启

下载源码 wget https://download.redis.io/releases/redis-7.0.12.tar.gz安装依赖 & 准备环境 sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential tcl curl解压 tar xzf redis-7.0.12.tar.gz编译安装 cd redis-7.0.12 make -j$(nproc) …

【Linux 系统】基础IO——Linux中对文件的理解

13.基础IO(1) 文章目录13.基础IO(1)文件的基本概念&#xff1a;内容与属性文件的打开机制&#xff1a;fopen 和 open被打开的文件与磁盘文件的区别文件的内核数据结构文件与进程的交互方式标准输入/输出/错误与文件流系统调用与文件描述符文件打开模式&#xff08;r/w/a/a&…

Go调度器的抢占机制:从协作式到异步抢占的演进之路|Go语言进阶(7)

想象一下这样的场景&#xff1a;你在餐厅排队等位&#xff0c;前面有个人点了餐却一直霸占着座位玩手机&#xff0c;后面的人只能干等着。这就是Go早期版本面临的问题——一个goroutine如果不主动让出CPU&#xff0c;其他goroutine就只能饿着。 今天我们来聊聊Go调度器是如何解…

开源模型应用落地-让AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j与Streamlit的创新实践(四)

一、前言 在人工智能迅速发展的今天,如何让AI系统更懂“你”?答案或许藏在个性化的记忆管理之中。Mem0作为一个开源的记忆管理系统,正致力于为AI赋予长期记忆与个性化服务能力。通过结合高性能向量数据库Qdrant、图数据库Neo4j的强大关系分析能力以及Streamlit的高效可视化交…

基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot

school-market 介绍 基于微信小程序的校园二手交易平台 功能结构图 软件架构 系统分为三个端&#xff0c;分别是客户端、管理端、服务端&#xff1b; 客户端&#xff1a;使用原生微信小程序实现 管理端&#xff1a;使用Layui实现 服务端&#xff1a;使用Java SpringBoot…

IDEA与Gradle构建冲突,导致java重复类的解决方案

项目构建总是报错&#xff1a;错误提示1&#xff1a;java:重复类或错误提示2&#xff1a;Internal error in the mapping processor: java.lang.RuntimeException: javax.annotation.processing.FilerException: Attempt to recreate a file排查发现build/generated/sources/an…

如何调节笔记本电脑亮度?其实有很多种方式可以调整亮度

长时间面对屏幕工作、学习或娱乐&#xff0c;很多人会感到眼睛干涩、疲劳&#xff0c;甚至出现视力下降等问题。其实&#xff0c;这些问题的背后&#xff0c;往往隐藏着一个看似简单却极易被忽视的设置—屏幕亮度。 合适的屏幕亮度不仅能提升视觉体验&#xff0c;还能有效缓解…

国际数字影像产业园创作空间升级 打造更优质营商环境

国际数字影像产业园创作空间升级后表现显著&#xff0c;聚焦设施数字化与用户体验优化。整体提升了创意生态系统的竞争力&#xff0c;有效吸引全球企业。 升级核心改进 基础设施现代化&#xff1a;引入智能硬件如5G网络和云渲染设备&#xff0c;支持高清影像处理&#xff0c;…