本发明涉及一种异步fifo读写两端数据数量的实现方法,属于集成电路设计技术领域。
背景技术:
在集成电路数字前端设计中,很多设计采用synopsys公司的designware设计软件的异步fifo有诸多不便,只有单一复位,不能暂停,没有源代码可以改进,不能知道fifo中数据数量,只能设置全满almostfull和全空almostempty的参数,对于复杂场景下跨时钟域的设计力不从心,该设计克服了以上不便,为复杂设计带来更多传输策略。
技术实现要素:
本发明的目的:在集成电路数字前端设计中,跨时钟域数据传输始终是个麻烦的问题,怎样高效安全把数据传输过去,异步fifo是首选,但是面对不同场景下的designware,异步fifo不能面面俱到。假设对面是dram,希望数据是连续的突发burst(这样效率高),如果知道异步fifo中有多少数据,采用突发长度burstlenth是4、8或者16就能很好的做到高效设计;假设dram被高优先级通道占用,次优先级可以暂停;假设某一帧图像被抛弃了,fifo中的数据也要被清洗,该设计可以局部复位,当然也带全局复位。
为实现上述目的,本发明采用的技术方案:
1)每写入一个数据进ram单元,写指针加1,同时把写指针由二进制转换成格雷码,形成写格雷码指针;
2)从ram单元每读出一个数据出来,读指针加1,同时把读指针由二进制转换成格雷码,形成读格雷码指针;
3)写格雷码指针、读格雷码指针都要打2拍后(只有多位宽格雷码的数据才可以跨时钟域打2拍就能避免跨时域时钟cdc(clockdomaincrossing导致数据传输错误的问题),与相对应的读格雷码指针、写格雷码指针进行比较得出ram单元的空满标志;
满的条件是:在格雷码下比较,读出侧读格雷码指针的高两位取反和低位拼接后等于写入侧写格雷码指针时,则置ram为满标志。
空的条件是:在格雷码下比较,写入侧的写格雷码指针等于读出侧的读格雷码指针时,则置ram为空标志。
4)再把读格雷码指针与写格雷码指针分别转化成读格雷码指针二进制值、写格雷码指针二进制值,并保存进入对方的时钟域,两个时钟域中的读、写二进制指针进行计算就可以计算出写入侧的数据数量和读出侧的数据数量。
读出侧数据数量的计算式为:
r_entry=gry2bin(wr_ptr_gray_sync2r)-gry2bin(rd_ptr_gray_ns);
r_entry:读出侧数据数量;
gry2bin():格雷码转二进制的函数;
wr_ptr_gray_sync2r:写入侧的写格雷码指针打2拍同步到读出侧的值;
rd_ptr_gray_ns:读出侧的读格雷码指针;
写入侧数据数量的计算式为:
w_entry=gry2bin(wr_ptr_gray_ns)-gry2bin(rd_ptr_gray_sync2w);
w_entry:写入侧数据数量;
wr_ptr_gray_ns:写入侧的写格雷码指针;
rd_ptr_gray_sync2w:读出侧的读格雷码指针打2拍同步到写入侧的值。
格雷码转二进制后才能计算数据数量。
所述ram单元为fifo中的ram单元。
本技术方案中有两个技巧:
1)空、满标志的是用二进制转格雷码后进行比较得到的;
2)两个端口读、写的数据数量是再把格雷码转二进制计算得到的。
本发明所达到的有益效果:
绝大多数异步fifo的设计不会输出数据数量信号,因为这个数据存在不同时钟域,输出很容易超前或者落后指示。
本设计采用二进制到格雷码的转换bin2gray和格雷码到二进制的转换gray2bin的方法,寄存器搭建ram,比较部分采用二进制转格雷码后比较,数据数量统计部分再把格雷码转二进制后计算。利用格雷码跨时钟域的优点,也能提高系统的频率。
该设计的优点是,读写两端都知道异步fifo中有多少数据,方便设计出不同的读出写入策略。
具体实施方式
下面对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
本发明的异步fifo读写两端数据数量的实现方法,具体包括以下步骤:
1)每写入一个数据进fifo中的ram单元,写指针加1,同时把写指针由二进制转换成格雷码,作为写格雷码指针;
2)从ram单元每读出一个数据出来,读指针加1,同时把读指针由二进制转换成格雷码,作为读格雷码指针;
3)写格雷码指针、读格雷码指针都要打2拍后(只有多位宽格雷码的数据才可以跨时钟域打2拍就能避免跨时域时钟cdc(clockdomaincrossing)导致数据传输错误的问题),与相对应的读格雷码指针、写格雷码指针进行比较得出ram的空满标志;
4)再把读格雷码指针与写格雷码指针分别转化成读格雷码指针二进制值、写格雷码指针二进制值,并保存进入对方的时钟域,两个时钟域中的读、写格雷码指针二进制值进行计算就可以计算出写入侧的数据数量和读出侧的数据数量。
读出侧数据数量的计算式为:
r_entry=gry2bin(wr_ptr_gray_sync2r)-gry2bin(rd_ptr_gray_ns);
r_entry:读出侧数据数量;
gry2bin():格雷码转二进制的函数;
wr_ptr_gray_sync2r:写入侧的写格雷码指针打2拍同步到读出侧的值;
rd_ptr_gray_ns:读出侧的读格雷码指针;
写入侧数据数量的计算式为:
w_entry=gry2bin(wr_ptr_gray_ns)-gry2bin(rd_ptr_gray_sync2w);
w_entry:写入侧数据数量;
wr_ptr_gray_ns:写入侧的写格雷码指针;
rd_ptr_gray_sync2w:读出侧的读格雷码指针打2拍同步到写入侧的值。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。