RISCV模拟器中关于读写存储器部分的实现

#define BUFF_SIZE 1024*1024*8
#include "stdio.h"

static unsigned int ins_buff[BUFF_SIZE] ; 
static unsigned int len = 0 ;
static unsigned char  RAM_B0[BUFF_SIZE] ; 
static unsigned char RAM_B1[BUFF_SIZE] ; 
static unsigned char RAM_B2[BUFF_SIZE] ; 
static unsigned char RAM_B3[BUFF_SIZE] ;


static int file_2_ins_buff(char *fn){
	int r,i ;	FILE *fp ; 
	fp = fopen( fn , "rb" );	
	if (fp==NULL) printf("can not open file %s\n",fn);
	if (fp==NULL) exit(1);
	r = fread( ins_buff , 1, BUFF_SIZE ,fp );
	fclose (fp);
	len = r>>2;
	//printf("get file size is %d\n", len );
		for( i = 0 ;i<len ;++i ){
             if (debug())printf("%08x : %08x \n",i<<2, ins_buff[i] );
             }
	return r ;	
}

static int init_MEM_by_ins_buff(){
	int i ;
	for( i = 0 ;i<len ;++i ){
    if (debug())      printf("%08x :  ",ins_buff[i] );
	RAM_B0[i] = ins_buff[i] & 0xff ;
	RAM_B1[i] = ins_buff[i]>>8 & 0xff ;
	RAM_B2[i] = ins_buff[i]>>16 & 0xff ;
	RAM_B3[i] = ins_buff[i]>>24 & 0xff ; 
    if (debug())printf("%08x : %02x  %02x  %02x  %02x \n",i<<2,RAM_B3[i],RAM_B2[i],RAM_B1[i],RAM_B0[i]);	
	}
}

int load_prog(char *fn )  {
    file_2_ins_buff(fn) ; 
    init_MEM_by_ins_buff();
}
 
unsigned int get_ins(unsigned int PC){
unsigned int t;
unsigned char a[4] ; 
	t =PC >>2 ;
	a[3] = RAM_B3[t];
	a[2] = RAM_B2[t];
	a[1] = RAM_B1[t];
	a[0] = RAM_B0[t];
	t=a[3];t<<=8;
	t|=a[2];t<<=8;
	t|=a[1];t<<=8;
	t|=a[0];	
	return t;	
} 

unsigned int read_memory_8bit(unsigned int addr){
	unsigned  int addr32,idx;
	addr32  =  addr >>2 ;
	idx = addr % 4 ;
	if      (idx==0) return RAM_B0[addr32];
	else if (idx==1) return RAM_B1[addr32];
	else if (idx==2) return RAM_B2[addr32];
	else if (idx==3) return RAM_B3[addr32];
}

void write_memory_8bit (unsigned int val,unsigned int addr){
	unsigned char d8  ;
	unsigned  int addr32,idx;
	addr32  =  addr >> 2 ;
	idx = addr % 4 ;
	d8 = val &0xff ;
    if      (idx==0) { RAM_B0[addr32] = d8; } 
	else if (idx==1) { RAM_B1[addr32] = d8; }
	else if (idx==2) { RAM_B2[addr32] = d8; }
	else if (idx==3) { RAM_B3[addr32] = d8; }
//         printf("                                                 U8 IO WR: %08x ,%08x\n",addr,val);	
}



unsigned int read_memory_16bit(unsigned int addr){
	unsigned  int addr32,idx;
	unsigned char hi,lo;
	unsigned int r ; 
	addr32  =  addr >>2;
	idx = addr % 4 ;
	if      (idx==0) { hi = RAM_B1[addr32] ;lo =  RAM_B0[addr32]; }
	else if (idx==2) { hi = RAM_B3[addr32] ;lo =  RAM_B2[addr32] ; };
	r = hi ;	r<<=8;	r|=lo;
	return r ;
}

void write_memory_16bit (unsigned int val,unsigned int addr){
	unsigned  int addr32,idx;
	unsigned char hi,lo;
	unsigned int r ; 
	lo = val & 0xff;	val >>= 8 ;	hi = val& 0xff ;	addr32  =  addr >>2 ;	idx = addr % 4 ;
	if      (idx==0) { RAM_B1[addr32] = hi ; RAM_B0[addr32] = lo ;}
	else if (idx==2)  { RAM_B3[addr32] = hi ; RAM_B2[addr32] = lo ;}
      //   printf("                                                 U16 IO WR: %08x ,%08x\n",addr,val);
	return   ;
}




