首页 > 其他分享 >Xilinx资源浅析之移位寄存器,BRAM,URAM

Xilinx资源浅析之移位寄存器,BRAM,URAM

时间:2024-08-19 19:53:54浏览次数:12  
标签:mem UltraRAM srl 寄存器 Xilinx URAM 浅析 移位 赋值

  1. 移位寄存器SRLC32E

ram_based_shifter  Xilinx系列FPGA硬核IP,能够有效对移位寄存器进行处理,节省LUT资源

1,移位寄存器两种基本数据流

1、动态读操作(移位长度不固定)

(1)输出Q由5位地址决定

(2)每当一个新地址到达时,在经过访问LUT的时间延迟后,输出Q变化

(3)读操作是异步的,独立于时钟和时钟使能信号

2、静态读操作(移位长度固定)

(1)当5位地址固定时(地址固定意味着移位长度固定),输出Q使用相同的比特位

(2)该模式在一个LUT中实现了从1到32位的任何移位寄存器长度

(3)移位寄存器长度为(N + 1),其中N为输入地址(0-31)

(4)输出Q与每一次的移位操作是同步的

(5)前一位被移到下一个位置,并出现在Q输出上

2、移位寄存器例化

除了ram_based_shifter  IP配置这种方式外,Xilinx FPGA使用移位寄存器资源还存在原语例化和工具推断两种方式生成shifter。

1、原语例化

// SRLC32E: 32-bit variable length cascadable shift register LUT (Mapped to a SliceM LUT6)

// with clock enable

// 7 Series

// Xilinx HDL Language Template, version 2019.1

SRLC32E #(

 .INIT(32'h00000000) // Initial Value of Shift Register

) SRLC32E_inst (

 .Q(Q), // SRL data output

 .Q31(Q31), // SRL cascade output pin

 .A(A), // 5-bit shift depth select input

 .CE(CE), // Clock enable input

 .CLK(CLK), // Clock input

 .D(D) // SRL data input

);

// End of SRLC32E_inst instantiation

2、vivado推断

        这里首先要注意的是,移位寄存器是不支持复位和置位的,所以我们的设计中要尽量避免复位和置位,防止vivado推断出现错误。

2.1采用命令

 (srl_style = “ ”)

可选择的属性有:

 (1)register:用FF生成SRL

 (2)srl:用LUT生成SRL

 (3)srl_reg:用LUT和FF生成SRL,最后一级深度用FF

 (4)reg_srl:第一级深度用FF,其他用LUT

 (5)reg_srl_reg:第一和最后级深度用FF,其他用LUT

 (6)block:用BRAM生成SRL

也可以使用命令 ( shreg_extract = “ ”) 

可选的属性有:(1)yes:使用上述的移位寄存器结构

(2)no:不使用上述移位寄存器结构

当两者同时出现时,shreg_extract的优先级更高。

//使用寄存器实现移位寄存器

(* srl_style = "register" *) reg [16:0] my_srl;

//使用SRL实现移位寄存器

(* srl_style = "srl" *) reg [16:0] my_srl;

//使用寄存器实现移位寄存器

(* shreg_extract = "no" *) reg [16:0] my_srl;

//使用SRL实现移位寄存器

(* shreg_extract = "yes" *) reg [16:0] my_srl;

Block RAM and UltraRAM Differences

