verilog语法进阶-分布式ram原语

news2024/9/24 17:10:06

概述

官方提供的原语

   RAM16X1S_1 #(
      .INIT(16'h0000) // Initial contents of RAM
   ) RAM16X1S_1_inst (
      .O(O),       // RAM output
      .A0(A0),     // RAM address[0] input
      .A1(A1),     // RAM address[1] input
      .A2(A2),     // RAM address[2] input
      .A3(A3),     // RAM address[3] input
      .D(D),       // RAM data input
      .WCLK(WCLK), // Write clock input
      .WE(WE)      // Write enable input
   );


   RAM16X1D_1 #(
      .INIT(16'h0000) // Initial contents of RAM
   ) RAM16X1D_1_inst (
      .DPO(DPO),     // Read-only 1-bit data output
      .SPO(SPO),     // Rw/ 1-bit data output
      .A0(A0),       // Rw/ address[0] input bit
      .A1(A1),       // Rw/ address[1] input bit
      .A2(A2),       // Rw/ address[2] input bit
      .A3(A3),       // Rw/ address[3] input bit
      .D(D),         // Write 1-bit data input
      .DPRA0(DPRA0), // Read-only address[0] input bit
      .DPRA1(DPRA1), // Read-only address[1] input bit
      .DPRA2(DPRA2), // Read-only address[2] input bit
      .DPRA3(DPRA3), // Read-only address[3] input bit
      .WCLK(WCLK),   // Write clock input
      .WE(WE)        // Write enable input
   );

内容

1. 单端分布式ram

2. 双端分布式ram

1. 单端分布式ram

verilog c代码

module primitive1(
	input clk,
	input write_enable,
	input [1-1:0] input_data,
	output [1-1:0] output_data,
	input [4-1:0] address
    );
 
parameter RAM_WIDTH = 1;
parameter RAM_ADDR_BITS = 4;
 
(* RAM_STYLE="{AUTO | DISTRIBUTED | PIPE_DISTRIBUTED}" *)
reg [RAM_WIDTH-1:0] dram [(2**RAM_ADDR_BITS)-1:0];
 
always @(posedge clk)
  if (write_enable)
	 dram[address] <= input_data; // 写数据
 
assign output_data = dram[address];   //读数据
endmodule	

原语


module primitive1 (
  clk, write_enable, output_data, address, input_data
);
  input clk;
  input write_enable;
  output [0 : 0] output_data;
  input [3 : 0] address;
  input [0 : 0] input_data;
  wire address_0_IBUF_4;
  wire address_1_IBUF_5;
  wire address_2_IBUF_6;
  wire address_3_IBUF_7;
  wire clk_BUFGP_9;
  wire input_data_0_IBUF_11;
  wire output_data_0_OBUF_13;
  wire write_enable_IBUF_15;
  RAM16X1S   Mram_dram (
    .A0(address_0_IBUF_4),
    .A1(address_1_IBUF_5),
    .A2(address_2_IBUF_6),
    .A3(address_3_IBUF_7),
    .D(input_data_0_IBUF_11),
    .WCLK(clk_BUFGP_9),
    .WE(write_enable_IBUF_15),
    .O(output_data_0_OBUF_13)
  );
  IBUF   write_enable_IBUF (
    .I(write_enable),
    .O(write_enable_IBUF_15)
  );
  IBUF   address_3_IBUF (
    .I(address[3]),
    .O(address_3_IBUF_7)
  );
  IBUF   address_2_IBUF (
    .I(address[2]),
    .O(address_2_IBUF_6)
  );
  IBUF   address_1_IBUF (
    .I(address[1]),
    .O(address_1_IBUF_5)
  );
  IBUF   address_0_IBUF (
    .I(address[0]),
    .O(address_0_IBUF_4)
  );
  IBUF   input_data_0_IBUF (
    .I(input_data[0]),
    .O(input_data_0_IBUF_11)
  );
  OBUF   output_data_0_OBUF (
    .I(output_data_0_OBUF_13),
    .O(output_data[0])
  );
  BUFGP   clk_BUFGP (
    .I(clk),
    .O(clk_BUFGP_9)
  );
endmodule

RTL结构图

技术原理图

2. 双端分布式ram

verilog c代码

module primitive1(
	input clk,
	input write_enable,
	input [1-1:0] input_data,
	output [1-1:0] output_data,
	input [4-1:0] write_address,read_address
    );
 
parameter RAM_WIDTH = 1;
parameter RAM_ADDR_BITS = 4;
 
(* RAM_STYLE="{AUTO | DISTRIBUTED | PIPE_DISTRIBUTED}" *)
reg [RAM_WIDTH-1:0] ddram [(2**RAM_ADDR_BITS)-1:0];
 
 
always @(posedge clk)
  if (write_enable)
	 ddram[write_address] <= input_data;
 
