【具体实施方式】
如图5所示,本发明的紧凑存储图像数据的读取装置,包括读取控制单元、写行缓存控制单元、行缓存单元、读取地址跳变单元以及配置信息存储单元;所述读取控制单元、写行缓存控制单元、行缓存单元顺次连接,所述配置信息存储单元、读取地址跳变单元以及读取控制单元顺次连接,所述配置信息存储单元还与读取控制单元直接连接;所述读取控制单元还与外部电路的图像存储单元连接,所述行缓存单元还与外部电路的显示或者图像处理电路连接。
所述图像存储单元用于负责存储紧凑存储的图像数据;
所述显示或者图像处理电路用于负责读取紧凑存储图像数据的读取装置的行缓存中的图像数据,将图像数据显示或者进行图像处理;
所述读取地址跳变单元用于负责运算每次读取动作的地址;
所述读取控制单元用于接收到每次读取的地址后,按照存储单元的读取时序发出读取命令,并将读取回来的图像数据送到写行缓存控制单元进行判断和处理;
所述写行缓存控制单元用于负责在得到每次的读数据后,根据判断,将读数据的全部或者部分写到行缓存单元中;
所述行缓存单元用于存储图像数据,以供外部的图像显示或者处理电路取用;所述行缓存单元包含两行或者两行以上的图像数据存储空间,即包含两个或两个以上的行缓存,每个行缓存都有一个数据有效位,该位指示本行缓存中是否已经存放满未被使用的行数据,一开始所有行缓存都是无效状态,一行被写满后,该行缓存状态变为有效,直到外部电路使用完毕该行的图像数据后将数据有效位又置为无效状态,当还有行缓存的数据有效位为无效的时候,读取控制单元就会发起新一行的读取动作,再由所述写行缓存控制单元向空行缓存填充一行的图像数据,当全部行缓存都有图像数据时,读取控制单元暂停工作并等待外部的显示或者图像处理电路使用完一行数据后,一旦任意一行的行缓存状态变为无效后,又开始新一行的读取和填充。
所述配置信息存储单元用于负责接收外部的配置信息,并将配置信息存储于内部,然后将这些配置信息送往各个所需的单元,配置信息包括图像存储的起始地址,图像的宽度和高度,图像的色度空间格式。
如图6所示,发明再提供一种紧凑存储图像数据的读取方法,可以采用上述的读取装置进行控制,具体包括如下步骤:
步骤10、首先,对配置信息存储单元进行配置,配置内容有紧凑存储图像在图像存储单元中的起始地址,图像的宽度和高度,图像的色度空间格式,电路工作开关位;
步骤20、需要信息配置完毕后,最后将电路工作开关位配置打开,电路开始工作;
步骤30、读取地址跳变单元计算出每一次读取动作的读取地址,并将读取地址送到读取控制单元;
步骤40、读取控制单元根据每次收到读取地址,产生一次对存储单元的读取动作,读取一个word的数据,并把读数据送往写行缓存控制单元;
步骤50、写行缓存控制单元判断应该将读数据的哪部分写到行缓存单元中,并根据判断结果将读数据的全部或者部分写到行缓存单元中,以供外部的图像显示或者处理电路取用;
步骤60、这样不断循环步骤30至步骤50,直到图像所有行都被读取完毕。
现在具体介绍一下读取地址跳变单元计算出每一次读取动作的读取地址的运算方法,以及写行缓存控制单元判断应该将读数据的哪部分写到行缓存单元中的判断方法。
1、首先介绍三个变量
三个变量分别为line_align、next_line_start_addr和line_count;
line_align用于指示当前读取行的数据对齐情况,line_align是一个累加量,是每行数据量(每行像素个数*每个像素字节数)除以一个word的余数值的累加,比如line_align初始值为0,第一行14字节除以word(4字节)余2字节,则第一行的line_align=2,这说明第一行最后一个word有两个字节是有效的第一行数据,剩余部分为下一行的数据;line_align在每行第一个word读取完后更新;写行缓存控制单元根据line_align的值将每行第一个word和最后一个word的数切割后写入行缓存单元.每行的第一个word处理后,后面的每个word都顺序写到line_buf中,直到最后一个word,需要line_align决定写一个word中的哪几个写到行缓存中。
next_line_start_addr用于记录下一行的起始地址,其初始值等于图像起始地址,之后每计算完一行,next_line_start_addr就进行一次累加,计算方法为next_line_start_addr=next_line_start_addr+每行像素个数*每个像素占字节数;该变量在每行读取完毕后更新;
line_count用于统计本行已经读取了多少字节数据;line_count初始值为0,在每行读取结束后清零.在每行开始读数后,计算已经读取的字节数.用于判断哪一次读数时本行的最后一个word.当每行的字节数减line_count得到的差值小于等于4个字节时,可以确定下一次读数为本行的最后一个word读取。
2、如何判断已经读到一行中的最后一个word:
line_count初始值为0;在每行第一个word读取时,line_count累加值计算为line_count=line_count+(4-line_align),在每行第一个和最后一个word读取之间的每次读取,line_count每次都累加4,当每行的字节数减line_count得到的差值小于等于4个字节时,可以确定,下一次读数为本行的最后一个word读取;读取完每行最后一个word后,line_count自动清零。
3、控制读取地址的具体流程:
next_line_start_addr初始值等于图像起始地址;
第一次word读取,读取地址为next_line_start_addr的初始值(图像起始地址),之后第一行的每次word读取,都在next_line_start_addr基础上加一个word偏移量,直到第一行最后一个word;在第一行最后一个word读取完毕后,next_line_start_addr进行更新,计算方法为:
next_line_start_addr=next_line_start_addr+每行像素个数*每个像素占字节数;然后,下一行的第一个读取地址又从新的next_line_start_addr开始,每次一个word偏移量累加,直到下一行读完,next_line_start_addr再更新,如此循环直到图像读取完毕;
由于一次读取数据宽度为1个word,所以最终输出给读取控制单元的地址需要对4取整。
4、如何控制写入行缓存:
1)需要根据line_align的值来判断将哪一部分写到行缓存中,line_align初始值为图像起始地址除以word的字节余数;并在每行第一个word读取完后更新,更新算法为:
line_align=(line_align+每行图像数据字节数%4)%4,算式中%为取余符号。
2)根据上述第2点判断结果进行写操作:
若是每行的第一个word,写入行缓存中的部分为高(4-line_align)字节,该高(4-line_align)字节为有效数据,其余为无效数据予以丢弃;比如第一行第一个word的line_align为0,则4个字节都是本行数据,如果line_align为1则高3字节为本行数据;
若是每行的第一个word与最后一个word之间的word,每次word读数据的所有字节据都存入行缓存,该所有字节数据均为有效数据;
若最后一个word时,如果line_align为0则4个字节都是有效数据,所有字节数据都存入行缓存,即为本行数据,如果不为0,则line_align个低位字节为为有效数据,将低位字节存入行缓存,即为本行数据。比如line_align为1则读数据的最低1字节为本行数据,被写入行缓存。
请重点参考图3和图7,下面详细介绍一具体操作示例:
该具体操作示例是以一个图像宽度为14字节的例子,是存储在图像存储单元中前两行紧凑存储的图像数据存放方式。本示例是用于说明如何读取前两行的数据和第三行的起始数据,为了方便说明,本示例中的行缓存行数为2,实际设计中可以设计为行数大于等于2的结构,操作方法类似。
一开始,由于检测到两个行缓存都是空的,所以开始读操作:
第1次读取,line_align等于0,next_line_start_addr等于0,读地址为0x0,第一个word,line_count累加值为(4-line_align),因为line_align等于0,所以line_count累加后为4,因为是本行的第一个word,所以需要根据line_align的值来判断将哪一部分写到行缓存中,写入行缓存中的部分为高(4-line_align)字节读数据的4个字节.因为line_align等于0,所以4个字节全部写入行缓存。
第2次读取,读地址在前一读地址基础上加4等于0x4,next_line_start_addr等于0,line_align在每行第一个word读取完后更新,更新算法为:
line_align=(line_align+每行图像数据字节数%4)%4,所以line_align=(0+14%4)%4=2,line_count累加4等于8,因为不是本行的第一个word或者最后一个word,所以4个读数据字节全部写入行缓存。
第3次读取,line_align等于2,next_line_start_addr等于0,读地址在前一读地址基础上加4等于0x8,line_count直接加4等于12,然后因为不是本行的第一个word或者最后一个word,所以4个字节全部写入行缓存。
第4次读取,line_align等于2,读地址在前一读地址基础上加4等于0xc.由于每行的字节数14减line_count值12得到的差值2小于4个字节,所以判定当前word为本行最后一个读数据,并且line_count在本次读取完毕后清零.每行最后一个word时,如果line_align为0则4个字节都是本行数据,如果不为0,则line_align个低位字节为本行数据,因为line_align等于2,所以读数据中低位地址0xc到0xd的2字节数据被写入行缓存;此时,第一行数据读取完毕。next_line_start_addr在本行结束后更新,next_line_start_addr=0+14=14(16进制为0xe)。
此时,由于仍可以检测到行缓存1还是空的,所以继续开始读操作:
第5次读取,line_align等于2,next_line_start_addr等于0xe,读地址等于next_line_start_addr,也就是0xe,对4取整得到0xc.line_count累加值为(4-line_align),等于2。因为是本行的第一个word,所以需要根据line_align的值来判断将哪一部分写到行缓存中,写入行缓存中的部分为高(4-line_align)字节读数据的4个字节.因为line_align等于2,所以读数据的高2个字节,也就是0xe和0xf的两个字节写入行缓存。
第6次读取,读地址在前一读地址基础上加4等于0x10,next_line_start_addr等于e,line_align在每行第一个word读取完后更新,更新算法为:
line_align=(line_align+每行图像数据字节数%4)%4,所以line_align=(2+14%4)%4=0.,line_count累加4等于6.因为不是本行的第一word或者最后一个word,所以4个读数据字节全部写入行缓存。
第7次读取,line_align等于0,next_line_start_addr等于0xe,读地址在前一读地址基础上加4等于0x14,line_count直接加4等于10,然后因为不是本行的第一个word或者最后一个word,所以4个字节全部写入行缓存。
第8次读取,line_align等于0,读地址在前一读地址基础上加4等于0x18.由于每行的字节数14减line_count值10得到的差值4小于等于4个字节,所以判定当前word为本行最后一个读数据,并且line_count在本次读取完毕后清零.每行最后一个word时,如果line_align为0则4个字节都是本行数据,如果不为0,则line_align个低位字节为本行数据,因为line_align等于0,所以读数据中4字节数据被写入行缓存;此时,第二行数据读取完毕.next_line_start_addr在本行结束后更新,next_line_start_addr=14+14=28(28进制为0x1c)。
此时,由于检测到没有行缓存还是空的,所以停止读操作.直到外部显示或处理电路读取完行缓存0后,设置其数据无效,读取控制器可以检测到行缓存0是空时,继续开始读操作:
第9次读取,line_align等于0,next_line_start_addr等于0x1c,读地址等于next_line_start_addr,也就是0x1c,对4取整得到0x1c.line_count累加值为(4-line_align),等于4。因为是本行的第一个word,所以需要根据line_align的值来判断将哪一部分写到行缓存中,写入行缓存中的部分为高(4-line_align)字节读数据的4个字节.因为line_align等于0,所以读数据的4个字节都写入行缓存.此时第三行的第一个数据读取完毕。
第三行之后的数据和后面所有行的数据都按照上面的规则进行读取,直到整个图像读取完毕。
虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。