当前位置: 首页 > news >正文

单端口RAM IP核

单端口RAM IP核

RAM

RAM(Random Access Memory ):即随机访问存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。

RAM的分类

在这里插入图片描述

单端口RAM IP核端口

在这里插入图片描述

DINA:数据写入端口
ADDRA:数据写入对应地址
WEA:读写控制信号
ENA:使能端口,高电平有效
RSTA:复位端口
REGCEA:寄存器使能端口
CLKA:时钟
DOUTA:读出数据

实验任务

使用Vivado软件生成一个单端口的RAM并对其进行读写操作,然后通过仿真观察波形是否正确,最后通过在线调试工具对实验结果进行验证。如:将RAM设置的深度和宽度分别为32和8进行读写测试。

系统框图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

波形图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IP核配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
ram_rw读写模块代码

module ram_rw(input               clk        ,  //时钟信号input               rst_n      ,  //复位信号,低电平有效output  reg         ram_en     ,  //ram使能信号output              ram_we     ,  //ram读写选择output  reg  [4:0]  ram_addr   ,  //ram读写地址output  reg  [7:0]  ram_wr_data,  //ram写数据input        [7:0]  ram_rd_data   //ram读数据        );//reg define
reg    [5:0]  rw_cnt ;                //读写控制计数器//*****************************************************
//**                    main code
//*****************************************************//rw_cnt计数范围在0~31,写入数据;32~63时,读出数据
assign ram_we = (rw_cnt <= 6'd31 && ram_en == 1'b1) ? 1'b1 : 1'b0;//控制RAM使能信号
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ram_en <= 1'b0;    elseram_en <= 1'b1;    
end //读写控制计数器,计数器范围0~63
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)rw_cnt <= 6'b0;    else if(rw_cnt == 6'd63  && ram_en)rw_cnt <= 6'b0;else if(ram_en)rw_cnt <= rw_cnt + 1'b1; elserw_cnt <= 6'b0;      
end  //读写地址信号 范围:0~31
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ram_addr <= 5'b0;else if(ram_addr == 5'd31 && ram_en)ram_addr <= 5'b0;else if (ram_en)   ram_addr <= ram_addr + 1'b1;elseram_addr <= 5'b0;         
end//在WE拉高期间产生RAM写数据,变化范围是0~31
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ram_wr_data <= 8'b0;  else if(ram_wr_data < 8'd31 && ram_we)ram_wr_data <= ram_wr_data + 1'b1;elseram_wr_data <= 8'b0 ;   
end  ila_0 u_ila_0 (.clk(clk),           // input wire clk.probe0(ram_en),     // input wire [0:0]  probe0  .probe1(ram_we),     // input wire [0:0]  probe1 .probe2(ram_addr),   // input wire [4:0]  probe2 .probe3(ram_wr_data),// input wire [7:0]  probe3 .probe4(ram_rd_data) // input wire [7:0]  probe4 
);endmodule

顶层模块代码,例化ram_rw模块和IP核