BRAM与URAM是Xilinx FPGA中常见的存储器资源,BRAM可配置为18k,36k bits两种模式;URAM一般为288k bits。Block RAM 和 UltraRAM 之间的主要区别是:

  • UltraRAM 具有一个单一的时钟输入,是完全同步的,并且与 Block RAM 不同,它不直接支持独立的时钟接口。
  • 不支持可配置端口宽度的单个4K x 72 UltraRAM 或多个时钟域。但是,UltraRAM 块的字节写使能功能可用于在存储器结构本身之外支持此功能。
  • UltraRAM 仅支持每个端口每个周期的读取或写入。
  • 简单双端口(SDP) 和真正的双端口(TDP) Block RAM 模式不直接适用于UltraRAM。 UltraRAM 端口行为可以看作是 SDP 的超集,而不是 TDP。
  • 固定读取行为; UltraRAM 没有用户可定义的先读、先写、不变模式。
  • 静态数据级联; UltraRAM 没有动态级联输入或输出多路复用器控制。
  • UltraRAM 不可能发生地址冲突。
  • UltraRAM 级联数据、地址和控制信号,而不仅仅是数据线。
  • 在UltraRAM 省电模式(SLEEP) 期间,只要满足设置和保持时间,用户操作将被忽略并且内容不会损坏。内存内容在睡眠省电模式下保留。
  • 自动节能可以通过使用自动睡眠功能来实现,该功能可以根据活动独立控制唤醒和睡眠模式。该模式通过预测一列或多列中许多级联 UltraRAM 块的活动,动态地为链中选定的 UltraRAM 块打开或关闭睡眠模式。对于单个 UltraRAM 块应用程序,使用此功能需要许多不活动周期才能发挥作用。

不得违反 UltraRAM 地址、启用和睡眠引脚的时钟最小脉冲宽度和建立/保持时间。违反时钟最小脉冲宽度或这些设置/保持时间(即使写使能为低)可能会破坏 UltraRAM 的数据内容。这最常发生在时钟不稳定或驱动 UltraRAM 控制引脚的触发器被异步复位时,例如系统范围内的复位。为避免此问题,请确保时钟稳定,并为断言和反断言设计同步复位。当时钟不稳定时,禁用时钟缓冲器或禁用驱动 UltraRAM 控制引脚的逻辑或置低 UltraRAM EN 输入。

Memory 数组初始化方式

在 Verilog 中,对数组(memory)赋值可以通过几种不同的方式实现,具体取决于数组的类型和上下文。以下是一些常见的数组赋值方法:

直接赋值:

对于小的、静态的数组,可以直接使用数组名和索引进行赋值。

reg [7:0] mem[0:3]; // 定义一个4位宽,4深的寄存器数组

initial begin

    mem[1] = 8'hA5; // 直接给数组的第二个元素赋值

end

循环赋值:

使用循环结构对数组的多个元素进行赋值。

initial begin

    int i;

    for (i = 0; i < 4; i = i + 1) begin

        mem[i] = i * 4; // 使用循环给数组的每个元素赋值

    end

end

文件输入:

使用 $readmemb 或 $readmemh 从文件中读取数据并赋值给内存数组。

reg [7:0] mem[0:1023]; // 定义一个4位宽,1024深的寄存器数组

initial begin

    $readmemb("mem_file.bin", mem); // 从二进制文件中读取数据

    // 或者

    $readmemh("mem_file.hex", mem); // 从十六进制文件中读取数据

end

参数化赋值:

在模块实例化时,使用参数传递数组的初始值。

module my_module (

    input [7:0] mem_array[0:3]

);

// 模块内部使用 mem_array

endmodule

// 在顶层模块中实例化并赋值

my_module my_mod_inst (.mem_array(mem));

使用 initial 块:

在 initial 块中,可以对数组进行初始化赋值。

initial begin

    mem = 4'b0; // 对数组的所有位进行初始化赋值

end

使用 generate 语句:

使用 generate 和 for 循环来生成数组的赋值语句。

genvar i;

generate

    for (i = 0; i < 4; i = i + 1) begin : gen_block

        assign mem[i] = some_signal[i];

    end

endgenerate

使用任务(tasks)或函数(functions):

定义任务或函数来对数组进行赋值操作。

task automatic set_mem;

    input [3:0] value;

    begin

        mem = value;

    end

endtask

// 调用任务

