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

Zynq开发实践(FPGA之uart发送)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        fpga作为独立的模块,本身肯定有很多的优势,当然也有缺点,价格就是缺点。不过fpga很少是独立使用的,它得和其他嵌入式板子通信,或者是直接和pc进行通信。通信的方法很多,有uart、iic和spi,这几种是经常出现的方式。这里面最简单的就是uart,因为它比较简单,发送就是tx,接收就是rx。

1、uart的波特率

        uart的发送频率一般都不快,从4800到115200都可以。当然,也可以发送得更快一点,比如说115200的2倍、4倍等等,这需要看接收方支不支持。

2、发送的格式

        uart空闲状态一般是拉高。一次uart可以发送一个字节,发送的时候有起始位、数据位、校验位、停止位四个部分。校验位大部分不添加,所以就是剩下来的三个部分。其中数据位一般是8位为主,起始位是0,停止位是1。数据位也是从低到高,一个bit、一个bit发送。

3、一般先开发发送功能

        针对各种通信协议,我们一般都是先开发发送功能。发送验证好了,就可以继续验证接收功能。比如,这个时候就可以通过回环发送的形式,验证发送模块是不是ok。这样借助于回环检测,就可以把发送和接收都验证好了。

4、串口发送的实现

        整个串口发送是从计数器开始的,因为发送的频率不同,所以需要确认发送的时候,计数器的大小是多少,

always@(posedge clk or negedge rst)if(!rst)counter <= 16'h0;else if(state != 3'h0) beginif(counter != `BAUD_CNT)counter <= counter + 1;elsecounter <= 16'h0;end 

        至于状态机切换,直接根据串口的发送顺序,用传统的三段式方法去编写即可,

// state machinealways@(posedge clk or negedge rst)if(!rst)state <= 3'h0;elsestate <= next_state;// about next_statealways@(*)if(!rst)next_state = 3'h0;else if(state == 3'h0 && out_valid)next_state = 3'h1; // first bitelse if(state == 3'h1 && counter == `BAUD_CNT)next_state = 3'h2; // send dataelse if(state == 3'h2 && num == 7 && counter == `BAUD_CNT)next_state = 3'h3; // send stopelse if(state == 3'h3 && counter == `BAUD_CNT)next_state = 3'h0;elsenext_state = state;

                发送数据的时候由于需要计数处理,所以要对num进行计数,

// num of sending signalalways@(posedge clk or negedge rst)if(!rst)num <= 3'h0;else if(state == 3'h2 && counter == `BAUD_CNT)num <= num + 1;

        最后就是依次发送数据,并且及时通知接收端当前可以继续发送其他数据了,

// about sending dataalways@(posedge clk or negedge rst)if(!rst)out_data <= 8'd0;else if(state == 3'h0 && out_valid)out_data <= data;// tx signalalways@(*)if(!rst)tx = 1'b1;else if(state == 3'h1)tx = 1'b0;else if(state == 3'h2)tx = out_data[num];elsetx = 1'b1;// about statusalways@(posedge clk or negedge rst)if(!rst)accept_status <= 1'b1;else if(state !=3'h0 )accept_status <= 1'b0;elseaccept_status <= 1'b1;

5、测试和验证

        验证部分,直接使用testbench即可,首先我们先准备一个testbench文件,