unsigned int read_memory_32bit(unsigned int addr){
	unsigned  int addr32,idx; 
	unsigned int r ; 
	addr32  =  addr >> 2; 
	r = RAM_B3[addr32];r<<=8;
	r |= RAM_B2[addr32];r<<=8;
	r |= RAM_B1[addr32];r<<=8;
	r |= RAM_B0[addr32]; 
if (debug())	printf("read memory[ %08x ]= %08x \n",addr,r);
	return r ;
}

void write_memory_32bit (unsigned int val,unsigned int addr){
	unsigned  int addr32,idx; 
	unsigned int t ; 
	if (addr <= (BUFF_SIZE >>2))
    {
	addr32  =  addr >> 2; 
	t = val ;
	RAM_B0[addr32] = t &0xff ; t>>=8;
	RAM_B1[addr32] = t &0xff ; t>>=8;
	RAM_B2[addr32] = t &0xff ; t>>=8;
    RAM_B3[addr32] = t &0xff ;
    }
    else 
    {
		 printf("%c",(char )(val&0xff)); 
    }
	return ;	
} 

其中处理器读写存储器部部分在之前文章有详细分析,现在相当于是C语言版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CPU设计部分实验五是关于存储器实现存储器是计算机用于存储和提取数据的地方,它是计算机的重要组成部分。 在实验,我们需要设计并实现一个存储器模块。存储器模块是由多个存储单元构成的,每个存储单元可以存储一个固定大小的数据。我们可以通过地址来访问存储单元的数据。在实验,我们需要选择合适的存储器类型、存储单元容量和地址位数。 在设计存储器模块时,我们需要考虑以下几个方面。首先,我们需要确定存储器的类型。常见的存储器类型有随机存取存储器(RAM)和只读存储器(ROM)。RAM可以通过读写操作来存储和提取数据,而ROM只能读取数据。我们需要根据实验的需求选择合适的存储器类型。 其次,我们需要确定每个存储单元的容量。容量决定了每个存储单元可以存储的数据量。通常,存储单元的容量是以比特(bit)为单位进行衡量的。在实验,我们需要根据数据的大小来选择合适的存储单元容量。 最后,我们还需要确定存储器的地址位数。地址位数决定了我们可以使用的地址数目。地址的位数决定了存储器的寻址范围。在实验,我们需要根据存储器的容量和存储单元的大小来选择合适的地址位数。 通过设计和实现存储器模块,我们可以在CPU完成数据的存储和提取操作。这对于计算机的正常运行是至关重要的。实验五的完成将有助于我们更好地理解存储器的工作原理和在计算机系统的重要作用。 ### 回答2: CPU设计部分实验五是关于存储器实现的实验。存储器是计算机用于存储指令和数据的硬件组件,它在CPU起着重要的作用。 在这个实验,我们需要实现一个简单的存储器模块。存储器由一组连续的存储单元组成,每个存储单元可以存储一个固定大小的数据。我们需要使用Verilog HDL语言编写代码来描述存储器的行为。 首先,我们需要定义存储器的输入和输出端口。存储器的输入端口包括读写控制信号和地址信号,输出端口包括读取的数据。 然后,我们需要根据输入的控制信号和地址来实现存储器的功能。当读写控制信号为读取时,我们需要根据给定的地址从存储单元读取相应的数据,并将其输出。当读写控制信号为写入时,我们需要将输入的数据写入到指定的地址。 为了实现存储器的功能,我们可以使用Verilog HDL的内存模块。内存模块可以方便地实现存储器读写操作。 最后,我们需要对实现存储器模块进行验证。可以编写一些测试用例,并使用模拟器进行仿真,验证存储器读写功能是否正确。 总结起来,CPU设计部分实验五是一个关于存储器实现的实验。通过实现一个简单的存储器模块,我们可以加深对存储器的理解,并掌握使用Verilog HDL语言进行硬件描述的技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值