#FPGA(IP_RAM 调用 )

这篇具有很好参考价值的文章主要介绍了#FPGA(IP_RAM 调用 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.IDE:Quartus II


2.设备:Cyclone II  EP2C8Q208C8N  


3.实验:调用单端口RAM仿真读取写入


4.时序图:

#FPGA(IP_RAM 调用 ),fpga开发#FPGA(IP_RAM 调用 ),fpga开发#FPGA(IP_RAM 调用 ),fpga开发


5.步骤:

(1)添加一个初始化文件做对比,255递减到0(HEX文件)

#FPGA(IP_RAM 调用 ),fpga开发

#FPGA(IP_RAM 调用 ),fpga开发#FPGA(IP_RAM 调用 ),fpga开发#FPGA(IP_RAM 调用 ),fpga开发

(2)仿真时出现报错,为配置的ram的.v文件没有添加,按如下方式解决。

#FPGA(IP_RAM 调用 ),fpga开发#FPGA(IP_RAM 调用 ),fpga开发 


6.代码:

ram_ctrl.v

/*
 *因为工程名失误,应该是ram_ctrl
 */
module ram_ip(
input    wire         sys_clk    ,
input    wire         sys_rst_n  ,
input    wire         wr_flag    ,
input    wire         rd_flag    ,

output   reg          wr_en      ,
output   reg  [7:0]   addr       ,
output   wire [7:0]   wr_data    ,
output   reg          rd_en      

);

parameter     CNT_MAX   =24'd1000_0000;   //计数值200ms     20ns per clk
reg     [23:0]     cnt_200ms;

/*
 *计时器(用于数码管显示,数码管需要留存时间)
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
	       cnt_200ms <= 24'd0;
     else  if((cnt_200ms == CNT_MAX) || (wr_flag == 1'b1) || (rd_flag == 1'b1))       //有读、写直接清零,计满时间也清零    
	       cnt_200ms <= 24'd0;
	  else  if(rd_en == 1'b1)
	       cnt_200ms <= cnt_200ms + 1'b1;         //读ram期间计数(读出来数码管显示需要时间)
	  else
	       cnt_200ms <= cnt_200ms;
end

/*
 *写使能控制
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
          wr_en <= 1'b0;
	  else  if(addr == 8'd255)                   //地址到达最大禁止写入
          wr_en <= 1'b0;
	  else  if(wr_flag == 1'b1)                  //写标志位拉高,使能写
          wr_en <= 1'b1;	 
	  else
	       wr_en <= wr_en; 
end

/*
 *地址控制
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
	       addr <= 8'd0;
	  else  if((addr == 8'd255 && wr_en == 1'b1) || (addr == 8'd255 && cnt_200ms == CNT_MAX) || (wr_flag == 1'b1) || (rd_flag == 1'b1))
	       addr <= addr + 1'b1;
	  else
	       addr <= addr;	 
end

/*
 *写入的数据赋值
 */
