一、Single port RAM端口,写优先的波形图,延迟1个周期,写完之后,下个时钟周期立马读出来
文件代码
`timescale 1ns / 1ps
module ram_out(
input sysclk,
input rst_n,
output [7:0]douta
);
reg wea;
reg [3:0]addra;
reg [7:0]adina;
reg ena;
always@(posedge sysclk)
if(!rst_n)
begin
wea<=0;
addra<=0;
adina<=0;
ena<=0;
end
else
begin
if(addra==15)begin
ena<=0;
wea<=0;
adina<=adina;
end
else
begin
ena<=1;
wea<=1;
addra<=addra+1;
adina<=adina+1;
end
end
blk_mem_test ram_test (
.clka(sysclk), // input wire clka
.ena(ena), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(addra), // input wire [3 : 0] addra
.dina(adina), // input wire [7 : 0] dina
.douta(douta) // output wire [7 : 0] douta
);
endmodule
运行代码
`timescale 1ns / 1ps
module ram_out_simulation();
reg sysclk;
reg rst_n ;
wire [7:0]douta;
ram_out ram_out_u(
.sysclk (sysclk),
.rst_n (rst_n),
.douta (douta)
);
initial
begin
sysclk = 0;
end
always #10 sysclk=~sysclk;
initial
begin
#10 rst_n=1;
#45 rst_n=0;
#90 rst_n=1;
end
endmodule
二、Single port RAM端口,读优先的波形图,等写完之后,再读出来(由于之前无值)
仿真波形
文件代码
`timescale 1ns / 1ps
module ram_out(
input sysclk,
input rst_n,
output [7:0]douta
);
reg wea;
reg [3:0]addra;
reg [7:0]adina;
reg ena;
always@(posedge sysclk)
if(!rst_n)
begin
wea<=0;
addra<=0;
adina<=0;
ena<=0;
end
else
begin
ena<=1;
wea<=1;
addra<=addra+1;
adina<=adina+1;
end
blk_mem_test ram_test (
.clka(sysclk), // input wire clka
.ena(ena), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(addra), // input wire [3 : 0] addra
.dina(adina), // input wire [7 : 0] dina
.douta(douta) // output wire [7 : 0] douta
);
endmodule
三、Single port RAM端口,无更改模式,查看波形图,由于之前未附值,所以一直保持初始化0
在无更改模式下,写入操作期间输出锁存保持不变,数据任然是以前的读取数据,不受同一个端口的写入操作的影响。
建议先赋值再看,否则效果不大