静态随机存储器实验

2024-07-18

静态随机存储器实验(精选3篇)

1.静态随机存储器实验 篇一

GPS静态测量实习报告 学院:

专业:

学号:

姓名:

组号:土木与水利工程学院测绘工程09-1班王震阳20094176C6

一、实验目的和要求

⑴了解静态GPS测量系统的组成部分。

⑵了解静态GPS相对定位模式的作业方法。

⑶了解GPS观测数据在计算机上的处理过程。

二、实验仪器和工具

1.外业:南方s82静态GPS接收机1套(7台)、已充电锂电池7块、对点器基座7套、铝合金三脚架7个。

2.内业:数据传输电缆1根、数据处理软件(南方

GPS)(含采集器与计算机通讯软件、基线向量处理软件、网平差及坐标转换软件)

三、实验环境

外业: 合肥工业大学南区

内业:南方GPS数据处理软件

四、实验成果

见《C6组GPS成果报告》

五、实验小结

可以说我们本次GPS静态测量实习,一共进行了三次尝试才最终将成果打印出来。前两次的失败有仪器的原因有人为的原因。第一次失败是因为学校的GPS仪器注册码过期导致无法继续工作而中途废弃。回到宿舍后我们给南方公司要了注册码将班级的所有仪器均注册了一下才使仪器可以使用。第二次失败是因为我们在观测的过程中有一台仪器没有电了,我们换了一节电池后,回来发现基线解算不合格。经过多次尝试还是没有合格后,我们组决定重新再来,进行了第三次GPS测量,这一次我们在前两次失败的经验教训之上终于完成了合格的解算工作。

正真正的实习过程中总会出现各种各样的错误,有些可能是我们经验不足导致的,有些可能是外界原因导致的。反正不管什么原因我们都要有能力去探索解决问题的方法。

2.静态随机存储器实验 篇二

随着航天科学技术的飞速发展,太空作为未来战争的主要战场地位突现出来。未来的防空作战必将向空天一体防空扩展。航空和航天技术有机结合而产生的空天飞机虽然仍处于探索研究阶段,但它是控制空间、争夺制天权的关键武器装备之一[1]。空天导弹可以被加装在空天飞机上,可根据作战需要灵活寻找并击毁外层空间的军用卫星、空间站等太空目标集大气层内的各种航空器,实现全球快速打击能力[2]。

空天导弹一旦进入太空,导弹上的电子设备将会受到空间严酷的高能粒子带电环境的影响。空间中的高能带电粒子主要来自银河系的银河宇宙线、太阳爆发时的太阳宇宙线、被地磁场捕获的地球辐射带粒子,以及由于磁扰引起的磁层沉降粒子。电子器件的单粒子事件是由于大量高能粒子撞击电子器件的灵敏区,对器件功能产生影响的事件。单粒事件子效应包括单粒子翻转(Single Event Upsets,SEU)、单粒子瞬变效应(Single Event Transients,SET)、单粒子锁定(Single Event Latch up,SEL)、单粒子烧毁(Single Event Burnout,SEB)[3]。其中,单粒子翻转效应为太空器上的电子器件经常出现的事故。在美国国家地球物理数据中心统计1971—1986年间39颗地球静止或准静止卫星的在轨异常,表明空间单粒子辐射引起的卫星故障占到了总数的70%,而SEU效应引起的故障总数占到了将近40%。

1 SEU效应

单粒子翻转(SEU)是发生在具有单稳态或双稳态的逻辑器件和逻辑电路的一种带电粒子辐射效应。当高能带电粒子通过微电子器件的灵敏区时,在粒子通过的路径上将产生电离电荷,沉积在器件灵敏区中的电荷部分被电极收集,当收集的电荷超过电路状态的临界电荷时,电路就会出现翻转,出现逻辑功能的混乱,使“0”变为“1”,“1”变为“0”,这就是SEU效应[4]。带电粒子通过微电子器件的灵敏区时的电荷收集模型见图1。

SEU效应使存储器单元中存储的数据发生翻转,进而引起数据处理错误、电路逻辑功能混乱、计算机指令流发生混乱导致程序跑飞,其危害轻则引起太空器各种监测数据的错误,重则导致太空器执行错误指令,使太空器发生在轨异常和故障,甚至使太空器处于灾难性故障中。SEU效应对电子器件不产生硬件伤害,是一种状态可恢复的软错误。SEU效应对存储器,如SRAM,E2PROM,FLASH影响最大,其次为CPU,再其次为接口电路。由于单粒子对存储器引发SEU的影响,消除其的基本思想是基于容错,即允许SEU发生,而不允许SEU造成错误扩展。

