作者:Steve Leibson, 赛灵思战略营销与业务规划总监
亚当泰勒
我前面几篇博文中的案例,需要通过RS-232(事实上是一个USB转串口的设备)来控制Adafruit NeoPixel阵列中的每一个RGB LED像素的设置。因此我需要在PC(DTE)和MicroZed(DCE)之间实现一个基本的通信协议。
我将要使用Zynq PS中的UART来发送和接收数据,在BSP中,它被声明为STDIO,如下所示:
这个声明允许我使用getchar()函数来实现NeoPixel通信协议。
这是因为我不想重新去创造一个新的协议—为什么每个工程师都要这样做呢?—这个简单的协议使用8位ASCII字符交换数据。(这是一个ASCII码表)使用这个协议,通过发送下面这样的数据格式,就能对每一个像素进行设置。
使用这个协议来更新若干个像素,每一个像素都需要通过上面的那个包格式进行更新,这些包是按顺序发送的,速率是115200bps,不带奇偶校验。
使用这个协议,可以根据FPGA中用于存储像素值的内部存储器的大小来决定NeoPixel条的长度,因为FPGA存储器可以存储4096个像素,所以LED条可以非常长,对于喜欢冒险的设计人员来说,可以很容易地在几分钟内就能增加它的长度。
在软件上,我要做的事情是实现一个简单的状态机,在各个状态中循环,接收像素值,然后把接收到的数据存储到Block RAM正确的位置上。
当通过串口连接接收到所有的数据后,接收到的红、绿和蓝的字节被组合成一个24位字的格式,然后写到FPGA Block RAM的正确的地址上,这样,如果像素被使能,Zynq SoC PL可以给它们设置相应的颜色。
总之,这是一个非常简单的通信协议。但是,在发送数据的时候,有时候会出现一些通信通道的问题(比如噪声或者毛刺),这可能会对性能产生不良影响,这也就是为什么这个协议必须要能够处理错误的原因。
实现这个协议的状态机仅仅需要用到7个状态,在下面的附件中可以看到这些状态。这个代码还不是最终版本,因为还需要编写代码,通过串行连接对接收到的数据进行响应,这样就能使用一个简单的终端程序对串行接口进行校验。这是我的验证策略的一部分,在我发表的上一篇博文中已经讨论过了(“亚当泰勒玩转MicroZed连载35:用MicroZed驱动Adafruit RGB NeoPixel LED阵列(第6节)”)
我使用的RS-232终端程序叫做 termite,它有一个hex-view插件,这样我就能直接发送16进制码。这个方法使得我能非常容易在笔记本电脑上发送16进制码,来测试协议是否能像预期的那样工作,同时,可以通过破坏数据来检查错误处理能力以及协议的可恢复性。这是一张termite终端应用的截图:
上一篇博文中讲了验证的内容,这篇博文中讲了串行接口。在我的下一篇博文中,我将要描述GUI的开发和最终系统的测试。然后,我将要开始介绍学习使用Zynq的更多令人兴奋的方面。
这个例子对你有用吗?
原文链接:
http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chro...
© Copyright 2014 Xilinx Inc
如需转载,请注明出处
本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网