`timescale 1ns/1ps
module test();reg rst;
reg clk;
reg out_valid;
reg[7:0] data;
wire tx;
wire accept_status;initialbeginrst = 1;clk = 0;out_valid = 0;data = 48;#12 rst = 0;#21 rst = 1;#30 out_valid = 1;#50 out_valid = 0;#10000 $finish;endinitial
beginwhile(1)clk = #5 !clk;
enduart_tx uart_tx(.rst(rst),.clk(clk),.out_valid(out_valid),.data(data),.tx(tx),.accept_status(accept_status));initial
begin$dumpfile("hello.vcd");$dumpvars(0, test);
endendmodule

        接下来的工作就和之前一样,直接仿真运行,查看波形即可,


文章转载自:

http://fJtJgSus.Lfbzg.cn
http://OQNEOj7q.Lfbzg.cn
http://pwYzDyD9.Lfbzg.cn
http://TbvYsnt6.Lfbzg.cn
http://8lG21D5a.Lfbzg.cn
http://9MILYP6C.Lfbzg.cn
http://wI8vZNyQ.Lfbzg.cn
http://tNaNJ4ss.Lfbzg.cn
http://pkiLCiSw.Lfbzg.cn
http://zcQpMVb2.Lfbzg.cn
http://yny2zbIL.Lfbzg.cn
http://eLj8p1WU.Lfbzg.cn
http://CFOZoryY.Lfbzg.cn
http://k41M0246.Lfbzg.cn
http://P1OJaPhw.Lfbzg.cn
http://D8MhFMHK.Lfbzg.cn
http://VwSn6dUU.Lfbzg.cn
http://pwGsJL3D.Lfbzg.cn
http://cqOUgKAj.Lfbzg.cn
http://dreKj9yJ.Lfbzg.cn
http://QINhFd5e.Lfbzg.cn
http://HHoZ2oId.Lfbzg.cn
http://nMtMOYv9.Lfbzg.cn
http://hkuYhyGl.Lfbzg.cn
http://dmpxJeEt.Lfbzg.cn
http://5btqXo3y.Lfbzg.cn
http://wtiS0V1D.Lfbzg.cn
http://LUFk5hRz.Lfbzg.cn
http://reGghQej.Lfbzg.cn
http://wRTXpWMP.Lfbzg.cn
http://www.dtcms.com/a/366162.html

相关文章:

  • 如何在 IntelliJ IDEA 中进行全局替换某个字段(或文本)
  • 案例精述 | 防护即智能 Fortinet赋能英科全栈安全重构实践
  • React学习之路永无止境:下一步,去向何方?
  • C#上位机解决ComboBox下拉框加载卡顿问题探析
  • wpf中资源的使用
  • 【Ubuntu扩容】Ubuntu启动项丢失、增加硬盘相关操作记录贴
  • Dubbo分布式服务框架全解析
  • 十一、容器化 vs 虚拟化-K8s-Kustomize
  • 免费低代码谁更优?斑斑与氚云深度对比,中小企业数字化转型选对平台很关键
  • 热烈庆祝“中国抗战胜利80周年”,织信低代码助力国之重器砥砺前行!
  • vue+elementUI 进行表格行内新增及校验,同行其他输入框数据影响当前输入框校验结果
  • Web与Nginx网站服务
  • VUE中引入tailwindcss样式(用于GemDesgin的页面生成)
  • 英飞凌ASIL-D级无刷电机驱动芯片TLE9189守护汽车安全
  • 新手SEO高效入门实践指南
  • Linux 基础IO-从 “一切皆文件” 到自定义 libc 缓冲区
  • 字符串(1)
  • 关于多Agent协作框架的讨论:以产品经理工作流为例对比Sub Agent与AutoGen
  • 论文阅读:arixv 2024 Adversarial Attacks on Large Language Models in Medicine
  • SpringMVC —— 响应和请求处理
  • 低代码开发平台技术总结
  • Coze源码分析-资源库-删除提示词-后端源码
  • Selenium
  • 一个基于 axios 的请求封装工具 - request-fruge365
  • Energy期刊论文学习——基于集成学习模型的多源域迁移学习方法用于小样本实车数据锂离子电池SOC估计
  • scss 转为原子css unocss
  • 【Linux】环境变量与程序地址空间详解
  • Linux——服务器多线程压缩工具介绍
  • 深入探讨AI三大领域的核心技术、实践方法以及未来发展趋势,结合具体代码示例、流程图和Prompt工程实践,全面展示AI编程的强大能力。
  • Makefile学习笔记 (1)