assign  wr_data = (wr_en == 1'b1) ? addr : 8'd0;   //写使能期间将地址作为数据

/*
 *读使能控制
 */
always @ (posedge sys_clk or negedge sys_rst_n) begin
     if(sys_rst_n == 1'b0)
          rd_en <= 1'b0;
	  else if(wr_flag == 1'b1)    //写信号到来,直接失能读操作
	       rd_en <= 1'b0;
	  else if(rd_flag == 1'b1 && wr_en == 1'b0)  //读信号到来且写信号失能才会将读信号使能
	       rd_en <= 1'b1;
	  else
	       rd_en <= rd_en;     
end

endmodule

tb_ram_ctrl.v

/*
 *ram_ip仿真代码
 */
`timescale 1ns/1ns
module tb_ram_ctrl();

reg        sys_clk       ;
reg        sys_rst_n     ;
reg        wr_flag       ;
reg        rd_flag       ;

wire       wr_en         ;
wire [7:0] addr          ;     
wire [7:0] wr_data       ;
wire       rd_en         ;
wire [7:0] data_out      ;

/*
 *读,写,再读
 */
initial
      begin
		     sys_clk    =   1'b1;
			  sys_rst_n  <=  1'b0;
			  wr_flag    <=  1'b0;
			  rd_flag    <=  1'b0;
			  #20
			  sys_rst_n  <=  1'b1;
			  #1000
//rd_flag
           rd_flag    <=  1'b1;    //读信号拉高一个时钟周期
           #20
           rd_flag    <=  1'b0;
           #60_000     //    > CNT_MAX * 20ns * 255 =10 * 20 * 256 = 51200  
//wr_flag
           wr_flag    <=  1'b1;    //写信号拉高一个时钟周期
           #20   
           wr_flag    <=  1'b0;
           #60_000
//rd_flag			
           rd_flag    <=  1'b1;    //写完之后再读看写入是否正确
			  #20
			  rd_flag    <=  1'b0;
		end
		
always #10 sys_clk = ~ sys_clk;    //模拟时钟
defparam   ram_ip_inst.CNT_MAX = 10 ;   //用于仿真(10 * 20ns = 200ns per data)

/*
 *实例化ram_ctrl
 */
ram_ip ram_ip_inst(
.sys_clk    (sys_clk )  ,
.sys_rst_n  (sys_rst_n)  ,
.wr_flag    (wr_flag )  ,
.rd_flag    (rd_flag )  ,
               
.wr_en      (wr_en   )  ,
.addr       (addr    )  ,
.wr_data    (wr_data )  ,
.rd_en      (rd_en   )
);

/*
 *实例化IP核,CYCLONE II 没有读使能控制信号?
 */
ram_8x256_one	ram_8x256_one_inst (
	.aclr       (~sys_rst_n),            //异步清零信号(高电平有信号)
	.address    (addr),
	.clock      (sys_clk),
	.data       (wr_data),
	.wren       (wr_en),
	.q          (data_out)
	);


endmodule

 文章来源地址https://www.toymoban.com/news/detail-826581.html


到了这里,关于#FPGA(IP_RAM 调用 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA-基本IP核的应用之RAM

    RAM为随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM主要用来存放程序及程序执行过程中产生的中间数据、运行结果等。其特点适合双向交换数据。 RAM的端口有单端口和双端口:

    2024年02月16日
    浏览(47)
  • FPGA原理与结构——RAM IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门 目录 一、什么是RAM 二、RAM IP介绍 1、RAM分类简介  2、可选的内存算法 (1)Minimum Area Algorithm(最小面积算法) (2)Low Power Algorithm (低功耗算法) (3)Fixed Primitive Algorithm (固定模块算法) (4)小结 3、位宽 4、工作模

    2024年02月12日
    浏览(41)
  • FPGA原理与结构(9)——RAM IP核原理学习

    系列文章目录:FPGA原理与结构(0)——目录与传送门 目录 一、什么是RAM 二、RAM IP介绍 1、RAM分类简介  2、可选的内存算法 (1)Minimum Area Algorithm(最小面积算法) (2)Low Power Algorithm (低功耗算法) (3)Fixed Primitive Algorithm (固定模块算法) (4)小结 3、位宽 4、工作模

    2024年02月01日
    浏览(42)
  • FPGA vivado IP核学习笔记——单端口RAM

    1. 新建IP 在IP Catalog中找到Block Memory Generator 2. 基本配置 ①在 Component Name 位置可以修改IP名字 ② Interface Type 选择接口类型,有Native(常规)和AXI4两种,AXI4常用于软核控制FPGA或ZYNQ中PS端控制FPGA时使用 ③ Generate address interface with 31 bits ,将地址深度固定在32bit ④ Memory Type : 有一

    2024年04月29日
    浏览(40)
  • Altera FPGA 储存单元IP核之RAM、FIFO

         只读存储器,系统上电后数据就被写入ROM,运行过程中只能从ROM中读取数据,而不能改变ROM中的数值。      随机存取储存器,可以随时把数据写入任一指定地址的储存单元,也可以随时从任一指定地址中读取数据。其读写速度是由时钟频率决定的。RAM主要用来存放程

    2023年04月08日
    浏览(45)
  • FPGA原理与结构——RAM IP核的使用与测试

    系列文章目录:FPGA原理与结构(0)——目录与传送门 目录 一、前言 二、RAM IP核定制 1、RAM IP核 step1 打开vivado工程,点击左侧栏中的IP Catalog step2 在搜索栏搜索RAM,找到Block Memory Generator IP核: 2、IP核定制 step3 Baisc界面定制 step4 端口定制 step5 Other Options step6 Summary 3、IP核例化

    2024年02月11日
    浏览(40)
  • [FPGA IP系列] FPGA常用存储资源大全(RAM、ROM、CAM、SRAM、DRAM、FLASH)

    本文主要介绍FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等资源。 RAM(Random Access Memory)是FPGA中最基本和常用的内部存储块,根据不同架构可以实现不同容量,最大可达几十Mb。 FPGA中的RAM主要包括: 分布式RAM:存在于逻辑块(LE)中的小容量RAM,通常为几百比特到几千比特。 块RAM:F

    2024年02月12日
    浏览(49)
  • FPGA_学习_11_IP核_RAM_乒乓操作

    本篇博客学习另一个IP核,RAM。 用RAM实现什么功能呢? 实现 乒乓操作。 乒乓操作是什么呢? 参考: FPGA中的乒乓操作思想_fpga中乒乓操作的原因_小林家的龙小年的博客-CSDN博客 何为乒乓操作_fanyuandrj的博客-CSDN博客 以下是本人理解: 乒乓操作可以实现低速模块处理高速数据

    2024年02月09日
    浏览(41)
  • 【FPGA】七、IP核的调用

    文章目录 前言 1、PLL简介 2、PLL工作原理 3、PLL实验 3.1、PLL的调用 3.2、程序与仿真 总结 前言         在我们进行FPGA项目设计中,简单的工程我们可以自己手动去设计与编写,但是如果工程较为复杂,我们完全自己去设计编写的话效率就太低了。所以在进行FPGA设计当中,常

    2024年02月08日
    浏览(44)
  • FPGA入门(7):IP核调用

    IP核是什么? IP(Intellectual Property)即知识产权。在半导体产业将IP核定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”。简而言之,这里的IP即电路功能模块。 在数字电路中,将常用的且比较复杂的功能模块设计成参数可修改的模块,让其他用户可以直接调用这些模块

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包