FPGA开发——IP核RAM的调用(双端口)

news2024/9/22 1:08:44

一、简介

在上一篇文章中我们对于单端口的RAM调用进行了一个简单的介绍和相关应用,在这篇文章当中我们对于双端口的RAM进行介绍和调用,在调用程度上来说,双端口RAM是单端口RAM的一个进阶。

双端口RAM分类

        简单双口 RAM:一组读数据和读地址线,一组写数据和写地址线,能同时进行读和写操作, 但不能同时对同一地址进行读和写操作。

        真双口 RAM:有两组读数据线与读地址线,两组写数据线与写地址线;能同时进行两个端口 读,能同时进行两个端口写,也能一个端口读同时另一个端口写。

在文章中我们就以简单双口RAM进行一个介绍。

二、双端口RAM的配置

这里双端口的调用和单端口的基本上是一样的,只不过参数啥的有点不一样。

1、双端口RAM选择

        如图所示,在 IP Catalog 的搜索栏中搜索 RAM,然后选择 RAM:2-PORT。(这里工程的创建就不仔细讲了)

2、RAM存放位置的选择

选择自己需要存放的文件目录。

3、RAM类型和存储类型选择

如下图所示,该界面配置的参数有:

方框①:这里就是前面说的简单双口RAM真双口RAM的选择,因为我们使用的是简单双口RAM,所以选择上面一个选项的一个读和一个写端口就行。

②:这里是数据存放的尺度,分别为字节存放和bit存放,这里根据自身需要进行选择。

然后点击 Next 进入下一界面。

4、数据存放容量、输入输出数据位宽和资源类型的选择 

如图所示:

方框①:这里是对于RAM存放数据的深度进行一个选择,也就是存放容量。这里根据需要直接进行选择就行。

方框②:这里就是对于输入输出数据的位宽进行配置,如果想要输入输出数据的位宽不同,那么就可以在这里进行设置,首先就是在选项处进行勾画,然后对于输入输出数据位宽进行一个设置,如果不需要的话这里保持默认不选就行。

方框③:这里就是对于RAM的资源构成进行一个选择,这里默认选择Auto就行,如果有特别需要也可以进行选择。 点击“Next”进入下一界面。

 5、时钟数量、读使能信号、以及写入数据位宽控制位的选择

如图所示:

方框①:在这进行时钟数量进行一个选择,分别是单一时钟、读时钟,写始终、输入始终,输出时钟,这里如果没有特殊需求,我们可以直接选择单一时钟就行,如果需要在写和读添加时钟的话就选择第二个选项,输入输出就选择第三个选项。

方框②:这就是对于读数据使用信号的一个配置,如果不需要读数据使能信号的话这里就不选。

方框③:这里就是对于RAM写入数据的位宽进行选择,为高电平有效,如果这个byteena_a信号为高,不管写入数据位宽有多大,最终都只会把低8位读入RAM中。不要求的话也可以不选。 点击“Next”进入下一界面。

6、输出数据的时钟寄存配置

        这里和前面一步的时钟数量的选择相互关联,如果在前面时钟选择时只选择一个是话,这里选不选都不影响最后的结果,因为不管是写入还是读出都是在使用同一个系统时钟。

        但如果前面的时钟选择了写入和读出分别使用不同的时钟或者输入输出使用不同的时钟,那么这里一定要进行选择。在图中,这个选项的作用就是把rdclok也就是读数据时的时钟和输出数据进行一个连接,这样输出就会按照如数据时钟的变化实时进行数据读取。相反,如果没有进行勾选,读取数据时就会默认根据系统时钟进行一个变化。

        这里需要注意一下,如果不注意会极大的影响在仿真时我们对于结果的判断。

7、初始化文件的选择

如下图所示,这里是初始化文件的一个选择,我们有相应的.mif或者.hex等文件,救选择下面一个选项,进行文件的一个选择就行。点击“Next”进入下一界面。

