fpga这部分是花了大部分时间调试的,总结出来:比较难调试,调试方式单一
概述
fpga控制ccd传感器和ad转换芯片,从而获得ccd上所有阵列的电压数据,之后将数据存储在sdram中,然后控制68013芯片向上位机发送存储在sdram中的数据。
乍看之下比较简单,一条线的逻辑,但是需求中这样一步一步操作比较浪费时间,就没法做到高效,因此在fpga程序中保证高效就得采用并行。
举例来说取第4个ccd数据的时候,第3个ccd数据向ad转换器转换,第2个数据存入sdram,第1个数据从sdram中取出。而这些步骤之中,首先一个问题是时钟不同,其次问题是如何保持数据准确性,总的来说就是互相联调的问题。这个问题比较困难,我改了好几次架构花了好久,最终在一个架构上保证了数据可靠高效传输。具体如下我目前做的工作
架构部分
每个部分采用单独工作,相互给信号,给到信号在工作,其中在sdram和ccd和ad和68013之间用一个中间层mid模块负责总调度信号。
ccd部分
硬件是两个ccd,总调度信号由1000hz(可调)在中间层mid给出信号,ccd获得信号后,①在ccd_A上获取数据后给ad转换器,②在ccd_B上获取数据给ad,同时,ccd_A经过转换的数据发送给sdram,给sdram模块一个信号重复①②直到两个ccd所有数据传输完成也就是一帧数据获取到了,中间层mid到了设置的采集帧数速率后才能再次给ccd模块信号
sdram部分
这部分是双向的,输入和读取是异步
①写入:可以输入的条件是sdram没有到一帧可写入数据大小,如果到了,会给中间层mid信号,让mid无法给ccd信号开始读取。这样就有了万一上位机读取慢一点暂存的功能。
②读取:可以读取条件就是只要sdram有数据并且68013的fifo中还有空,只要满足就一直读取,直到读空。
mid部分
总调度,负责其他部分的信号沟通。
68013usb2.0部分
由于上位机是查询模式,只要68013的fifo中有数据就会读走,所以68013是只要fifo有空,并且sdram非空,就读取sdram的数据,上位机取走68013的数据后fifo就会减少相应读取数据的长度