assign output_data = ddram[read_address];   
 
endmodule


原语代码


module primitive1 (
  clk, write_enable, output_data, write_address, read_address, input_data
);
  input clk;
  input write_enable;
  output [0 : 0] output_data;
  input [3 : 0] write_address;
  input [3 : 0] read_address;
  input [0 : 0] input_data;
  wire clk_BUFGP_1;
  wire input_data_0_IBUF_3;
  wire output_data_0_OBUF_5;
  wire read_address_0_IBUF_10;
  wire read_address_1_IBUF_11;
  wire read_address_2_IBUF_12;
  wire read_address_3_IBUF_13;
  wire write_address_0_IBUF_18;
  wire write_address_1_IBUF_19;
  wire write_address_2_IBUF_20;
  wire write_address_3_IBUF_21;
  wire write_enable_IBUF_23;
  wire NLW_Mram_ddram_SPO_UNCONNECTED;
  RAM16X1D   Mram_ddram (
    .A0(write_address_0_IBUF_18),
    .A1(write_address_1_IBUF_19),
    .A2(write_address_2_IBUF_20),
    .A3(write_address_3_IBUF_21),
    .D(input_data_0_IBUF_3),
    .DPRA0(read_address_0_IBUF_10),
    .DPRA1(read_address_1_IBUF_11),
    .DPRA2(read_address_2_IBUF_12),
    .DPRA3(read_address_3_IBUF_13),
    .WCLK(clk_BUFGP_1),
    .WE(write_enable_IBUF_23),
    .SPO(NLW_Mram_ddram_SPO_UNCONNECTED),
    .DPO(output_data_0_OBUF_5)
  );
  IBUF   write_enable_IBUF (
    .I(write_enable),
    .O(write_enable_IBUF_23)
  );
  IBUF   write_address_3_IBUF (
    .I(write_address[3]),
    .O(write_address_3_IBUF_21)
  );
  IBUF   write_address_2_IBUF (
    .I(write_address[2]),
    .O(write_address_2_IBUF_20)
  );
  IBUF   write_address_1_IBUF (
    .I(write_address[1]),
    .O(write_address_1_IBUF_19)
  );
  IBUF   write_address_0_IBUF (
    .I(write_address[0]),
    .O(write_address_0_IBUF_18)
  );
  IBUF   read_address_3_IBUF (
    .I(read_address[3]),
    .O(read_address_3_IBUF_13)
  );
  IBUF   read_address_2_IBUF (
    .I(read_address[2]),
    .O(read_address_2_IBUF_12)
  );
  IBUF   read_address_1_IBUF (
    .I(read_address[1]),
    .O(read_address_1_IBUF_11)
  );
  IBUF   read_address_0_IBUF (
    .I(read_address[0]),
    .O(read_address_0_IBUF_10)
  );
  IBUF   input_data_0_IBUF (
    .I(input_data[0]),
    .O(input_data_0_IBUF_3)
  );
  OBUF   output_data_0_OBUF (
    .I(output_data_0_OBUF_5),
    .O(output_data[0])
  );
  BUFGP   clk_BUFGP (
    .I(clk),
    .O(clk_BUFGP_1)
  );
endmodule

RTL结构图

技术原理图

3. 总结

1. FPGA的LUT可以配置成分布式ram

2. 分布式ram的原语分为单端和双端

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

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

相关文章

数据结构-迷宫问题

文章目录 1、题目描述2、题目分析3、代码实现 1、题目描述 题目链接&#xff1a;迷宫问题 、 注意不能斜着走&#xff01; 2、题目分析 &#xff08;1&#xff09;0为可以走&#xff0c;1不能走且只有唯一一条通路 &#xff08;2&#xff09;我们可以通过判断上下左右来确定…

基于ssm电子资源管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 基于ssm电子资源管理系统源码和论文758 摘要 随着互联网技术的高速发展&#xff0c;人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门…

微信公众号怎样使用文章模版?怎样建立文章模版 公众号模版示例 如何使用

打开我们的微信公众平台并登陆&#xff0c;找到我们的管理->素材管理 如图所示 2 在新建图文素材的右边有三个点&#xff0c;我们把鼠标移动到此处并点击 我们会看到新建分享图文和管理图文模版 选中并点击管理图文模版 如图所示 3 我们会看到如下界面 如图所示 4 …

【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]

阅读导航 引言一、thread类的简单介绍二、线程函数详细介绍1. start() 函数&#xff08;1&#xff09;头文件&#xff08;2&#xff09;函数原型 2. join() 函数&#xff08;1&#xff09;头文件&#xff08;2&#xff09;函数原型 3. detach() 函数&#xff08;1&#xff09;头…

列表优先于数组