8、仿真库文件的选择

如下图所示,显示的是仿真库文件 altera_mf。无需其它操作,点击“Next”进入下一界面。

9、生成文件的选择

如下图所示,该页面为需要配置生成的文件。勾选 ram_inst.v 即可。ram_bb.v 可勾可不勾选。然后点击 finish。

 10、将文件添加到工程中

如下图所示,配置完成,点击“Yes”即可。

三、双端口RAM的调用

1、设计文件的编写

在trl文件夹中新建ip_ram.v文件,如图:

因为我们在前面配置中选择了不同的时钟,所以我们在这里通过pll产生两个不同的时钟给写和读信号。(这里对于pll的调用就不做具体介绍了,不清楚的小伙伴可以参考前面pll调用的文章,这里我们只使用了两个输出时钟,所以在进行pll配置时需要注意一下)。

    
//---------<模块及端口声名>-------------------------------------------
module ip_ram( 
    input				clk			,
    input				rst_n		,
    input				rden    	,
    input               wden		,
	input               byteena 	,
    input		[6:0]   raddress	,
	input       [6:0]   waddress 	,
    input		[15:0]	din 		,
    output		[7:0]	dout	
);								 
//---------<参数定义>------------------------------------------------
    
//---------<内部信号定义>--------------------------------------------
wire clk_75m;
wire clk_100m;
pll_1	pll_1_inst (
	.areset ( ~rst_n ),
	.inclk0 ( clk ),
	.c0 ( clk_75m ),
	.c1 ( clk_100m ),
	.locked ( locked_sig )
);

ram_1	ram_1_inst (
	.byteena_a ( byteena ),//读低八位数据
	.data ( din ),//写入的数据
	.rdaddress ( raddress ),//读数据的地址
	.rdclock ( clk_75m ),//读的时钟
	.rden ( rden ),//读信号使能
	.wraddress ( waddress ),//写数据的地址
	.wrclock ( clk_100m ),//写的时钟
	.wren ( wden ),//写信号使能
	.q ( dout )//输出数据
);
endmodule

 2、测试文件的编写

在tb文件夹中新建tb_ram.v文件,如图:

在代码中我们对于写入数据位宽控制信号进行了赋1操作,所以在后面的波形仿真中我们应该可以看到值写入低八位数据。

