【FPGA】RAM伪双端口

【FPGA】RAM伪双端口

  • 一、RAM
    • 1、什么是RAM
    • 2、作用
    • 3、读写速率
    • 4、ZTNQ7020 block RAM资源
    • 5、数据宽度配置
    • 6、端口介绍
  • 二、RAM配置
    • 1、配置界面介绍:
    • 2、参数设置
  • 三、RAM驱动方法
    • 1.编写RAM驱动模块
    • 2、顶层文件编写
  • 四、实验结果


一、RAM

RAM简介:

1、什么是RAM

随即存取存储器(Random Access Memory,RAM)

2、作用

可以把数据随时存储到任一指定的数据储存单元,也可以随时从储存单元中读取数据,在FPGA中通常作用:
用来存放程序及执行过程中产生的数据和运算结果等。

3、读写速率

读写速率由时钟频率决定

4、ZTNQ7020 block RAM资源

ZYNQ7020拥有140个BRAM,每一个BRAM为36kb

5、数据宽度配置

32K × 1,
16K × 2,
8K × 4,
4K × 9 (or x 8),
2K ×18 (or x 16),
1K × 36 (or x 32),
512 × 72 (or x 64)

6、端口介绍

单端口:

读写数据不能同时进行

伪双端口:

一个端口写一个端口读(固定)

真双端口:

一个端口读(写)一个端口写(读)(不固定)


二、RAM配置

1、配置界面介绍:

【FPGA】RAM伪双端口_第1张图片

参数说明:

Interface Type:

RAM接口总线。这里保持默认,选择Native 接口类型(标准RAM接口总线)。

Memory Type:

存储器类型。可配置为Single Port RAM(单端口RAM)、Simple Dual Port RAM (伪双端口RAM)、True Dual Port RAM(真双端口RAM)、Single Port RAM(单端口ROM)和Dual Port ROM(双端口ROM)

ECC Options:

纠错能力选项,单端口RAM不支持ECC。

Write Enable:

字节写使能选项,勾中后可以单独将数据的某个字节写入RAM中。

Algorithm Options:

算法选项。可选择Minimum Area(最小面积)、Low Power(低功耗)和Fixed Primitives(固定的原语)

2、参数设置

【FPGA】RAM伪双端口_第2张图片
这里的数据参数选择10 x 1024,其他全部选择默认即可。

三、RAM驱动方法

1.编写RAM驱动模块

驱动程序设计思路:

将RAM一直进行使能使其一直处于写入数据状态。

驱动程序:

`timescale 1ns / 1ps
module RAM(
    input                           clk     ,//system clock
    input                           rst_n   ,//reset
    input       [7:0]               data    ,//input data
    input                           done    ,//done
    input                           flag    ,//flag
    output      [7:0]               doutb    //RAM output data
);
reg                                 en      ;//energy
reg                                 wea     ;//write enable
reg             [9:0]               addra   ;//address A
reg             [7:0]               dina    ;//input data A
reg             [9:0]               addrb   ;//address B
//将RAM使能
always@(posedge clk)
    if(!rst_n)  
        en <= 0;
    else
        en <= 1;
//写入数据
always@(posedge clk)
    if(!rst_n)//初始化输入数据
        begin
            wea   <= 0;//read
            addra <= 0;
            dina  <= 0;
        end
    else if(done == 1)
        begin
            wea   <= 1;//write
            addra <= addra + 1;//地址+1
            dina  <= data;//将data赋值为RAM input data
        end
    else
        begin
            wea   <= 0;//read
            addra <= addra;//address
            dina  <= 0;//使RAM input data清零
        end
//当触发信号flag触发时(flag==1)开始读取数据。
always@(posedge clk)
    if(!rst_n)  
        addrb <= 0;
    else if(flag == 1)
        addrb <= addrb + 1;

IP例化:

blk_mem_gen_0 ram_u (
  .clka                             (clk    ),          // input wire clka
  .ena                              (en     ),          // input wire ena
  .wea                              (wea    ),          // input wire [0 : 0] wea
  .addra                            (addra  ),          // input wire [9 : 0] addra
  .dina                             (dina   ),          // input wire [7 : 0] dina
  .clkb                             (clk    ),          // input wire clkb
  .enb                              (en     ),          // input wire enb
  .addrb                            (addrb  ),          // input wire [9 : 0] addrb
  .doutb                            (doutb  )           // output wire [7 : 0] doutb
);

2、顶层文件编写

编写思路:

通过串口通信进行数据传输(TX发送数据,RX读取数据),将数据存放到RAM中,通过按键将flag信号置为高电平对RAM中数据进行读取操作。

顶层模块:

`timescale 1ns / 1ps
module TOP(
    input               clk         ,
    input               rst_n       ,
    input               rx          ,
    input               key         ,
    output              tx          
);
wire        [7:0]       DATA        ;
wire                    done        ;
wire                    flag        ;
wire        [7:0]       doutb       ;

例化RAM模块:

RAM u2(
    .clk                (clk    )   ,
    .rst_n              (rst_n  )   ,
    .data               (DATA   )   ,
    .done               (done   )   ,
    .flag               (flag   )   ,
    .doutb              (doutb  )   
    );

RX 以及TX模块例化:


RX u0(
    .clk                (clk    )   ,
    .rst_n              (rst_n  )   ,
    .rx                 (rx     )   ,
    .DATA               (DATA   )   ,
    .done               (done   )  
    );

TX u1(
    .clk                (clk    )   ,
    .rst_n              (rst_n  )   ,
    .done               (flag   )   ,
    .DATA               (doutb  )   ,
    .tx                 (tx     )    
    );

例化按键消抖模块:

key u3(
    .clk                (clk    )   ,
    .rst_n              (rst_n  )   ,
    .key                (key    )   ,
    .flag               (flag   )   
    );

四、实验结果

实验截图:

【FPGA】RAM伪双端口_第3张图片
使用按键按下向串口发送数据(接收次数为按键发送数据的次数),发送区为串口向RAM发送的数据。

你可能感兴趣的:(fpga开发)