EDAC(Error Detected and Corrected)是防止单粒子翻转的有效措施,已被国内外广泛应用于RAM,E2PROM的SEU防护。可以用纯软件实现,也可以用硬件实现。

本文应用修正海明码设计一个EDAC模块,该模块在FPGA内实现,具有可灵活配置的优点,用以消除SEU效应对SRAM存储器的影响。该模块可以检测数据存储单元的两位错误,并可以检测定位并纠正数据存储单元的一位错误[4,5,6]。

2 系统分析与实现

2.1 EDAC检错纠错

检错纠错的基本思想就是在需要传送的信息码序列中附加一些监督码元,这些多余的码元与信息码之间以确定的规则相互关联(约束)。在接收到这些信息时,按照既定的规则检验信息码元和监督码元之间的关系,一旦出现错误,则信息码元和监督码元之间的关系将受到破坏,从而可以发现错误,乃至纠正错误[7,8]。

在通信领域中,把一组信息码和监督码的组合称为一个码组。把2个码组中对应码位上具有不同二进制码元的位数定义为两码组之间的距离,简称码距。一种编码方法的最小码距直接关系到这种编码方法的检错能力与纠错能力,最小码距是差错编码的一个重要参数。在一个码组内纠正t个误码,同时检测e(et)个误码,要求最小码距dmin≥e+t+1。

2.2 修正海明码

线性分组码是指将信息序列划分为若干个长度为k的序列段,在每一序列段的后面附加r位的监督码,而且监督码和信息码之间构成线性关系,即它们之间的关系可以由线性方程组来描述。这样构成的差错控制码称为线性分组码。线性分组码的主要性质如下:

(1) 线性分组码具有封闭性。即线性分组码中中任何两个码组之和仍在该线性分组码中;

(2) 线性分组码的最小码距等于码组中非零码元的最小数目。

海明码就是一种线性分组码。它的最小码距为3,可以检测两位错误并纠正一位错误。下面将详细说明构造可以检测两位错并纠正一位错误的线性分组码。对于码组长度为n,信息码元为k,监督码元为r=n-k的线性分组码记为(n,k)码。

常用的海明码算法应该满足不等式:2rr+k+1。其中k为数据码位数;r为校验码位数。如果要使编码算法既能纠正一位错,同时还能发现两位错,则应该在原算法的基础上再增加一位总校验位,这就是修正海明码。

对于该设计中采用的存储单元为16 b,要实现检二纠一的功能,由于信息码元n=16,经计算需要的校验位的位数为r=6,与信息码元一起,构成一个22 b的码组,即要构造的线性分组码为(22,16)码。

2.3 EDAC模块的实现

这里采用d[15:0]表示存储的信息码元,用c[5:0]来表示监督码元。用s[5:0]表示生成的伴随式。假设s[5:0]6位伴随式与误码位置的对应关系(这个对应关系表可以根据需求随意设定)如表1所示。

由表1可知,当误码出现在c0,d0,d1,d3,d4,d8,d9,d10,d13中任何一个位置时时,s0=1;否则s0=0,因此有:

s0=c0+d0+d1+d3+d4+d8+d9+d10+d13

同理可以得到:

s1=c1+d0+d2+d3+d5+d6+d8+d11+d14s2=c2+d1+d2+d4+d5+d7+d9+d12+d15s3=c3+d0+d1+d2+d6+d7+d10+d11+d12s4=c4+d3+d4+d5+d6+d7+d13+d14+d15s5=c5+d8+d9+d10+d11+d12+d13+d14+d15

在编码时d[15:0]为信息码元,即需要进行保护的数据码,而c[5:0]为监督码元。由以上6个等式可知,监督码元c[5:0]应该由以下线性监督方程组确定:

