查找表通常用来做存储器的
来源:互联网 发布:淘宝128g内存卡才50元 编辑:程序博客网 时间:2024/05/11 05:00
在硬件描述语言中,查找表通常用来做存储器的,当大存储器系统建模的时候,可能会遇到仿真性能下降的问题,VERILOG本身对存储器并没有限制的,但是,当存储器的空间达到4G的时候,碰巧的是操作系统不能定位这么大的空间,因为WINDOWS操作系统的寻址空间为4G空间啊!解决的方法是利用查找表(相连存储器)!
第一种方法是:如果存储器的访问具有局部性,即在每个时间点上只有一小部分被使用,例如,假设在任何时候只有16个存储器被使用。我们可以提供两个队列,一个用与存储器的地址,一个用于存储器的容量。熟悉Linux的,可能知道在Linux内部有一个80字节的高速地址缓存区!也是利用这个原理的。在地址存储器中,当读取一个地址的时候,如果这个地址在积存器中,那么就对这个地址直接进行读写,如果没有,则,原来的地址被覆盖,这个叫做(LRU)算法。
第二种方法是:同第一种差不多的,只是在释放单元是不是用LRU算法,而是用一旋转计数器来选择下一个要释放的单元;
下面来看一个代码,是用的第二种方法的:其实相当于一个循环队列了,希望大家仔细回味,还有就是数据结构,也要看看啊,一会还有个代码要用到哈西表的;
//---------------------------------------------------------------------------------------
module memory(address,data,read,write);
inout [15:0]data; //要用到上次讲的mapping regester 不用也行,最好用!
input [31:0]address;
input read,write;
parameter SIZE =15;/寄存器大小
reg [31:0]address_reg[SIZE:0]; //address register
reg [15:0]data_reg[SIZE:0]; //data register
rey [15:0]data_map;
//----------------------------------------------------------------------------
integer lastwritten;//lastwritten 是上次被写后的下一个
// 单元
assign data=data_map;
always@(posedge write)
begin
integer i;
for(i=0;i<SIZE;i=i+1)
if(address_reg[i]=address)
lastwritten=i;
else
address_reg[i]=address;
data_reg[i]=data;
lastwritten=(lastwritten+1)%SIZE;
end
//---------------------------------------------------------------
always@(posedge read)//读取,如果地址不在则打印错误,
begin //如果想综合的话,可以加个flag通知CPU没有
int i,found; //再直接从输出地址,和数据。
for(i=0;i<SIZE;i=i+1)
begin
if(address_reg[i]==address)
begin
data_map=data_reg[i];
found=1;
end
else found=0;
end
if(found=0)
begin
$display("EEROR ADDRESS NOT FOUND !");
$stop;
end
@(negedge read)
data_map=4'hzzzz;
end
endmodule
//--------------------------------------------------------------------------------------
上面的例子只对非常局部化的存储器有效果,也可以用在高速缓存中!
下面再来看一段代码,这里用的是杂凑法,用在数据结构中就是
哈希表!!!!!!!!
这里同样有两个存储器,一个放地址,一个放数据,
不同的是,扫描不是全部扫描完的,而是把,输入的地址经过一种算法
转换成地址存储器中的index.
//-------------------------------------------------------------------
第一种方法是:如果存储器的访问具有局部性,即在每个时间点上只有一小部分被使用,例如,假设在任何时候只有16个存储器被使用。我们可以提供两个队列,一个用与存储器的地址,一个用于存储器的容量。熟悉Linux的,可能知道在Linux内部有一个80字节的高速地址缓存区!也是利用这个原理的。在地址存储器中,当读取一个地址的时候,如果这个地址在积存器中,那么就对这个地址直接进行读写,如果没有,则,原来的地址被覆盖,这个叫做(LRU)算法。
第二种方法是:同第一种差不多的,只是在释放单元是不是用LRU算法,而是用一旋转计数器来选择下一个要释放的单元;
下面来看一个代码,是用的第二种方法的:其实相当于一个循环队列了,希望大家仔细回味,还有就是数据结构,也要看看啊,一会还有个代码要用到哈西表的;
//---------------------------------------------------------------------------------------
module memory(address,data,read,write);
inout [15:0]data; //要用到上次讲的mapping regester 不用也行,最好用!
input [31:0]address;
input read,write;
parameter SIZE =15;/寄存器大小
reg [31:0]address_reg[SIZE:0]; //address register
reg [15:0]data_reg[SIZE:0]; //data register
rey [15:0]data_map;
//----------------------------------------------------------------------------
integer lastwritten;//lastwritten 是上次被写后的下一个
// 单元
assign data=data_map;
always@(posedge write)
begin
integer i;
for(i=0;i<SIZE;i=i+1)
if(address_reg[i]=address)
lastwritten=i;
else
address_reg[i]=address;
data_reg[i]=data;
lastwritten=(lastwritten+1)%SIZE;
end
//---------------------------------------------------------------
always@(posedge read)//读取,如果地址不在则打印错误,
begin //如果想综合的话,可以加个flag通知CPU没有
int i,found; //再直接从输出地址,和数据。
for(i=0;i<SIZE;i=i+1)
begin
if(address_reg[i]==address)
begin
data_map=data_reg[i];
found=1;
end
else found=0;
end
if(found=0)
begin
$display("EEROR ADDRESS NOT FOUND !");
$stop;
end
@(negedge read)
data_map=4'hzzzz;
end
endmodule
//--------------------------------------------------------------------------------------
上面的例子只对非常局部化的存储器有效果,也可以用在高速缓存中!
下面再来看一段代码,这里用的是杂凑法,用在数据结构中就是
哈希表!!!!!!!!
这里同样有两个存储器,一个放地址,一个放数据,
不同的是,扫描不是全部扫描完的,而是把,输入的地址经过一种算法
转换成地址存储器中的index.
//-------------------------------------------------------------------
- 查找表通常用来做存储器的
- 可以用来查找主窗体的代码
- 查找MAC地址,用来搜索IPort的。
- 调试窗口输出(输出窗口),通常用来监视线程的时间
- MELD 用来做merge的高级工具
- Java就是用来做项目的!
- 周末的好时光用来做什么
- 可以用来做ppt的网页效果
- 反射是用来做框架用的
- Java就是用来做项目的!
- 过滤器和监听器通常用来干什么啊?
- 查找WINCE外部存储器
- VerticalBannerView 是一个 android 平台下的自定义控件,通常用来展示广告,类似淘宝头条
- finally 用来做什么?
- 比较有用的SQL 用来查找有哪些栏位
- 将扯淡的时间都用来做有意义的事
- 做管理信息系统时用来实现来电显示的源代码
- 用来直接做转发,代替超链的ForwardAction
- SAP CRM自学历程
- 中石油股票何时上市和 中石油股票上市交易 中石油股票上市价
- 中国石油开盘价
- 本体开发导论——A Introduction to Ontology Development
- 爱情里没有谁对谁错 - 郑源
- 查找表通常用来做存储器的
- 数据揭示的软件项目管理-转载 -英文数据中文说明
- 苹果CEO乔布斯的世界:无所不在 无所不知
- 杂凑法存取的算法
- 本体开发的有关问题和命名规范——some Problems and Naming Conventions of Ontology development
- 乔布斯的世界: “小物件”,大世界
- 本体开发方法——the Method of Ontology Development
- 极度郁闷ing````
- Dot Net反编译工具Reflector