initial set_mem(4'b1);

标签:mem,UltraRAM,srl,寄存器,Xilinx,URAM,浅析,移位,赋值
From: https://blog.csdn.net/qq_40238141/article/details/141333444

相关文章

  • AMD Xilinx MPSoC 在分别下载 PL bit文件、PS软件的情况下,PS软件如何访问 PL AXI寄存
    在调试模式下,可以通过JTAG下载MPSoCPL的bit文件,再下载MPSoCPS的软件。这时候,PL已经下载,PS软件应该能够访问PL实现的AXI寄存器。但是PS的软件会卡住。如果使用同样的软件和bit文件,做成boot.bin,在QSPI/SD启动模式下,又一切正常。或者boot.bin里只有PS的软件,启动过程中通过Vivado加......
  • AMD Xilinx PCIe Host 配置空间访问流程
    AMDXilinx的Versal器件中的PCIeIP,也可以作为PCIeHost。AR76647提供了相关驱动。XilinxLinuxPLPCIeRootPort提供了配置和测试过程。最近研究了Linux下,AMDXilinxPCIeHost配置空间访问流程。pci_read_config_xxx和pci_write_config_xxx函数定义首先,Linux通用......
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(9)--TX/RX通道
    目录1、TX端的剩余模块1.1、TXPIPEControl1.2、TXGearbox1.3、PCIEBeacon1.4、SATAOOB1.5、PhaseAdjustFIFO1.6、Polarity1.7、PISO1.8、TXPre/PostEmp和10、TXDriver1.9、TXOOBandPCIE1.10、TXDriver1.11、TXPhaseInterpolatorController(包括12......
  • Dubbo源码浅析(一)—RPC框架与Dubbo
    一、什么是RPC1.1RPC概念RPC,RemoteProcedureCall即远程过程调用,与之相对的是本地服务调用,即LPC(LocalProcedureCall)。本地服务调用比较常用,像我们应用内部程序**(注意此处是程序而不是方法,程序包含方法)**互相调用即为本地过程调用,而远程过程调用是指在本地调取远程过......
  • 浅析house of cat(下)
    前言:这篇是hosueofcat系列的最后一篇,之后估计要停一段时间去学apple1,个人感觉学习的顺序应该是orange->apple2->cat->emma->apple1但是实际上学到cat应该就可以通杀了。但是本着学习的态度,还是看看apple1。外一以后需要用上呢。例题:这里选的例题是2022强网杯的hou......
  • 浅析house of cat(上)
    前言原本以为只学习houseofapple2就足以应对所有高版本了,但是还是被白名单制裁了,这里浅析一下houseofcat以弥补apple2的缺陷。houseofcat预计分三个部分来讲解,这篇是源码原理分析。中篇主要讲解源码调试和一些在本篇里没有讲解到的小细节绕过,下篇主要讲解例题。我个人......
  • 【xilinx】Xilinx最强FPGA VU系列简介
    在高性能计算和数据处理领域,FPGA扮演着日益重要的角色。Xilinx的Virtex™UltraScale+™(VU)系列以其卓越的性能和灵活性,为各种高端应用提供了强有力的支持。以下是关于VU系列的详细介绍。AMDVirtex™UltraScale+™产品优势Xilinx的VirtexUltraScale+™FPGA系列产品,在14n......
  • MySQL8.0 Clone Plugin 实现解析浅析
    MySQL8.0ClonePlugin实现解析浅析从8.0.17版本开始官方实现了clone的功能,允许用户通过简单的SQL命令把远端/本地的数据库实例拷贝到其他实例后快速拉起一个新的实例。该功能由一些列的WL组成:Clonelocalreplica(WL#9209):实现了数据本地Clone。Cloneremotereplica......
  • xilinx ZCU106板子运行AMP多核双CPU
    一开始的是需要在xilinx板子上HDMI直通,经过在xilinx官网上的寻找,最终发现两种办法,第一种是hdmi_rx_ss---->vpss-scaler---->axis-broadcaster---->FrameBufferWrite---->Gstreamer---->FrameBufferRead---->v_mix---->hdmi_tx_ss,最终缩减到hdmi_rx_ss---->Fr......
  • 浅析对象的clone()方法
    ......