这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 换逻辑分析仪+VerilogHDL存储器(memories)

共1条 1/1 1 跳转至

换逻辑分析仪+VerilogHDL存储器(memories)

工程师
2024-09-19 19:47:20   被打赏 20 分(兑奖)     打赏

在Verilog中,存储器的声明和赋值是硬件描述语言中的一个重要部分,特别是在设计需要存储大量数据的系统时。

存储器在Verilog中的定义存储器其实是一个寄存器数组的定义
reg [msb:1sb] memory1[upper1:lower1], memory2[upper2:lower2],. . . ;

存储器的声明

在Verilog中,存储器的声明通常涉及两个维度:位宽(bit width)和深度(depth)。位宽定义了每个存储单元的大小,而深度定义了存储单元的数量。


reg [3:0] ebi_mem [63:0]; // 64个4位的reg变量组成的数组  
reg gnt_rfile [4:0];      // 5个1位的reg变量组成的数组(注意索引从0开始)


存储器的赋值存储器的赋值需要指定索引,因为它们是数组。


reg [4:0] qburst; // 5位reg变量  
qburst = 5'b11011; // 正确  
  
reg hold_gnt [4:0]; // 5个1位reg变量组成的存储器  
hold_gnt[0] = 1'b1; // 正确,为第一个元素赋值  
hold_gnt[1] = 1'b1; // 正确,为第二个元素赋值  
// ... 以此类推
复制存储器内容要复制一个存储器到另一个存储器,可以使用循环语句。


parameter NUM_WORDS = 64;  
parameter WORD_LENGTH = 8;  
reg [WORD_LENGTH-1:0] mem_a [NUM_WORDS-1:0];  
reg [WORD_LENGTH-1:0] mem_b [NUM_WORDS-1:0];  
integer i;  
  
// 复制mem_a到mem_b  
for (i = 0; i < NUM_WORDS; i = i + 1) begin  
    mem_b[i] = mem_a[i];  
end


使用系统任务加载存储器Verilog提供了$readmemb和$readmemh系统任务来从文件中读取二进制或十六进制数据到存储器中。
reg [3:0] cdn_rom [7:0];  
  
// 从文件"ram.patt"中读取二进制数据到cdn_rom  
$readmemb("ram.patt", cdn_rom);  
  
// 如果文件内容如下:  
// 1101  
// 1001  
// 0011  
// 0111  
// ...  
// 则cdn_rom[0] = 4'b1101, cdn_rom[1] = 4'b1001, ...


MyMem和Bog都是存储器。数组的维数不能大于2。注意存储器属于寄存器数组类型。线网数据类型没有相应的存储器类型。Verilog中含有用户自己定义存储区的语句,上述语句,定义的意思为
reg [7:0] mem[0];
reg [7:0] mem[1];
reg [7:0] mem[2];
reg [7:0] mem[3];
     	   :
    	   :
reg [7:0] mem[255];


RAM(随机访问存储器)和寄存器(reg)之间的关键区别,以及FPGA内部RAM的两种主要类型:Block RAM和Distributed RAM。

下面我将详细解释这些概念以及它们之间的区别。

寄存器(Registers)

在FPGA设计中,寄存器(reg)通常用于存储临时数据,它们可以在时钟边沿(上升沿或下降沿)更新其值。寄存器通常用于存储状态信息、中间计算结果或作为流水线寄存器来优化时序。在Verilog中,可以通过声明一个reg数组来模拟一个简单的寄存器组,reg [7:0] mem[0:255],这表示有一个包含256个8位寄存器的数组。在这个数组中,可以在一个时钟周期内访问或更新任何位置的值,但这并不是真正的RAM行为,因为它不涉及地址解码和访问延迟。

RAM(随机访问存储器)

RAM是一种允许在任意时间访问任意存储位置的存储设备。在FPGA中,RAM资源通常用于存储大量数据,这些数据在算法执行过程中需要被频繁地读取和写入。

FPGA提供了两种类型的RAM资源:

Block RAM(块RAM):这是一种嵌入在FPGA芯片中的专用RAM块,Xilinx的M9K或M4K块,或Altera/Intel的M-RAM块。Block RAM通常具有较大的容量和较高的访问速度,非常适合存储大量数据。

它们支持多种配置,包括单端口、双端口和伪双端口模式,允许在单个时钟周期内对RAM进行读写操作。

Distributed RAM(分布式RAM):当Block RAM资源不足或不需要时,FPGA设计可以使用逻辑资源(查找表和寄存器)来模拟RAM行为,这称为Distributed RAM。Distributed RAM的容量和性能通常低于Block RAM,但它们可以更灵活地配置,以适应不同的设计需求。

由于Distributed RAM使用逻辑资源,因此它们可能会消耗更多的FPGA资源,并可能影响设计的整体性能。

RAM与寄存器的区别访问方式:RAM通过地址来访问数据,而寄存器组通常通过索引来访问(在FPGA的上下文中,这通常是通过合成工具将索引转换为地址来实现的)。容量和性能:RAM可以存储大量数据,但访问速度可能受到地址解码和访问延迟的影响。寄存器组通常具有较小的容量,但访问速度非常快。资源消耗:RAM(尤其是Block RAM)是专门为存储大量数据而设计的,而寄存器组则更多地用于存储状态或中间结果。在FPGA中,Block RAM资源是有限的,而寄存器资源则相对丰富。


总结:

在Verilog中,存储器定义为寄存器数组,涉及位宽和深度两个维度。FPGA中的RAM分为Block RAM和Distributed RAM,前者是嵌入的专用RAM块,适合存储大量数据;后者则利用逻辑资源模拟RAM,灵活性高但性能较低。RAM通过地址访问数据,而寄存器组则通过索引访问,尽管在硬件实现中索引会被转换为地址。RAM适合存储大数据量,而寄存器组则用于存储少量临时数据或状态。FPGA中的Block RAM资源有限,需根据设计需求合理分配。总的来说,Verilog中的存储器声明和赋值对于构建需要处理大量数据的系统至关重要,而理解FPGA中RAM的类型和特性则是高效利用这些资源的关键。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]