`timescale 1ns/1ns
    
module tb_ram();

//激励信号定义 
    reg				clk		 ;
    reg				rst_n	 ;
    reg				rden     ;
    reg		        wden	 ;
    reg		        byteena  ;
    reg		[6:0]   raddress ;
    reg     [6:0]   waddress ;
    reg     [15:0]	din 	 ;
//输出信号定义	 
  wire	[7:0]		dout    ;

//时钟周期参数定义	
    parameter		CLOCK_CYCLE = 20;   

//模块例化
ip_ram   ip_ram_inst( 
    /*input		 */	.clk		(clk	),
    /*input		 */	.rst_n		(rst_n	),
    /*input		 */	.rden    	(rden    ),
    /*input      */ .wden		(wden	),
	/*input      */ .byteena 	(byteena ),
    /*input	[6:0]*/ .raddress	(raddress),
	/*input [6:0]*/ .waddress 	(waddress),
    /*input [7:0]*/	.din 		(din 	),
    /*output[7:0]*/	.dout	    (dout	 )
);				

//产生时钟
    initial 		clk = 1'b0;
    always #(CLOCK_CYCLE/2) clk = ~clk;

//产生激励
    integer i;
    initial  begin 
     
        rst_n = 1'b0;
        wden = 1'b0;
        rden = 1'b0;
        #(CLOCK_CYCLE*20);
        rst_n = 1'b1;
        byteena =1;
        #(20*100);
         //写入50个16位数据,使用byteena写入低八位
        for (i = 0;i<50;i=i+1) begin
            wden = 1'b1;
            waddress = 7'(i);
            din = 16'($random);
            byteena =1;
            @(posedge clk);
            wden=1'b0;
        end
        //读50个数据
        for (i = 0;i<50;i=i+1) begin
            rden = 1'b1;
            raddress = 7'(i);
            @(posedge clk);
            wden=1'b0;
        end 

        //同读同写
        for (i = 0;i<5;i=i+1) begin
            wden = 1'b1;
            waddress = 7'(i);
            din = 16'($random);
            
            @(posedge clk);
            wden=1'b0;
            rden = 1'b1;
            raddress = 7'(i);
            @(posedge clk);
            wden=1'b0;
        end
        $stop;
    end    

endmodule 

3、波形图仿真

图中我们可以看到最后写入的数据确实是低八位的数据。而最后读取的信号和写入的第八位信号是完全一致的。到这里双端口RAM的调用就结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】系列入门摘抄笔记-1-基本概念

一、基本概念 1. Linux系统 linux系统的发行版:内核+外围软件(文件系统、系统软件、应用软件)。 由于Linux内核是开源的,GUN工程中的软件也是开源的,所以许多组织和企业就嗅到了商机,他们将Linux内核与各种软件以及说明文档包装起来,并提供安装界面和管理工具等,这就…

如何让环保展厅不再沉闷?互动投影技术的创新应用解答!

随着城市化进程的加速&#xff0c;垃圾、污染等问题已成为影响城市环境的重要因素&#xff0c;为了解决这些问题&#xff0c;许多城市开始推行垃圾分类政策&#xff0c;同时完善垃圾分类收集、运输和处理的设施&#xff0c;为垃圾分类处理提供了硬件支持&#xff0c;此外&#…

【漏洞复现】某赛通电子文档安全管理系统 MultiServerAjax SQL注入漏洞

0x01 产品简介 某赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

理解 Python 的全局解释器锁 (GIL)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

大数据安全规划总体方案(45页PPT)

方案介绍&#xff1a; 大数据安全规划总体方案的制定&#xff0c;旨在应对当前大数据环境中存在的各类安全风险&#xff0c;包括但不限于数据泄露、数据篡改、非法访问等。通过构建完善的安全防护体系&#xff0c;保障大数据在采集、存储、处理、传输、共享等全生命周期中的安…

书生.浦江大模型实战训练营——(四)书生·浦语大模型全链路开源开放体系

最近在学习书生.浦江大模型实战训练营&#xff0c;所有课程都免费&#xff0c;以关卡的形式学习&#xff0c;也比较有意思&#xff0c;提供免费的算力实战&#xff0c;真的很不错&#xff08;无广&#xff09;&#xff01;欢迎大家一起学习&#xff0c;打开LLM探索大门&#xf…

60、排列序列,61、旋转链表——LeetCode

60、排列序列 题目 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123" "132" "213" "231" "312…

c#--有关DataGridView表格控件绑定数据源后的无数据、无法更新、闪烁及如何绑定图片等问题的总结

使用绑定数据源的方式绑定数据 1.DataGridview.Rows.Clear()&#xff0c;提示“不能清除此列表”。 用数据源绑定的DataGridView不能用Rows.Clear()清除&#xff0c;手动添加的是能够用clear()的。所以将datasource设置为null就可以清空数据。 2.DataSource为NULL&#xff0…

IP地址封装类(InetAddress类)

文章目录 前言一、IP地址是什么&#xff1f;二、IP地址封装类 1.常用方法2.实操展示总结 前言 当我们想要获取到通信对方的IP地址、主机地址等信息时&#xff0c;我们可以使用InetAddress类。InetAddress类在java的net包中。 一、IP地址是什么&#xff1f; IP地址 (Internet Pr…

人工智能算法岗找实习经验(一)简历撰写

首先分享简历撰写&#xff0c;下面简历仅供参考。 分为教育经历、个人能力、项目经历和竞赛经历4个部分。因为找的是算法岗&#xff0c;所以没有涉及太多技术和项目之外的东西。 教育经历 教育经历就是简单介绍下大学、专业、GPA还有就是和人工智能算法岗相关的专业课。 个…

【Python-实操】LabelMe to YOLOv8 Converter

LabelMe to YOLOv8 Converter 这是一个 Python 脚本&#xff0c;用于将 LabelMe 标注工具导出的 JSON 文件转换为 YOLOv8 格式的标注文件&#xff0c;并同时在图像上绘制标注的多边形。 功能 读取 LabelMe JSON 文件。解码并显示图像。从 classes.txt 文件加载类别标签。将多…

超有效!这样选的宠物空气净化器真能去浮毛?一款家电助力呼吸道

我那哥们儿&#xff0c;最近家里多了个毛茸茸的小成员——一只小猫。他对这猫好得不得了&#xff0c;俩人几乎是形影不离。可问题来了&#xff0c;小猫一长大&#xff0c;那毛啊&#xff0c;掉得满屋子都是。哥们儿最近就老抱怨&#xff0c;说晚上睡觉喉咙不舒服&#xff0c;问…

LVS是什么?以及LVS-NAT以及DR模式实验

目录 NAT LVS LVS集群的类型&#xff1a; LVS-NAT模式实验 环境准备&#xff1a; 实验步骤&#xff1a; LVS-DR模式实验 题目&#xff1a; 环境准备&#xff1a; 实验步骤&#xff1a; LVS-防火墙标签解决轮询调度问题 环境准备&#xff1a; 实验步骤&#xff1…

springboot疫情隔离酒店管理系统的开发--论文源码调试讲解

1系统成功运行案例 2 相关技术介绍 2.1 B/S模式 B/S模式是一种比较常用的网络结构模式[7]。B/S模式是由MVC结构组成&#xff0c;即模型、视图、控制器是构成该模式的主要结构[8]。模型主要是指业务模型&#xff0c;视图是面向用户而显示的相关界面&#xff0c;控制器主要是控制…

使用 defineNuxtComponent`定义 Vue 组件

