FPGA——RAM的使用与仿真

RAM的使用

  1. 嵌入式存储器结构由一列列 M9K 存储器模块组成,通过对这些 M9K 存储器模块进行配置,可以实现各种存储器功能,例如: RAM、移位寄存器、 ROM 以及 FIFO 缓冲器。

  2. 使用quartus的定制ip核定制一个深度为256,宽度为8位的双端口(读写)RAM存储器,并对存储器进行仿真

  3. //仿真代码
    `timescale 1ns/1ns
    `define clk_period 20
    
    module tb_ram_2port();
    
    reg clk;
    reg [7:0]data;
    reg [7:0]raddr;
    reg [7:0]waddr;
    reg wren;
    
    wire [7:0]q;
    
    ram_2port	ram_2port (
    	.clock ( clk ),
    	.data ( data),
    	.rdaddress ( raddr ),
    	.wraddress ( waddr ),
    	.wren ( wren ),
    	.q ( q )
    	);
    
    initial clk = 1'b1;
    always#(`clk_period/2) clk = ~clk;
    
    integer i=0;
    
    initial begin
    	data = 0;
    	raddr = 255;//这是一个点
    	waddr = 0;
    	wren = 0;
    	#(`clk_period*10+1);//关键在这个+1上
    	for(i=0; i<=5; i=i+1)begin
    		wren = 1'b0;
    		waddr = i;
    		data = {$random}%256;
    		#(`clk_period);
    	end
    	for(i=6; i<=15; i=i+1)begin
    		wren = 1'b1;
    		waddr = i;
    		data = {$random}%256;
    		#(`clk_period);
    	end
    	wren = 1'b0;
    	#200;
    	for(i=0; i<=15; i=i+1)begin
    		raddr = i;
    		#(`clk_period);
    	end
    	#200;
    	$stop;
    end
    endmodule 
    
    
  4. ram仿真

  5. 从上图可以看出,在wren为低电平时,数据是写不进去的,并且读写地址可以随机的指定

  6. ram仿真细节2

  7. ram仿真细节1

  8. 上图可以看出读地址改变后在时钟上升沿被采样,数据在采样后的下一拍时钟输出

  9. 对比6中的图片,wren = 0,数据是141,地址是5,在7中的图片可以看到,读取地址为5的数据读出数据为0,因为数据并没有被写入,ram中保存着初始值0

  10. 读地址与时钟沿错开了一点,写地址也同样向后错开一点,这是应为在仿真时#(`clk_period*10+1); 这个+1模拟的是实际情况,或者这么说,信号在传播是总是有延迟,不可能恰好在时钟沿时数据变换采样到新数据,所以需要+1

posted @ 2020-06-04 21:27  嗨喽来了  阅读(1328)  评论(0)    收藏  举报