FPGA学习-配置双口ram(嵌入式块ram应用)

实验现象:

        用for循环模拟发送数据,FPGA接收后存储在双口ram中。延时一段时间后,从ram中按地址顺序提取数据,用for循环模拟FPGA发送数据。

第一步:

FPGA学习-配置双口ram(嵌入式块ram应用)_第1张图片

                        ​​​​​​​        FPGA学习-配置双口ram(嵌入式块ram应用)_第2张图片 

         一个“写”地址,一个“数据”端口,当“写请求”wren为高电平时,数据写到地址中去;

        “读”不需要请求,直接读取就OK。

 第二步:IP核配置

FPGA学习-配置双口ram(嵌入式块ram应用)_第3张图片

第三步:

        将右边出现的IP/dpram.qip文件设置为Top顶层文件;

        现在需要将.v文件添加进来,方便例化:ctrl+O-->进入之前保存到的IP文件夹-->打开dpram.v-->copy端口;

第四步:testbench编写

`timescale 1ns/1ns
`define clock_period 20
module dpram_tb;
	reg	       clock;
	reg	[7:0]  data;
	reg	[7:0]  rdaddress;
	reg	[7:0]  wraddress;
	reg	       wren;
	wire	[7:0]  q;

	integer i;                //for循环中的参量i

	dpram dpram(
		.clock(clock),
		.data(data),
		.rdaddress(rdaddress),
		.wraddress(wraddress),
		.wren(wren),
		.q(q)
	);

	initial clock=1;
	always #(`clock_period/2) clock=~clock;
	initial begin
		data=0;
		wren=0;
		wraddress=20;
		rdaddress=30;
		#(`clock_period*20);

		for(i=0;i<=10;i=i+1) begin   //for循环写入数据
			wren=1;
			data=255-i;
			wraddress=i;
			#`clock_period;
		end
		wren=0;
		#(`clock_period*20);

		for(i=0;i<=10;i=i+1) begin   //for循环读出数据
			rdaddress=i;
			#`clock_period;
		end 
		#(`clock_period*10);
		$stop;
	end
endmodule

第五步:波形图分析时序

FPGA学习-配置双口ram(嵌入式块ram应用)_第4张图片

图1.前仿真(故意有1ns延时)写入数据FPGA学习-配置双口ram(嵌入式块ram应用)_第5张图片

图2.前仿真(故意有1ns延时)读出数据FPGA学习-配置双口ram(嵌入式块ram应用)_第6张图片

图3.后仿真(无1ns延时)写入数据FPGA学习-配置双口ram(嵌入式块ram应用)_第7张图片

 图4.后仿真(无1ns延时)读出数据​​​​​​​

结论:

        通过分析波形可知,给出地址后,“读”要延时2拍才能读出数据。因此如果给出地址就读出数,当时读出的数据是不对的,取不到该地址的数据。

        所以在读取ram中地址数据时需要注意这个2拍的延时。

FPGA学习-配置双口ram(嵌入式块ram应用)_第8张图片

 

你可能感兴趣的:(fpga开发,数字通信,串口通信,fpga)