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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

java学习,进阶,提升

http://how2j.cn/k/hutool/hutool-brief/1930.html?p=73689

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端