在Java中&#xff0c;列表&#xff08;List&#xff09;通常优于数组&#xff0c;因为列表提供了更灵活的操作和动态调整大小的能力。下面是一个例子&#xff0c;展示了为什么在某些情况下使用列表比数组更好&#xff1a; import java.util.ArrayList; import java.util.List;…

交友网站的设计与实现(源码+数据库+论文+开题报告+说明文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

1125矩阵乘法(C语言)

一&#xff1a;题目 二&#xff1a;思路分析 1.对于学习过线性代数的人来说&#xff0c;对应公式十分熟悉&#xff0c;而对于没接触过线性代数的人来说&#xff0c;我们地一步要做的是从题目所给的公式中找规律 2.这个题目&#xff0c;给了我们三个变量n&#xff0c;m&#xf…

图扑物联 | WEB组态可视化软件

什么是组态&#xff1f; 组态的概念来自于20世纪70年代中期出现的第一代集散控制系统&#xff08;Distributed Control System&#xff09;&#xff0c;可理解为“配置”、“设置”等&#xff0c;是指通过人机开发界面&#xff0c;用类似“搭积木”的简单方式来搭建软件功能&a…

运营微信视频号要注意哪些问题?

视频号运营的5个雷点你别踩! 今天和你说的视频号运营的5大雷点 你踩过没? 这5点虽然和野花似的 但也不能踩哦 雷点1:违规行为 雷点2:抄袭剽窃 雷点3:没有明确目标受众 雷点4:短视频质量过低 雷点5:缺少社交互动 相信不管是视频号还是别的平台都通用哈

QML中Image动态显示图片内容

1.定义一个ColorImageProvider类 #ifndef COLORIMAGEPROVIDER_H #define COLORIMAGEPROVIDER_H#include <QObject> #include <QImage> #include <QQuickImageProvider>#include <QTimer>class ColorImageProvider :public QObject, public QQuickImag…

26.Java安卓程序设计-基于SSM框架Android的网店系统设计与实现

1. 引言 1.1 背景 介绍网店系统的背景&#xff0c;说明为什么设计这个系统以及系统的重要性。 1.2 研究目的 阐述设计基于SSM框架的Android网店系统的目标和意义。 2. 需求分析 2.1 行业背景 分析网店行业的特点和需求&#xff0c;以及目前市场上同类系统的不足之处。 …

docker consul 容器的自动发现与注册

consul相关知识 什么是注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初的…

基于ssm果蔬经营平台系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

Pygame游戏实战九:跳跃小游戏

介绍模块 本游戏使用的是由Pycharm中的pygame模块来实现的&#xff0c;也可以在python中运行。通过Pygame制作一个类似与跳跃游戏&#xff0c;但在游戏中并没有进行跳跃&#xff0c;而是通过键盘进行控制。 最小开发框架 详情请看此文章&#xff1a;Pygame游戏模块介绍二&am…

在4*4的平面上计算2a1+1+1

0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 在4*4的平面上有2个点&#xff0c;保持2a1的结构&#xff0c;然后向剩余的14个格子里随机扔2个石子。 共有14*13/291种可能 1 - - - 2 - - - 3 - - 1 4 - - - 1 1 - 1 1 - - - - - - - 1 - - …

生产环境_Apache Spark技术大牛的实践:使用DataFrame API计算唯一值数量并展示技术(属性报告)

业务背景 给前端提供算法集成好的数据&#xff0c;对算法处理后的数据进行进一步删选展示 可以使用下面代码运行一下看看结果&#xff0c;听有趣的&#xff0c;我写的代码中计算了不同字段的值的数量&#xff0c;并生成了一个显示字符串来描述这些数据的分布情况然后使用"…

Druid-spring-boot-starter源码阅读-其余组件自动装配

前面我们看完了整个DruidDataSource初始化流程&#xff0c;但是其实Druid除了最核心的数据源之外&#xff0c;还有其他需要自动配置的&#xff0c;细心的人可能看到了&#xff0c;就是利用Import注解导入的四个类。 DruidFilterConfiguration public class DruidFilterConfigu…

【Leetcode】相同的树、对称二叉树、另一颗树的子树

相同的树 思路&#xff1a; 这个题目实际上可以分解为许多个相同的子问题&#xff0c;就是检查每一个子树是否相同&#xff0c;然后便可以利用递归的思想来解答。 代码&#xff1a; bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(pNULL&&qNULL)return…

C++核心编程思路(1):①程序的内存模型②引用的作用

文章目录 前言一、不同的存储类型变量&#xff0c;会被存储在什么区&#xff1f;①const修饰的局部变量放在栈区&#xff0c;全局变量放在只读数据区。②static修饰的全局和局部变量都放在静态区&#xff08;即数据区中的一个小区&#xff09; 二、栈区1.如果在函数A中定义了一…

漏洞复现-网神SecGate3600防火墙敏感信息泄露漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…