基于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的写入、读取,以及串口发送数据。

实现效果图

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

小结

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值