欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用modulesim对FPGA的ip核ram进行仿真

程序员文章站 2024-02-23 17:00:34
...

1.第一步这次仿真的是ram,先说下ram原理,缓存数据。对数据进行缓存,然后通过接口把数据传输出去。

利用modulesim对FPGA的ip核ram进行仿真

 

 

 

 

 

 

 

2.这次仿真的是简单双口ram核,在ise的图形化设置界面可以看到。所以不再次赘述,但是仿真的时候,一定要保证对应位宽相同。是8位就是8位,少了多了都不行,例化的时候,我改小的时候,数据一直传输不出来,输出的数据一直处于高阻态。其他的信号都是可行的。错误的示范,如下图所示。

利用modulesim对FPGA的ip核ram进行仿真

            可以看到输出的数据处于无效状态,说明ip核ram有问题,可能是线没链对,也可能是别的原因。所以需要调开ram看波形,发现输入口的数据压根就没有输进去,情况如下

利用modulesim对FPGA的ip核ram进行仿真

 

  

 

             这时候就需要去检查程序了,我找了好久,潜意识任务我申请为8的位宽,只用5位宽是可以的,事实上,仿真的不允许的,一个线必须对应一根线,也就是仿真产生的数据,必须对应位宽,必须一致。

3.仿真程序

module sim_ram(
		
		input wire sclk,
		input wire rst_n,

		output [7:0]out_data

);

reg [7:0]	data_in;    //产生数据,当时仿真位宽[4:0]导致信号悬空处于高阻态
reg  		w_en;		//写使能
reg  		r_en;		//读使能
reg [5:0]	addra_in;  //写地址产生
reg [7:0]   addra_out; //读地址产生


aaa@qq.com(posedge sclk or negedge rst_n)   //产生数据 0~63
		if(!rst_n)
			data_in<=10'd0;
		else data_in<=data_in+1'b1;
		
aaa@qq.com(posedge sclk or  negedge rst_n)   //产生写使能;工程应用的时候,如果拉高写使能会覆盖原始数据
		if(!rst_n)
			w_en<=1'b1;
		else if(addra_in==10'd63)
			w_en<=1'b0;
			else if(addra_out==10'd63)  //写使能拉低的条件是跟°地址写地址有关
			    w_en<=1'b1;	

aaa@qq.com(posedge sclk or negedge rst_n)  //产生写地址
		if(!rst_n)	
			addra_in<=10'd0;
		else if (w_en==1'b0)   //	清零条件没写对当时写的是高状态   
				addra_in<=10'd0;
			else if (w_en==1'b1)  
					addra_in<=addra_in+1'b1;
					
always @(posedge sclk or negedge rst_n)  //产生读使能
		if(!rst_n)
		 r_en<=1'b0;
		 else if(w_en==1'b1)	
		 	r_en<=1'b0;	
		 else if(w_en==0)
		 	r_en<=1'b1;
				
aaa@qq.com(posedge sclk or negedge rst_n)    //产生读地址
	if(!rst_n)
		addra_out<=10'd0;
		else if(r_en==1'b0)
			addra_out<=10'd0;
			else if(r_en==1'b1)
				addra_out<=addra_out+1'b1;

ram_64 ram_64_inst(
  .clka				(sclk), // input clka
  .wea				(w_en), // input [0 : 0] wea
  .addra			(addra_in), // input [5 : 0] addra
  .dina				(data_in), // input [7 : 0] dina
  .clkb				(sclk), // input clkb
  .addrb			(addra_out), // input [5 : 0] addrb
  .doutb			(out_data) // output [7 : 0] doutb
);
endmodule