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

2023-12-17 12:01

本文主要是介绍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的原语分为单端和双端

这篇关于verilog语法进阶-分布式ram原语的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504299

相关文章

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT