96SEO 2026-02-19 18:46 0
本篇博客的实验内容是实现uart串口通信发送数据和接收数据并加入按键模块调整波特率数码管模块显示波特率实现不同波特率下的PC端与FPGA板子的数据回环并加入FIFO

IP核对数据进行缓存当数据大于等于8个的时候一次性发送8个数据出去。
Receiver/Transmitter)是一种串行、异步、全双工的通信协议。
特点是通信线路简单适用于远距离通信但传输速度慢。
它在发送数据时将并行数据转换成串行数据来传输在接收数据时将接收到的串行数据转换成并行数据。
注意它在空闲状态下为高电平起始位为低电平停止位为高电平。
它的数据位甚至可以为5位或者4位但是不能为9位及以上。
因为它的空闲位为高电平必须有一个由高到低的下降沿变化才能知道后面要传输数据了不然如果起始位为高电平那它怎么知道你何时传数据呢
它的数据位传输顺序可以采用MSB也可以采用LSB由通信双方决定。
奇校验当实际数据中“1”的个数为奇数的时候这个校验位就是“0”否则这个校验位就是“1”
偶校验当实际数据中“1”的个数为偶数的时候这个校验位就是“0”否则这个校验位就是“1”。
注意奇偶校验只能检验奇数个数据的错误对于偶数个数据的错误无法检测。
UART的数据传输速率用波特率baud表示常见的波特率有9600、19200、38400、57600、115200最常用的是9600和115200。
通信双方必须保持一致的波特率不然数据就会出错这个在最后我们的上板验证会体现。
以9600为例它代表我们传输1bit数据所需要的时间是1/9600104160ns我们的时钟周期为20ns所以传输1bit数据需要104160/20
波特率在电子通信领域波特Baud即调制速率指的是有效数据信号调制载波的速率即单位时间内载波调制状态变化的次数。
它是对符号传输速率的一种度量1波特即指每秒传输1个符号而通过不同的调制方式可以在一个码元符号上负载多个bit位信息。
在信息传输通道中携带数据信息的信号单元叫码元每秒钟通过信道传输的码元数称为码元传输速率简称波特率。
波特率是传输通道频宽的指标。
该系统分为了6个模块分别是按键消抖模块(fsm_key)、波特率设置模块(baud)、数码管显示模块sel_seg、接收模块(uart_rx)、FIFO数据缓存模块(fifo)以及发送模块(uart_tx)。
首先是通过按键调整波特率输入的按键信号进入按键消抖模块然后将消抖后的按键信号传给波特率设置模块通过按键信号可以设置不同的波特率有常用的波特率选择9600、19200、38400、57600、115200。
默认情况下是9600。
然后把设置好的波特率传给数码管显示模块进行波特率的显示。
同时将设置好的波特率传给接收和发送模块两个模块的波特率应该保持一致。
同时接收模块接收了外界传入的串行数据后将串行数据转成并行数据传给FIFO模块进行数据缓存当FIFO里面缓存的数据大于等于8个数据时FIFO模块将开启数据发送使能信号然后把读取到的一个数据传给发送模块然后发送模块再把并行数据转成串行数据一个一个的发送出去。
每发送完一个数据后都拉高一个数据发送完成的使能信号传给FIFO模块FIFO在根据这个使能信号再读一个数据传给发送模块进行数据发送重复该步骤直到发送出8个数据为止。
podge;//上升沿//第一段状态机时序逻辑描述状态空间的切换always
state_n;endend//第二段状态机组合逻辑描述状态转移条件always
(state_c)IDLE:beginif(nedge)begin
state_c;endendDOWN:beginif(podge)begin
1b0)begin//计时结束并且没有出现上升沿就证明是一个有效按下进入下一个状态state_n
state_c;endendHOLD:beginif(podge)begin//出现上升沿进入释放抖动状态state_n
:beginif(end_cnt_20ms)begin//延时结束进入空闲状态state_n
state_c;endcaseend//第三段状态机组合时序都可以描述输出always
{KEY_NUM{1b0}};endend//打拍寄存always
if(add_cnt_20ms)beginif(end_cnt_20ms)begincnt_20ms
cnt;//设置波特率的计数器0为9600,1为19200,2为38400,3为57600,4为115200always
if(add_cnt_20us)beginif(end_cnt_20us)begincnt_20us
CNT_20US;//位选信号控制每20us刷新一次always
1b0;endend//当可度量达到标志时第一次读取数据使能信号always
7d8)begin//空闲状态时检测剩余可读量达到标志flag
if(add_cnt_tx)beginif(end_cnt_tx
if(add_baud)beginif(end_baud)begincnt_baud
1d1;//根据波特率求得传输1bit所需要的时钟周期//比特计数器always
if(add_bit)beginif(end_bit)begincnt_bit
4d9;//一个数据有1bit起始位8bit数据位1bit结束位//同步打拍检测下降沿always
rx_din_r1;//同步打拍检测到下降沿开始接收数据//同步完成检测下降沿将开始的接收的标志置为1always
end_bit)begin//开始位为1意外关闭rx_flag
(CNT_1S/baud-1)/2)beginrx_data[cnt_bit]
rx_data;endend//结束位为1时才接收数据否则让数据为0视为无效数据assign
tx_dout,//发送串行数据,低位在前高位在后output
if(add_baud)beginif(end_baud)begincnt_baud
1d1);//根据波特率求得传输1bit所需要的时钟周期//比特计数器always
if(add_bit)beginif(end_bit)begincnt_bit
4d9;//一个数据有1bit起始位8bit数据位1bit结束位//发送请求拉高时寄存数据always
tx_data;endend//发送请求拉高时保持发送信号拉高直到发送完毕always
(rx_dout_sign),//接收完成.dout_sign_tx
从时序图看这里想要发送的并行数据是8’b11010011。
首先是发送请求信号拉高此时发送标志信号拉高直到数据发送完成。
采用一个10bit的寄存器对并行数据进行寄存同时由于是低位在前高位在后开始位为0停止位为1因此寄存的数据为10’b1110100110。
同时在发送标志信号拉高时cnt_baud计数器开始计数该计数器是计的发送1bit数据所需要的系统时钟周期。
计满时cnt_bit计数器加1然后发送的串行数据就是根据cnt_bit计数器对寄存的数据进行一个一个的发送。
在出现发送停止位后就表明这个数据发送完成了因此发送结束标志信号dout_sign就拉高。
从这张时序图看收到了一串的串行数据首先需要对这一串数据进行同步打拍通过同步打拍判断出下降沿出现下降沿时开始接收数据的标志信号rx_flag拉高直到接收数据完成。
然后依旧是两个计数器与发送模块的计数器功能一样cnt_baud和cnt_bit。
然后采用一个10bit的数据寄存器rx_data。
为了接收到的数据稳定因此采用当baud计数器过了一半时根据传入的串行数据打拍后的波形数据写入寄存器同时判断了开始位为1和停止位为0的话都属于无效数据不会接收无效数据。
当数据有效时最终接收到的并行数据rx_dout就为rx_data寄存器的[8:1]位。
同时接收完毕后将接收完成的标志信号拉高。
当FIFO中缓存的数据大于等于8个数据时开启读取数据的状态开启读取第一个数据的使能信号将读取到的数据发给数据发送模块当数据发送模块将一个数据发送完成后将数据发送完成的标志信号dout_sign_tx传给FIFO控制模块cnt_tx计数器加1同时重新读取一个新的数据传给数据发送模块进行发送直到发送完8个数据才重新进入空闲状态。
并且由于FIFO是使用的前显模式因此当读取数据有效时读取的数据是前面显示的那个数据。
(rx_dout_sign),//接收完成.dout_sign_tx
1b1;#(30*CYCLE);end#(2000*CYCLE);$stop;endendmodule3.2
从这张仿真波形图可以看到发送的标志信号拉高后两个计数器正常工作然后10bit的数据寄存器rx_data。
在cnt_baud计数器过了一半时才会根据传入的串行数据打拍后的波形数据写入寄存器同时判断了开始位为1和停止位为0的话都属于无效数据不会接收无效数据。
当数据有效时最终接收到的并行数据rx_dout就为rx_data寄存器的[8:1]位。
同时接收完毕后将接收完成的标志信号拉高。
从这张仿真波形图可以看到当发送请求信号tx_req拉高后发送标志信号tx_flag拉高直到发送完毕。
同时10bit的数据寄存器将tx_din的并行数据存入并加上开始位0停止位1。
然后两个计数器开始正常计数。
然后发送的串行数据tx_dout就是根据cnt_bit计数器对寄存的数据进行一个一个的发送。
在出现发送停止位后就表明这个数据发送完成了因此发送结束标志信号dout_sign就拉高。
从这张仿真波形图可以看出当FIFO中缓存的数据大于等于8个数据时开启读取数据的状态开启读取第一个数据的使能信号将读取到的数据发给数据发送模块当数据发送模块将一个数据发送完成后将数据发送完成的标志信号dout_sign_tx传给FIFO控制模块cnt_tx计数器加1同时重新读取一个新的数据传给数据发送模块进行发送直到发送完8个数据才重新进入空闲状态。
并且由于FIFO是使用的前显模式因此当读取数据有效时读取的数据是前面显示的那个数据。
从图片中可以看出当发送数据小于8个时它将数据接收并存入了FIFO缓冲器。
当再次输入几个数据时它会一次性输出8个数据并且先输出之前存入的数据。
当我们切换了波特率PC端设置的波特率与FPGA板子上设置的波特率不同时我们发送的数据就会解析混乱变成一些乱码存入缓存器然后达到8个数据时输出。
当我们重新调整波特率使得双方波特率一致后又能够收发同步了。
因为该工程是分模块化的设计因此如果只需要串口的发送和接收功能就只需要将这两个模块直接拿去用就可以了大大方便了之后其他工程的设计。
另外这只是我的一点学习笔记如果有错误还请提出。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback