• 基于ACS40核心板的串口图传设计


    基于ACS40核心板的串口图传设计

    该设计使用的硬件

    在这里插入图片描述
           该设计使用了自研的ACS40核心板,对于这个核心板的具体介绍,见《ACS40核心板简介》这篇博文,配合一个SRAM模块,以及一个MT9V034摄像头模块,硬件平台搭建完成后如上图所示。

    设计目的以及要达到的效果

           PC端串口下发图像采集的命令,ACS40收到命令后开始将摄像头数据存入SRAM,存完一帧完整的图像后,ACS40使用串口回送给PC端一个采集好的回送字,然后PC端通过串口下发回读图像的命令,ACS40收到命令后通过串口将SRAM中一帧完整的图像发送给PC端。

    基于设计目的下的分析

    1. 关于数据量的计算:
           对于本设计而言,在设计之初,我们需要首先根据现有的硬件条件,计算各个环节需要流过的数据量,因为对于串口而言,本身数据传输的速度不会很快,所以在传输数据,尤其是进行图像数据这样大量像素点数据的情况下,首先就需要计算整个链路上各个环节需要流过的数据量,以论证这个方案的可行性。
           MT9V034摄像头是一个灰度摄像头,分辨率为:752x480,一个灰度像素数据为8bit
    那么一帧完整的图像就是:752x480x8= 2_887_680bit;752x480= 360_960Byte;
           与ACS40配套使用的SRAM模块使用的是ISSI的IS61LV51216,数据位宽为16bit,地址位宽为19bit,则共可以存储2^19=524_288个16bit;
           对比可以知道,一帧的8bit像素数据可以不用拼接直接存入SRAM模块,SRAM每个16bit的高8bit可以直接赋值为8’h00,这样可以避免了拼接存入后再读出来还得折腾顺序;
    2. 关于串口波特率的选择:
           由于此次串口传输的数据量不少,并且我们使用的是以FPGA为核心的一个板卡,
    那么在波特率的设置上就可以稍微随意一点,为了不使图像传输的时间过久,这里以2_000_000的波特率作为串口通信的速度,具体的话,在代码阶段需要做一个2_000_000波特率下的串口环回实验,主要目的是测试下,在这样的硬件条件下,这个波特率设置条件下,数据传输是否稳定,不允许有大面积数据错误的情况发生,个别坏点暂时先忍了;
           注:20220907,经过测试在目前上位机条件下,高波特率接收容易造成丢包,主要原因还是上位机接收的原因,在115200波特率下可以进行稳定的接收,所以暂定先使用这个波特率。
           这里要对上面两段话进行一下解释,本来在设计之初,计划使用一个高一点的串口波特率,这样可以节省下一点传输时间,但是由于串口显示的上位机是我自己使用Labview写的,所以可能是这个自己的上位机水平还不够,所以在使用2_000_000bps下,上位机串口在丢数据,所以在后续的设计中我就把波特率下调至115200bps这样一个常规的波特率,以保证不丢数据,由此也可以看出,我们在做一个设计的过程中,总是会遇到这样那样与最初方案相冲突的地方,但是这次是由于上位机书写的问题,因为本身我自己并不是专业写上位机软件的,所以我选择了不过度深究这个问题,当然后续如果有时间和精力,也会想想办法把这个问题解决一下。
    3. 串口数据协议(自定义):
           关于串口发送,接受命令,以及数据传输的格式,这里做一个自定义的数据收发协议:
    (1)命令控制字(CW)为4个字节,即连续4个8bit:
           CW0:
                  8’h01----开始采集;
                  8’h02----开始回读数据;
           CW1:保留
           CW2:保留
           CW2:保留
    (2)回送控制字(RW)为4个字节,即连续4个8bit:
           RW0:
                  8’h03----一帧图像采集完毕;
           RW1:保留
           RW2:保留
           RW2:保留
    (3)图像数据传输格式:
           图像数据分为包头,像素数据,包尾,这里采用一种简单的数据打包方式:包头为一个字节的8’h55,包尾为一个字节的8’hAA,中间为750x480个8bit的灰度数据,数据顺序为摄像头采集的顺序,一行一行回送,每行750个字节,共480行;

    架构设计(设计框图)

           在上述的方案各个细节都明确的情况下,设计框图也可以明确细化出来了:
    设计框图
           在这里简述下各个模块的作用:
    “MT9V034模块”:用于采集摄像头模块的像素数据,并且形成像素点的行列号;
    “UART_R模块”:串口接收模块,每次接收一个字节的数据;
    “UART_T模块”:串口发送模块,每次发送一个字节的数据;
    “CW_FENXI模块”:命令分析模块,用于分析所收到的命令,解析好,送给下个模块;
    “SRAM_CTRL模块”:这个模块其实是一个调度模块,它需要根据收到的命令,自己进行SRAM的写入、读取,以及串口发送数据。

    实现效果图

    下图是初步的实现效果,上位机自己瞎写的并不专业:
    实现效果图

    小结

           做这样一个小设计的目的呢,一是用用自己多年前弄得这个核心板以及一些外设,毕竟虽说是这个核心板不大,但是通过留的一些借口啊这些,也是可以进行一些小的设计;二的话也是最主要的,培养自己进行标准化设计的能力,以及在设计过程中慢慢形成文档,做好记录,这样一个能力;最后呢也是验证下这套硬件的能力,这个设计并不是结束,而是一个链路的验证,为后续的开发设计做一个验证工作,在后续的设计成熟后,也会以这样一个博文的形式分享出来…

  • 相关阅读:
    protobuf 基本语法总结
    详细材料!武汉市省级小型微型企业创业创新示范基地申报对象+认定材料+认定条件
    超越时间与人力的软件开发智慧:《人月神话》
    Mysql高级(四)---视图/存储过程/触发器
    Folly库实现阅读——FBString
    时间复杂度与空间复杂度详解
    网络编程三要素
    KY191 矩阵幂(用Java实现)
    1、error LNK2019: 无法解析的外部符号“struct ********“
    算法竞赛进阶指南 基本算法 0x03 前缀和与差分
  • 原文地址:https://blog.csdn.net/yangh2560/article/details/127039948