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