[FPGA入门笔记](六):基本存储单元RAM学习

简介

今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。
开发板输入时钟为50MHz
单口和双口指的是地址线数据线的组数。
单口RAM只有一组数据线和地址线,读写不能同时进行
双口RAM有两组地址线和数据线,读写可以同时进行

一、单端口RAM设计

RAM存储器是一种可以暂时存储数据或信号的常用器件,它通常由锁存器阵列构成。在时钟上升沿,采集地址,输入数据,执行相关控制信息。如果写使能有效,则执行一次写操作。
在这里插入图片描述
上代码:

`timescale 1ns/1ps
module single_ram#(
    parameter   ADDR_WIDTH  = 4,
    parameter   ADDR_LENGTH = 12,
    parameter   DATA_WIDTH  = 4
    )(
    input   clk,
    input   wr_en,
    input   rd_en,
    input   [DATA_WIDTH-1:0] din,
    input   [ADDR_WIDTH-1:0] addr,
    
    output reg  [DATA_WIDTH-1:0] dout
    );

    reg   [DATA_WIDTH-1:0] ram [ADDR_LENGTH-1:0]; 

    always@(posedge clk)
    begin
        if(rd_en)
        begin
            dout <= ram[addr];
        end
        else
        begin
            if(wr_en)
            begin
                ram[addr] <= din;
            end
        end
    end

endmodule

二、伪双端口RAM设计

一个端口只读,一个端口只写;
在这里插入图片描述
上代码:

`timescale 1ns/1ps
module simple_dual_ram#(
    parameter   DATA_WIDTH = 4,
    parameter   ADDR_WIDTH = 8,
    parameter   ADDR_LENGTH= 256
    )(
    input   clk,
    input   rst_n,
    
    input   wr_en,
    input   rd_en,
    input   [ADDR_WIDTH-1:0]    addr_w,
    input   [ADDR_WIDTH-1:0]    addr_r,
    input   [DATA_WIDTH-1:0]    din,

    output  [DATA_WIDTH-1:0]    dout
    );

    reg     [DATA_WIDTH-1:0]    data_reg;
    reg     [DATA_WIDTH-1:0]    ram     [ADDR_LENGTH-1:0];

    generate
        genvar i;
        for(i=0;i<ADDR_LENGTH-1;i=i+1)
        begin
            always@(posedge clk or negedge rst_n)
            begin
                if(!rst_n)
                    ram[i] <= {DATA_WIDTH{1'b0}};
                else
                    ram[i] <= ram[i];
            end
        end
    endgenerate

    always@(posedge clk)
    begin
        if(wr_en)
            ram[addr_w] <= din;
        else
            ram[addr_w] <= ram[addr_w];
    end

    always@(posedge clk)
    begin
        if(rd_en)
            data_reg <= ram[addr_r];
        else
            data_reg <= ram[addr_r];
    end
    assign  dout = data_reg;
    
endmodule


三、双端口RAM

有两组地址线和数据线,两组都可以进行读写。
在这里插入图片描述
没代码

四、伪双端口RAM和FIFO

RAM有地址线和数据线,可通过地址线对存储单元进行寻址,读取是随机的。RAM可分为:单口RAM和双口RAM,双口RAM又可以分为真双口RAM和伪双口RAM。
FIFO为先进新出,没有地址线,无法对存储单元进行寻址。FIFO的读写可同时进行,一个端口只读,一个端口只写。
FIFO可分为异步FIFO和同步FIFO,同步FIFO使用同一个时钟信号进行数据的读写,异步FIFO采用两个不同的时钟信号进行读写,即两个时 钟同频率不同相位,或者不同频率都算是不同时钟信号。
FIFO主要用于数据的缓冲,异步FIFO主要用于跨时钟信号的同步。
FIFO有两个基本的规则:
1.已经满了不能再写,
2.已经空了不能再读。
在这里插入图片描述

整理不易,希望对同学有帮助,加油

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA(现场可编程门阵列)是一种灵活可重构的集成电路设备,可以通过编程来实现不同的电路逻辑。而RAM(随机存取存储器)是一种电脑内存,用于暂时存储数据。 要将图片存储到FPGARAM中,首先需要将图片的数据转换为适合RAM存储的格式。通常情况下,图片会以像素的形式表示,每个像素包含了红、绿、蓝三个颜色通道的信息。 在FPGA中,RAM通常被组织成一个多维数组,可以通过地址访问其中的每个元素。要存储图片,可以将每个像素的颜色值存储在RAM的不同位置上。例如,可以将图片的第一个像素的颜色值存储在RAM的第一个地址上,第二个像素的颜色值存储在RAM的第二个地址上,以此类推。 在将图片数据存储到RAM之前,需要先将FPGA进行初始化和配置,以及设置RAM的大小和工作模式。然后,可以通过FPGA开发工具编写相应的代码,将图片数据加载到FPGARAM中。加载图片数据的代码可以使用存储器初始化语句(如Verilog中的内存初始化语句$readmemh)或者FPGA开发工具提供的内置函数。 一旦图片数据成功存储到FPGARAM中,就可以对其进行处理。根据具体需求,可以使用FPGA的逻辑电路对图片数据进行加工、转换或处理。例如,可以对图片进行滤波、图像增强等操作,也可以对图片进行压缩和解压缩。 总结来说,将图片存储到FPGARAM中需要转换图片的数据格式并通过FPGA开发工具编写相应的代码,以将数据加载到RAM中。之后,可以使用FPGA的逻辑电路对图片进行各种处理和操作。这样的配置可以让FPGA在性能和功耗方面都更加高效和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值