{c0+d0+d1+d3+d4+d8+d9+d10+d13=0c1+d0+d2+d3+d5+d6+d8+d11+d14=0c2+d1+d2+d4+d5+d7+d9+d12+d15=0c3+d0+d1+d2+d6+d7+d10+d11+d12=0c4+d3+d4+d5+d6+d7+d13+d14+d15=0c5+d8+d9+d10+d11+d12+d13+d14+d15=0

由于线性分组码内的所有加减运算都是模2和运算,因此可以得到以下等价的线性方程组:

{c0=d0+d1+d3+d4+d8+d9+d10+d13c1=d0+d2+d3+d5+d6+d8+d11+d14c2=d1+d2+d4+d5+d7+d9+d12+d15c3=d0+d1+d2+d6+d7+d10+d11+d12c4=d3+d4+d5+d6+d7+d13+d14+d15c5=d8+d9+d10+d11+d12+d13+d14+d15

这样,由信息码d[15:0],根据上式即可计算得到监督码元c[5:0]。将信息码元和监督码元组合在一起,构成一个22 b的码组:

d15d14d13d12d11d10d9d8d7d6d5d4d3d2d1d0c5c4c3c2c1c0

并发送出去。

当接收到码组后,根据以下方程组得到伴随式s[5:0]:

{s0=c0+d0+d1+d3+d4+d8+d9+d10+d13s1=c1+d0+d2+d3+d5+d6+d8+d11+d14s2=c2+d1+d2+d4+d5+d7+d9+d12+d15s3=c3+d0+d1+d2+d6+d7+d10+d11+d12s4=c4+d3+d4+d5+d6+d7+d13+d14+d15s5=c5+d8+d9+d10+d11+d12+d13+d14+d15

然后根据伴随式s[5:0]的值,结合表1便可以确定发生误码的位置。当经组合运算后,仅当s[5:0]=“000000”时,数据才没有出错。

由于监督码元的存在,实现该EDAC模块时,硬件电路除了数据存储RAM外,还需要物理上分配一个独立的存储空间作为校验RAM,如图2所示。

当写入数据RAM时,根据所写入的16 b数据码,生成6 b的校验码,并将校验码写入到一个物理上与数据RAM相隔离的校验RAM中。

当从数据RAM读出数据时,同时从校验RAM中读出校验码,将校验码与数据码进行运算组合生成伴随式,根据伴随式判断数据是否出现错误。如果出现1位数据错误,则定位该错误比特数据并将之取反纠正,然后将纠正过的数据回写入数据RAM或校验RAM,使数据RM和校验RAM中存储的数据为正确的数据;如果出现2位错误,则指示错误error有效,该错误不能纠正,如图3所示。

3 仿真和计算分析

图4为EDAC模块写数据RAM的时序仿真图。

当向数据RAM的0x23A地址单元写入能谱数据0x6CA3的同时,根据校验码方程,计算得出数据0x2AC9的修正海明码编码结果为0x0C,在编码结果的最高2位补上“01”,在校验RAM的0x296地址处写入数据为0x4C。

如图5为EDAC模块读数据RAM的时序仿真结果。

当从数据RAM地址单元0x29A地址单元读出数据为0x6CA3时,同时从校验RAM的0x29A地址单元读出校验数据为0x0C,将0x6CA3和0x0C组合求出伴随式为“000000”,表明数据和校验数据都没有出现错误。当从数据RAM中读出的数据为0x6CAB,从校验RAM中读出的数据为0x0C,将0x6CAB和0x0C进行组合计算,计算出伴随式为“010011”,可以定位出第3bit出现错误,将该位取反,然后将取反纠正后的数据读出数据总线上,同时将取反纠正后的数据在回写入数据RAM和校验RAM中。同理,如果发现读出的校验RAM数据有1位出现错误,同样可以将该错误位取反纠正,并将之写回校验RAM中。如果发现校验RAM或数据RAM中出现2位错误,则error信号有效,该错误不能纠正。

设每一比特内存单元在单位时间内发生单粒子翻转的概率为σ,则每m比特内存单元发生n比特翻转的概率为:

ρ=Cmnσn(1-σ)m-n

采用修正(22,16)海明码方案后,可以纠正每22 b内存行单元中的单比特错误。对于一个22 b的存储单元,不发生SEU以及只有1位发生SEU的概率和,即为该内存单元的可靠性。因此,每22比特的汉明码内存单元可靠性为:

ρ=(1-σ)22+22σ(1-σ)21

在实际空间环境应用中,在静止轨道上SRAM的翻转率大约为4.6×10-7翻转/(位·天),则经过EDAC模块纠错编译码后,内存单元出现错误的概率为:

1-ρ=4.887890092675207×10-11

也就是说,在一天内,静态SRAM中一个22 b存储单元的1 b被打翻的概率为4.887 890 092 675 207×10-11,这将极大的改善SRAM抗单粒子翻转的性能。

4 结 语

本文采用修正海明码实现一个EDAC模块,用于缓解空天导弹上的静态存储器SRAM的单粒子翻转效应,该模块具有检测二位错误和检测定位并纠正1位错误的功能。通过仿真和计算分析,可以看到,采用该模块可以大幅度消减SEU效应对SRAM的影响,有助于保证数据和系统的稳定和可靠。同时,该EDAC模块也适用于E2PROM,FLASH等器件的抗单粒子翻转效应。由于模块由于采用硬件描述语言实现,可以方便的集成到FPGA/CPLD中,提高了设计的可移植性和灵活性[9]。

摘要:空间环境中存在大量的高能带电粒子,空天导弹自身的电子器件将会受到高能粒子的冲击影响,从而产生单粒子效应。研究分析了静态储存器在空间环境中最常发生的单粒子效应-单粒子翻转,采用修正海明码实现一个检错纠错模块,该模块可以检测数据存储单元的两位错误,检测定位并纠正数据存储单元的一位错误。通过仿真分析及计算,该方案可以很大程度上降低单粒子翻转效应对静态存储器的影响,具有很强的实用意义。

关键词:高能带电粒子,单粒子翻转,修正海明码,检错纠错

参考文献

[1]魏攀科,刁俊良.夺取制天权的太空武器:空天飞机[J].国防科技,2007(8):44-47.

[2]朱伟.空天飞机将改变传统防空作战模式[J].飞航导弹,2007(1):63-64.

[3]王丽君.空间电子学的单粒子效应空间电子技术[J].空间电子技术,1998(4):37-39.

[4]贺朝会.空间单粒子翻转频率预估方法研究[J].空间科学学报,2001,21(3):266-273.

[5]黄琳,陈第虎,梁宝玉,等.S698M SoC芯片中EDAC模块的设计与实现[J].中国集成电路,2008,17(9):50-54.

[6]黄影.星载COTS计算机的体系结构设计及其抗SEU研究[D].长沙:国防科技大学,2006.

[7]曹志刚,钱亚生.现代通信原理[M].北京:清华大学出版社,2005.

[8]樊昌信,张甫翊.通信原理[M].北京:国防工业出版社,2001.

[9]薛小刚,葛毅敏.Xilinx ISE 9.X FPGA/CPLD设计指南[M].北京:人民邮电出版社,2007.

[10]李建军.镍铬-镍硅热电偶特性分析与应用研究[J].火箭推进,2010,36(5):63-66.

3.静态随机存储器实验 篇三

◆实验名称:存储器的分配与回收算法实验 ◆仪器、设备:计算机

◆参考资料:操作系统实验指导书 ◆实验目的:

设计一个存储器的分配与回收算法管理方案,并编写模拟程序实现。◆实验内容:

1.模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。

2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。◆实验要求:

1. 详细描述实验设计思想、程序结构及各模块设计思路; 2. 详细描述程序所用数据结构及算法; 3. 明确给出测试用例和实验结果;

4. 为增加程序可读性,在程序中进行适当注释说明;

5. 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 6. 实验报告撰写要求结构清晰、描述准确逻辑性强;

实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。◆实验过程记录(源程序、测试用例、测试结果及心得体会等

实验代码如下:

#include

int work[10][2];

//作业名字 大小

int idle[10][2];

//空闲区大小 地址

int free[10][3];

//已分配区域的名字 地址 大小

int num=0,b=1,d,ch1,ch2;void init(){

idle[0][0]=1;idle[0][1]=100;

free[0][0]=0;free[1][1]=0;free[1][2]=0;

work[0][0]=0;work[0][1]=0;

for(int i=1;i <=9;i++){ //初始化数组

idle[i][0]=0;idle[i][1]=0;

free[i][0]=0;free[i][1]=0;free[i][2]=0;

work[i][0]=0;work[i][1]=0;

} }

void jishu(){ //求空闲单元数

for(int i=0;i <9;i++)

if(idle[i][1]!=0)

num++;}

void jishu1(){ //求作业数

for(int i=0;i <9;i++)

if(work[i][1]!=0)

b++;

}

void zuixian(){ //最先适应法

jishu();

for(int i=0;i

for(int j=i;j

if(idle[j][0]>idle[j+1][0]){

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

} }

void zuijia(){ //最佳适应法

num=0;

jishu();

for(int i=0;i

for(int j=i;j

if(idle[j][1]>idle[j+1][1]){

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

} }

void zuihuai(){ //最坏适应法

num=0;

jishu();

for(int i=0;i

for(int j=i;j

if(idle[j][1]

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

} }

void huishou(int name){ //回收进程函数

num=0;

b=0;

jishu();

jishu1();

int c=-1;

for(int k=0;k <=b;k++){

if(free[k][0]==name){

c=k;

break;

}

}

if(c==-1)cout <<“要回收的作业不存在!” <

else{

for(int i=0;i

//将空闲单元排序{不包括新回收的}

for(int j=i;j

if(idle[j][0]>idle[j+1][0]){

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

}

for(int q=0;q

if(free[c][1] <=idle[q][0]){

for(int j=num;j>=q;j--){

idle[j+1][0]=idle[j][0];

idle[j+1][1]=idle[j][1];

}

idle[j][0]=free[c][1];

idle[j][1]=free[c][2];

b++;

if(idle[j+1][0]==idle[j][0]+idle[j][1]){

idle[j][1]=idle[j][1]+idle[j+1][1];

for(int m=j+1;m <=num;m++){

idle[m][0]=idle[m+1][0];

idle[m][1]=idle[m+1][1];

}

idle[m][0]=0;

idle[m][1]=0;

b--;

}

if(idle[j-1][0]==idle[j][0]){

idle[j-1][1]=idle[j-1][1]+idle[j][1];

for(int n=j;j <=num;j++){

idle[n][0]=idle[n+1][0];

idle[n][1]=idle[n+1][1];

}

idle[n][0]=0;

idle[n][1]=0;

b--;

}

break;

}

}

if(ch2==1)zuixian();

if(ch2==2)zuijia();

if(ch2==3)zuihuai();

for(int p=c;c

free[c][0]=free[c+1][0];

free[c][1]=free[c+1][1];

free[c][2]=free[c+1][2];

work[c][0]=work[c+1][0];

work[c][1]=work[c+1][1];

}

cout<<“该进程已被成功回收!”<

} }

void fp(){

int tag=0;//判断空闲区与请求区大小

num=0;

b=0;

jishu();

jishu1();

for(int j=0;j

if(work[b][1]

free[b][0]=work[b][0];

free[b][1]=idle[j][0];

free[b][2]=work[b][1];

idle[j][0]=idle[j][0]+work[b][1];

idle[j][1]=idle[j][1]-work[b][1];

tag=1;

break;

}

else if(work[b][1]==idle[j][1]){

free[b][0]=work[b][0];

free[b][1]=idle[j][0];

free[b][2]=work[b][1];

tag=1;

for(int i=j;i <=num-1;i++){

idle[i][0]=idle[i+1][0];

idle[i][1]=idle[i+1][1];}

break;}

else tag=0;}

if(tag==0)cout <<“作业过大没有足够存储空间!” <

void print(){

num=0;

b=1;

jishu();

jishu1();

cout <<“已分配表为:” <

for(int i=0;i <=b;i++)

if(free[i][2]!=0)

cout <<“作业名:” <

cout <

cout <<“空闲区表为:” <

for(int j=0;j

if(idle[j][1]!=0)

cout <<“起始地址:” <

cout <

void main(){ //主函数运行上面定义的函数

init();

int n;

cout <<“1.分配空间;2.回收空间;” <

cin>>ch1;

cout <

cout <<“1.最先适应法;2.最佳适应法;3.最坏适应法;” <

cin>>ch2;

cout <

cout <<“请输入要分配内存的作业名及占用内存大小:”;

cin>>work[b][0]>>work[b][1];

cout <

if(ch2==1){

zuixian();

fp();

}

else if(ch2==2){

zuijia();

fp();}

else if(ch2==3){

zuihuai();

fp();}

print();}

cout <<“输入要回收的作业名:” <

cin>>n;

huishou(n);

} 实验截图:

成功回收时:

回收失败时:

实验体会:

上一篇:描写四季雨的段落下一篇:幼儿园大班下学期学期总结

相关推荐