CAM表实现

时间:2024-04-07 07:29:54

一、CAM表概述

FPGA中有BRAM,即block ram,一种存储器。可以给数据和地址写入数据,并且给地址读出对应的数据。
相反地,给数据和地址写入数据之后,如果给数据来读出对应的地址,这样的存储结构就是CAM表,CAM表既可以用硬件电路做出也可以用FPGA来实现。

二、BLOCK图

CAM表实现
CAM表使用了2个RAM(单双口都可以)以及一个crc-32模块来实现,其中crc-32是为了压缩数据,将压缩后的数据当做两个RAM的地址,然后将data和addr写入data_ram,将冲突数写入conflict_ram。
PS:
1.用crc-32的原因:如果一个地址对应一个数据的话,有人肯定会想直接把数据当做地址来写入ram中,想法是对的,但是在fpga上面很难实现,因为fpga芯片中的bram资源有限,光是36bit位宽的数据,如果有2^16个这样的数据,使用bram搭建存储器来存储的话,就得用掉64个36kb的bram,实际上位宽可能更大,然而fpga中的bram不多,并且大量调用会引入布局布线的时序违规。
2.为啥不用hash算法:hash算法比较复杂并且生成的hash值位宽较大,这个crc-32更快,用异或逻辑实现的,还可以在线工具直接生成。
3.冲突的概念:因为crc_32是对数据压缩了,64-32,如果0-2^64输入进去,输出肯定会有两两重复的32bit的数,因为你不可能用32个位宽表达出所有的64位宽的数。这就是冲突。
这里我们只取了32bit中的低12bit,也就导致了冲突级数更大了,所以用一个conflict_ram来存取冲突级数(即出现过多少次相同的hash值)。

三、时序描述

cam表的功能时序应该分为3部分:初始化–写入–寻找。
初始化:两个ram全地址写0,因为可能会在写入之后需要重新配置,所以需要初始化模式;
写入:写入地址和数据,就是配置阶段;
寻找:给数据,找对应的地址,告诉我找没找到。

四、部分代码

主要是定义了一些接口,还有主要的状态机,后面的代码就是一些中间寄存器的控制以及crc和xpm_sdpram的例化了,数量太多就不粘贴了。
CAM表实现
CAM表实现
CAM表实现
CAM表实现
CAM表实现
CAM表实现
CAM表实现
CAM表实现

五、仿真效果

CAM表实现
CAM表实现
CAM表实现
总共在0-10000地址中输入10000个随机数,然后还在tb里面写了个比对,通过写入文件的方式来查看查找的时候由于冲突多余4个被丢了哪些数。
CAM表实现
CAM表实现