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 1task_wr_ram(12'd2, 8'd2); //address 2 write 2task_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;endinitial 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);forkram_wr=1;ram_addr=t_addr;ram_din=t_data;join@(posedge clk);forkram_wr=0;ram_addr=12'hzzz;ram_din=8'hzz;joinendendtask endmodule四、ModelSim仿真
五、fork...join的用法
如果希望在仿真的某一时刻同时启动多个任务,可以使用fork....join语句。例如,在仿真开始的 100 ns 后,希望同时启动发送和接收任务,而不是发送完毕后再进行接收,如下所示:
initial
begin #100 ; fork /*并行执行 */Send_task ;Receive_task ; joinEnd