天天看點

[FPGA入門筆記](六):基本存儲單元RAM學習

簡介

今天購買了AXLINX AX7020的開發闆,從今天開始每一個例程都要做文檔記錄,為自己加油。

本實驗,基于ALINX AX7020開發闆,晶片為xc7z020clg400-2。

開發闆輸入時鐘為50MHz

單口和雙口指的是位址線資料線的組數。

單口RAM隻有一組資料線和位址線,讀寫不能同時進行

雙口RAM有兩組位址線和資料線,讀寫可以同時進行

一、單端口RAM設計

RAM存儲器是一種可以暫時存儲資料或信号的常用器件,它通常由鎖存器陣列構成。在時鐘上升沿,采集位址,輸入資料,執行相關控制資訊。如果寫使能有效,則執行一次寫操作。

[FPGA入門筆記](六):基本存儲單元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設計

一個端口隻讀,一個端口隻寫;

[FPGA入門筆記](六):基本存儲單元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

有兩組位址線和資料線,兩組都可以進行讀寫。

[FPGA入門筆記](六):基本存儲單元RAM學習

沒代碼

四、僞雙端口RAM和FIFO

RAM有位址線和資料線,可通過位址線對存儲單元進行尋址,讀取是随機的。RAM可分為:單口RAM和雙口RAM,雙口RAM又可以分為真雙口RAM和僞雙口RAM。

FIFO為先進新出,沒有位址線,無法對存儲單元進行尋址。FIFO的讀寫可同時進行,一個端口隻讀,一個端口隻寫。

FIFO可分為異步FIFO和同步FIFO,同步FIFO使用同一個時鐘信号進行資料的讀寫,異步FIFO采用兩個不同的時鐘信号進行讀寫,即兩個時 鐘同頻率不同相位,或者不同頻率都算是不同時鐘信号。

FIFO主要用于資料的緩沖,異步FIFO主要用于跨時鐘信号的同步。

FIFO有兩個基本的規則:

1.已經滿了不能再寫,

2.已經空了不能再讀。

[FPGA入門筆記](六):基本存儲單元RAM學習

整理不易,希望對同學有幫助,加油