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

一个“写”地址,一个“数据”端口,当“写请求”wren为高电平时,数据写到地址中去;
“读”不需要请求,直接读取就OK。
第二步:IP核配置

第三步:
将右边出现的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
第五步:波形图分析时序

图1.前仿真(故意有1ns延时)写入数据
图2.前仿真(故意有1ns延时)读出数据
图3.后仿真(无1ns延时)写入数据
图4.后仿真(无1ns延时)读出数据
结论:
通过分析波形可知,给出地址后,“读”要延时2拍才能读出数据。因此如果给出地址就读出数,当时读出的数据是不对的,取不到该地址的数据。
所以在读取ram中地址数据时需要注意这个2拍的延时。

本文详细描述了一次实验,通过FPGA的for循环操作,观察数据在双口RAM中的写入与读取过程,发现读取存在2拍延时。关键步骤包括配置IP核、编写testbench并分析波形。结论强调了读取时的延时注意事项。
&spm=1001.2101.3001.5002&articleId=121932999&d=1&t=3&u=52e3dbf55d7c49a89ecec050f742c447)
1万+

被折叠的 条评论
为什么被折叠?



