基于M9K块的单口RAM配置仿真实验

FPGA器件中通常嵌入一些用户可配置的存储块,Altera的Cyclone系列器件也不例外。Cyclone器件的嵌入式称之为M4K存储块,这些存储块是独立于FPGA本身的逻辑资源的。也就是说如果用户只使用这些存储器,那么FPGA中的纯逻辑资源消耗可以为零。Cycone的M4K不仅不消耗额外的FPGA逻辑资源,而且可以拿来当RAM用的,标称速率可以达到250M,这个速率不是在cyclone系列的每个器件都能达到,资源少如EP1C3估计就困难,但100M的读写速度还是没有问题的.

一、实验步骤

三、TestBench编写

`timescale 1 ns/ 1 ns
module m9kram_vlg_tst();

reg clk;
reg [11:0] ram_addr;
reg [7:0] ram_din;
reg ram_wr;
reg rst_n;                                     
wire [7:0]  ram_dout;                     
m9kram i1 (

 .clk(clk),
 .ram_addr(ram_addr),
 .ram_din(ram_din),
 .ram_dout(ram_dout),
 .ram_wr(ram_wr),
 .rst_n(rst_n)
);
initial                                               
begin                                                 
rst_n=0;
ram_wr=0;  
ram_addr=12'hzzz;
ram_din=8'hzz;
#200;
rst_n=1;

#3_000; //Delay 3us

task_wr_ram(12'd0, 8'd0); //address 0 write 0  
task_wr_ram(12'd1, 8'd1);  //address 1 write 1
task_wr_ram(12'd2, 8'd2);  //address 2 write 2
task_wr_ram(12'd3, 8'd3);  //address 3 write 3              

@(posedge clk); 
ram_addr=12'd0; //read address 0
@(posedge clk); 
ram_addr=12'd0; //read address 1
@(posedge clk);
ram_addr=12'd0; //read address 2
@(posedge clk);
ram_addr=12'd0; //read address 3
#100;
$stop;
end  

initial begin
clk=0;
forever
#5 clk=~clk;
end   
//write ram task                                            
task task_wr_ram;
input[11:0] t_addr;
input[7:0] t_data;
begin
@(posedge clk);
fork
ram_wr=1;
ram_addr=t_addr;
ram_din=t_data;
join
@(posedge clk);
fork
ram_wr=0;
ram_addr=12'hzzz;
ram_din=8'hzz;
join
end
endtask               
endmodule

四、ModelSim仿真

五、fork...join的用法

如果希望在仿真的某一时刻同时启动多个任务,可以使用fork....join语句。例如,在仿真开始的 100 ns 后,希望同时启动发送和接收任务,而不是发送完毕后再进行接收,如下所示:

initial
begin
  #100 ;
  fork /*并行执行 */
Send_task ;
Receive_task ;
  join
End

原文地址:https://www.cnblogs.com/spartan/p/2032056.html