Vivado IP core RAM Block Memery Generator

Vivado IP core RAM Block Memery Generator


prefacio

Esta vez presentaré el uso del núcleo IP RAM (Block Memery Generator)         en vivado , y espero que sea útil para todos.


Consejo: El siguiente es el texto de este artículo, todos los cuales son originales del propio autor. No es fácil escribir un artículo. Espero que adjunte un enlace a este artículo cuando lo vuelva a publicar.

1. Pasos de configuración

Busque Block Memery Generator         en vivado , y después de encontrar el núcleo IP, puede completar la configuración correspondiente de acuerdo con las siguientes operaciones. Esta configuración es el modo de puerto único .

        1. Primero configure la interfaz básica , como se muestra en la Figura 1.

        

Figura 1 Configuración de la interfaz básica

         2. A continuación, configure la interfaz de Opciones del Puerto A, como se muestra en la Figura 2.

Figura 2 Configuración de la interfaz de opciones del puerto A

         3. Luego configure la interfaz Otras opciones , como se muestra en la Figura 3. Aquí puede agregar un archivo de inicialización, es decir, un archivo coe, para inicializar los datos almacenados.

Figura 3 Configuración de la interfaz de Otras Opciones

         4. Finalmente, hay una interfaz de resumen , como se muestra en la Figura 4, que no requiere que configuremos, es solo una página de introducción.

Figura 4 Interfaz de resumen

         Después de configurar las 4 interfaces anteriores, haga clic en el botón Aceptar en la esquina inferior derecha para generar el núcleo IP.

2. Simulación

1. Código de nivel superior

Cree un módulo de nivel superior llamado ram_read para instanciar el núcleo de IP recién generado.

el código se muestra a continuación:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/27 16:43:07
// Design Name: 
// Module Name: ram_read
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//
//虽然是ram,本次将ram当rom使用
module ram_read(
    input clk,                    //输入时钟信号
    input rst_n,                  //输入复位信号
    input start,                  //输入开始读信号
    input  [10 : 0] addr,         //输入读地址
    input [31 : 0] din,           //本次用不到
    output reg over,              //输出读的数据有效信号
    output reg [31 : 0] dout      //输出读到的数据
    );
//reg define
reg en;             //读使能信号
reg we;             //读写选择
reg [1:0] cnt;      //计数器
//wire define
wire [31:0] data;   //读的数据                 

always @(negedge clk or negedge rst_n)
begin
        if(!rst_n)
            cnt<=0;
        else if( (start==1)&(cnt<3))
            cnt<=cnt+1;
       else 
            cnt<=0;
end

always @(negedge clk or negedge rst_n) //下降沿设定使能
begin
        if(!rst_n)
            begin en<=0;we<=0;end
        else if(0<cnt<3)
            begin en<=1;we<=0;end
       else 
            begin en<=0;we<=0;end
end

always @(posedge clk or negedge rst_n)  //上升沿读取稳定数据
begin
        if(!rst_n)
            begin over<=0;dout<=0;end
        else if(cnt==3)
            begin over<=1;dout<=data;end
       else 
            begin over<=0;dout<=0;end
end

ram_sam_re_ip u1_ram_sam_re_ip (  //例化ram
  .clka(clk),        // input wire clka
  .ena(en),          // input wire ena
  .wea(we),          // input wire [0 : 0] wea
  .addra(addr),      // input wire [10 : 0] addra
  .dina(din),        // input wire [31 : 0] dina
  .douta(data)       // output wire [31 : 0] douta
);


endmodule

2. Código de simulación

Cree un módulo de simulación llamado ram_read_tb , que se usa para simular el núcleo de IP instanciado por el módulo de nivel superior en este momento.

el código se muestra a continuación:

`timescale 1ns / 1ps
//
// Company: cq university
// Engineer: clg
// Create Date: 2022/07/27 16:52:23
// Design Name: 
// Module Name: ram_read_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 2017.4
// Description: 
// Dependencies: 
// Revision:1.0
// Revision 0.01 - File Created
// Additional Comments:
//

module ram_read_tb();
reg clk;
reg rst_n;
reg start;
reg [10 : 0] addr;
reg [31 : 0] din;
wire over;
wire [31 : 0] dout;
    
ram_read u1_ram_read(
    .clk(clk),
    .rst_n(rst_n),
    .start(start),
    .over(over),
    .addr(addr),
    .din(din),
    .dout(dout)
    );
always #5 clk=~clk;
    initial begin
        clk=1'b0;rst_n=1'b1;
#5;     rst_n=1'b0;
#15;   rst_n=1'b1;
          start=1'b1;
          addr=11'd0;
#30   start=1'b0;
   end
    
endmodule

3. Análisis de simulación

        Parte de los datos de almacenamiento inicial se muestran en la Figura 5 y los resultados de la simulación se muestran en la Figura 6. Se puede ver que los resultados de la simulación son correctos y que los datos en la dirección 0 se han leído correctamente. Debido al búfer de salida, habrá un retraso.

Figura 5 Parte de los datos de almacenamiento inicial
Figura 6 Resultados de la simulación

 


Resumir

Este es el final de esta introducción, una breve introducción al uso del núcleo RAM IP en vivado .

Supongo que te gusta

Origin blog.csdn.net/m0_66360845/article/details/126022035
Recomendado
Clasificación