module ram_rw(input               clk        ,  //时钟信号input               rst_n      ,  //复位信号,低电平有效output  reg         ram_en     ,  //ram使能信号output              ram_we     ,  //ram读写选择output  reg  [4:0]  ram_addr   ,  //ram读写地址output  reg  [7:0]  ram_wr_data,  //ram写数据input        [7:0]  ram_rd_data   //ram读数据        );//reg define
reg    [5:0]  rw_cnt ;                //读写控制计数器//*****************************************************
//**                    main code
//*****************************************************//rw_cnt计数范围在0~31,写入数据;32~63时,读出数据
assign ram_we = (rw_cnt <= 6'd31 && ram_en == 1'b1) ? 1'b1 : 1'b0;//控制RAM使能信号
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ram_en <= 1'b0;    elseram_en <= 1'b1;    
end //读写控制计数器,计数器范围0~63
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)rw_cnt <= 6'b0;    else if(rw_cnt == 6'd63  && ram_en)rw_cnt <= 6'b0;else if(ram_en)rw_cnt <= rw_cnt + 1'b1; elserw_cnt <= 6'b0;      
end  //读写地址信号 范围:0~31
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ram_addr <= 5'b0;else if(ram_addr == 5'd31 && ram_en)ram_addr <= 5'b0;else if (ram_en)   ram_addr <= ram_addr + 1'b1;elseram_addr <= 5'b0;         
end//在WE拉高期间产生RAM写数据,变化范围是0~31
always @(posedge clk or negedge rst_n) beginif(rst_n == 1'b0)ram_wr_data <= 8'b0;  else if(ram_wr_data < 8'd31 && ram_we)ram_wr_data <= ram_wr_data + 1'b1;elseram_wr_data <= 8'b0 ;   
end  ila_0 u_ila_0 (.clk(clk),           // input wire clk.probe0(ram_en),     // input wire [0:0]  probe0  .probe1(ram_we),     // input wire [0:0]  probe1 .probe2(ram_addr),   // input wire [4:0]  probe2 .probe3(ram_wr_data),// input wire [7:0]  probe3 .probe4(ram_rd_data) // input wire [7:0]  probe4 
);endmodule

FPGA激励文件(Testbench)编写,其用于验证FPGA设计功能正确性的测试脚本,通过模拟输入信号并检查输出响应,确保设计符合预期。

`timescale 1ns / 1ps        //仿真单位/仿真精度module tb_ip_1port_ram();//parameter define
parameter  CLK_PERIOD = 20; //时钟周期 20ns//reg define
reg     sys_clk;
reg     sys_rst_n;//信号初始化
initial beginsys_clk = 1'b0;sys_rst_n = 1'b0;#200sys_rst_n = 1'b1;
end//产生时钟
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;ip_1port_ram u_ip_1port_ram(.sys_clk          (sys_clk        ),.sys_rst_n        (sys_rst_n      ) );endmodule
http://www.dtcms.com/a/598394.html

相关文章:

  • 26、【Ubuntu】【远程开发】内网穿透:密钥算法介绍(二)
  • 什么网站可以做电子画册医院网站建设 南宁
  • 免费物业网站模板网架生产企业
  • FreeRTOS coreHTTP 客户端库源码与架构全景剖析
  • HttpServletRequest中的 Attribute(属性)生命周期和作用域是 Java Web 开发中的重要概念
  • 甘肃省水利厅引洮工程建设管理局网站网页制作与网站建设...
  • 浦东建设网站柳州网站建设柳州
  • Linux 基础开发工具----Vim编辑器的常见命令
  • Flutter for HarmonyOS开发指南(八):国际化与本地化深度实践
  • 建设局主要负责什么黑帽seo软件
  • 购买东西网站怎么做网页空间租用
  • 什么网站做外贸最多的网站建设虚线的代码
  • AIDD - 自主决策实验室 Intrepid Labs 介绍
  • 自己网站建设要维护23个营销专业术语
  • 如何做app网站网站后端用什么语言
  • HarmonyOS SDK使能美团高效开发,打造优质创新应用体验
  • 河北公司网站建设效果网站整合discuz论坛
  • 沈阳网站建设哪里的公司比较好厦门市建设工程造价网
  • 插值——拉格朗日插值
  • 马鞍山集团网站设计国外免费ip地址和密码
  • ps做汽车网站下载长沙圭塘网站建设公司
  • AJAX和Promise
  • 直播网站建设费用腾讯云域名控制台
  • 山东兴润建设集团网站ps设计网站步骤
  • 广州网站 制作信科便宜seo就业
  • 基于ENAS与YOLOv8的草莓成熟度自动检测系统:原理、实现与性能优化(含详细代码)
  • 内网横向靶场——记录一次横向渗透(三)
  • 兰州电商平台网站建设设备外观设计效果图
  • 【XR开发系列】Unity下载与安装详细教程(UnityHub、Unity)
  • 深度学习——参数优化