verilog语法进阶-分布式ram

概述:

FPGA的LUT查找表是用RAM设计的,所以LUT可以当成ram来使用,也并不是所有的LUT都可以当成ram来使用,sliceM的ram可以当成分布式ram来使用,而sliceL的ram只能当成rom来使用,也就是只能读,不能写,它的写叫做编程,只有在上电加载程序的时候能够写。在运行的过程不可以修改。FPGA是由阵列CLB构成的,每个CLB由4个slice组成,每个slice包含一个LUT,每个LUT4可以看错是一个16x1的ram,这些小的ram也以阵列的形式排列在FPGA内部,故而称为分布式ram,对于一大块RAM,也就是具有16kbit的ram称为块ram,一般FPGA内部有几十个块ram,几千个分布式ram,根据FPGA的型号来确定。

分布ram的作用,用作数组使用,常用于小的配置文件或者配置参数,不必申请块ram,块ram往往用于存放大量数据。

内容:

1. 单端分布式ram

代码

分布式ram定义语句:

(* RAM_STYLE="{AUTO | DISTRIBUTED | PIPE_DISTRIBUTED}" *)

reg RAM_WIDTH-1:0 dram (2\*\*RAM_ADDR_BITS)-1:0;

其中,RAM_WIDTH为位的宽度,(2**RAM_ADDR_BITS)-1为位的深度,是2**n。

访问方式dramaddress,address是地址线,相当于数组的序号,从0开始。

dramaddress位于等式坐标,表示写地址,位于等式右边表示读,支持读写不同地址。也就是双端口

复制代码
module regtest(
	input clk,
	input write_enable,
	input [4-1:0] input_data,
	output [4-1:0] output_data,
	input [5-1:0] address
    );

parameter RAM_WIDTH = 4;
parameter RAM_ADDR_BITS = 5;

(* 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

RTL结构图,结构图看上去很复杂,其实就是译码器+锁存器,译码器就是选择地址线,控制锁存器的使能端,锁存器用于存放的具体数据。

技术原理图,技术原理图上就很简单了,是FPGA以及设计好了的4pian32x1的ram。

2. 双端分布式ram

代码

复制代码
module regtest(
	input clk,
	input write_enable,
	input [4-1:0] input_data,
	output [4-1:0] output_data,
	input [5-1:0] write_address,read_address
    );

parameter RAM_WIDTH = 4;
parameter RAM_ADDR_BITS = 5;

(* 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

RTL结构图

技术原理图

总结

  1. 分布式ram是由LUT查找表构成,查找表是阵列排列的,因此分布式ram也是阵列排列的,故而称为分布式ram

2.. 分布式ram的定义 (* RAM_STYLE="{AUTO | DISTRIBUTED | PIPE_DISTRIBUTED}" *)

reg RAM_WIDTH-1:0 dram (2\*\*RAM_ADDR_BITS)-1:0;

  1. 分布式ram的读写操作可以分开,也就是读地址线和写地址写分开,构成双口ram形式。
相关推荐
zlinear数据采集卡14 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
zlinear数据采集卡16 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
Hello-FPGA19 小时前
AI 如何自动通过 PDF 原理图生成管脚映射
人工智能·fpga开发·pdf
zlinear数据采集卡19 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
鬼手点金1 天前
FPGA常用型号参考
fpga开发·verilog·vivado·xilinx·vhdl·altera·lattice
Kong_19942 天前
芯片开发学习笔记·二十九——大模型基础知识与 KV Cache 详解
fpga开发·芯片开发
m0_46644103詹湛2 天前
FPGA 定点数、小数与负数的加减乘除原理
fpga开发
zlinear数据采集卡2 天前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
zlinear数据采集卡3 天前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
FPGA小迷弟3 天前
Vivado中高速收发器GTX/GTH的配置与调试实战
fpga开发·fpga·硬件开发