title: 使用 defineNuxtComponent定义 Vue 组件 date: 2024/8/9 updated: 2024/8/9 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了在Nuxt 3中使用defineNuxtComponent辅助函数定义类型安全的Vue组件的方法&#xff0c;适用于习惯Options API的开发者。defineNuxtCo…

【Deep-ML系列】Feature Scaling Implementation(特征缩放:standardization min-max)

题目链接&#xff1a;Deep-ML import numpy as np def feature_scaling(data: np.ndarray) -> (np.ndarray, np.ndarray):mean np.mean(data, axis0)std np.std(data, axis0)standardized_data (data - mean) / stdmaxnum np.max(data, axis0)minnum np.min(data, axi…

嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)

1、人脸识别 人脸识别是一种技术&#xff0c;通过检测、跟踪和识别人脸上的关键特征&#xff0c;以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。 人脸识别技术的基本原理是先通过图像处理和计算机视觉算法&#xff0c;提取人脸的特征点和特征描…

代理模式Proxy

一、代理模式&#xff08;Proxy&#xff09; 1.代理模式的定义 代理模式给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对真实对象的访问&#xff0c;起到对代理对象已有功能的增强 通俗的来讲代理模式就是我们生活中常见的中介。 2.作用 中介隔离作用&#x…

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox&#xff0c;网站展示了 Node.js 生态系统中积极维护且流行的库。

在 Duo S 上使用 TDL SDK 高效部署人脸检测模型

TDL SDK 是一款集成算法开发包&#xff0c;提供了便捷的编程接口&#xff0c;使开发者们能够更快、高效地将各种深度学习技术应用于自己的产品和服务中。无论开发者是否是深度学习领域的专家&#xff0c;有了TDL SDK作为助手&#xff0c;都能轻松构建智能应用。 Milk-V DuoS 是…