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

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求