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

概述

官方提供的原语

   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的原语分为单端和双端

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC上传下载文件解读

知识点 文件上传&#xff08;File Upload&#xff09;&#xff1a; 创建一个控制器方法&#xff0c;使用 MultipartFile 参数来接收上传的文件。在 Spring 配置文件中配置一个 MultipartResolver&#xff0c;常用的实现类是 CommonsMultipartResolver。在 MultipartResolver …

PyTorch官网demo解读——第一个神经网络(1)

神经网络如此神奇&#xff0c;feel the magic 今天分享一下学习PyTorch官网demo的心得&#xff0c;原来实现一个神经网络可以如此简单/简洁/高效&#xff0c;同时也感慨PyTorch如此强大。 这个demo的目的是训练一个识别手写数字的模型&#xff01; 先上源码&#xff1a; fr…

crmeb v5新增一个功能的完整示例记录

首先&#xff0c;需求 工作中的二开需求是这样的&#xff0c;修改首页的装修&#xff0c;并新增回收报价的功能 开始动手 第一步&#xff0c;我们要到后面的管理界面&#xff0c;去装修中修改首面的展示 首页的页面配置好之后&#xff0c;就要在 前端的展示程序中 配置相…

105基于matlab的阶次分析算法

基于matlab的阶次分析算法&#xff0c;用于变转速机械故障特征提取&#xff0c;可运行&#xff0c;包含寻找脉冲时刻&#xff0c;等角度时刻。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 105阶次分析变转速信号处理 (xiaohongshu.com)

二十七、读写文件

二十七、读写文件 27.1 文件类QFile #include <QCoreApplication>#include<QFile> #include<QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("D:/main.txt");if(!file.open(QIODevice::WriteOnly | QIODe…

Arrays.asList()方法:陷阱与解决之道

在Java编程中&#xff0c;Arrays类提供了一系列用于操作数组的实用方法。其中&#xff0c;​Arrays.asList()​方法是一个常用的方法&#xff0c;用于快速将数组转换为List集合。然而&#xff0c;这个方法存在一些潜在的陷阱&#xff0c;可能导致出现意外的行为。本文将介绍​A…

数据可视化---柱状图

import matplotlib.pyplot as plt import numpy as npdef plot_bar_chart(data, labels, colorsNone, title"Bar Chart", xlabel"X-Axis", ylabel"Y-Axis"):"""绘制柱状图&#xff0c;并在柱子上显示数量和比例。:param data: 包…

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C11系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.探究std::initializer_list是什么…

OceanBase 4.2.1社区版 最小资源需求安装方式

OceanBase 4.2.1社区版 最小资源需求安装方式 资源需求 资源需求分析 observer Memory 控制参数&#xff1a; memory_limit_percentage 默认80% memory_limit 直接设定observer Memory 大小 System memory 可设为1G 租户内存:sys租户内存设为1G&#xff0c;OCP需要的租户oc…

Mac brew install youtube-dl 【 youtube 下载工具:youtube-dl 安装】

文章目录 1. 简介2. 预备3. 安装4. 命令5. 测试 1. 简介 youtube-dl - 从youtube.com或其他视频平台下载视频 https://github.com/ytdl-org/youtube-dl 2. 预备 安装并配置 git安装 brew 3. 安装 MacBook-Pro ~ % brew install youtube-dl Warning: youtube-dl has been …

【Java系列】详解多线程(三)—— 线程安全(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…

基于EasyExcel的数据导入导出

前言&#xff1a; 代码复制粘贴即可用&#xff0c;主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。 根据实际情况修改一些细节即可&#xff0c;最后有结果展示&#xff0c;可以先看下结果&#xff0c;是否是您想要的。 台上一分钟&#xff0c;台下60秒&a…

OSG中几何体的绘制(二)

5. 几何体操作 在本章的前言中就讲到&#xff0c;场景都是由基本的绘图基元构成的&#xff0c;基本的绘图基元构成简单的几何体,简单的几何体构成复杂的几何体&#xff0c;复杂的几何体最终构造成复杂的场景。当多个几何体组合时&#xff0c;可能存在多种降低场景渲染效率的原因…

SQL进阶理论篇(七):B+树的查询及存储机制

文章目录 简介数据库中的存储结构数据库中的页结构从数据页来看B树的查询过程总结参考文献 简介 我们之前已经了解过数据库的B树索引和Hash索引&#xff0c;这些索引信息以及数据记录都是保存在文件里的&#xff0c;确切的说是存储在页结构中。 本节&#xff0c;从我们将了解…

【LeetCode刷题】-- 161.相隔为1的编辑距离

161.相隔为1的编辑距离 方法&#xff1a;一次遍历 首先&#xff0c;我们要确认字符串的长度不会相差太远。如果长度差了2个或更多字符&#xff0c;那么 s 和 t 就不可能是一次编辑之差的字符串。 接下来&#xff0c;我们假设 s 的长度总是短于或等于 t 的长度。如果不是这样&…

cesium 自定义贴图,shadertoy移植教程。

1.前言 cesium中提供了一些高级的api&#xff0c;可以自己写一些shader来制作炫酷的效果。 ShaderToy 是一个可以在线编写、测试和分享图形渲染着色器的网站。它提供了一个图形化的编辑器&#xff0c;可以让用户编写基于 WebGL 的 GLSL 着色器代码&#xff0c;并实时预览渲染结…

大数据存储技术(3)—— HBase分布式数据库

目录 一、HBase简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;特点 &#xff08;三&#xff09;HBase架构 二、HBase原理 &#xff08;一&#xff09;读流程 &#xff08;二&#xff09;写流程 &#xff08;三&#xff09;数据 flush 过程 &#xf…

配置802.1x认证

实验目的&#xff1a; 某公司拥有两个部门&#xff0c;市场部和人事部门&#xff0c;市场部和人事部的IP地址分别为10.1.11.0/24、10.1.21.0/24两个IP网段。市场部属于vlan11&#xff0c;人事部属于vlan21。现在需要在SW2上配置802.1x认证&#xff0c;实现终端用于只有认证成功…

BKP 备份寄存器 RTC 实时时钟-stm32入门

这一章节我们要讲的主要内容是 RTC 实时时钟&#xff0c;对应手册&#xff0c;是第 16 章的位置。 实时时钟这个东西&#xff0c;本质上是一个定时器&#xff0c;但是这个定时器&#xff0c;是专门用来产生年月日时分秒&#xff0c;这种日期和时间信息的。所以学会了 STM32 的…

Flink系列之:SQL提示

Flink系列之&#xff1a;SQL提示 一、动态表选项二、语法三、例子四、查询提示五、句法六、加入提示七、播送八、随机散列九、随机合并十、嵌套循环十一、LOOKUP十二、进一步说明十三、故障排除十四、连接提示中的冲突案例十五、什么是查询块 SQL 提示可以与 SQL 语句一起使用来…