首页 > 其他分享 >Vitis HLS 学习笔记--static RAM/ROM

Vitis HLS 学习笔记--static RAM/ROM

时间:2024-06-09 22:01:18浏览次数:19  
标签:reset q0 ROM -- RAM DataWidth input URAM

目录

1. 简介

2. static RAM

2.1 无 reset 的情形

2.2 含 reset 的情形

3. static ROM

4. 总结


1. 简介

本文仍然是讨论阵列的初始化与复位问题,区别于《Vitis HLS 学习笔记--global_array_RAM初始化及复位-CSDN博客》,本文讨论的对象是静态阵列,RAM和ROM。

静态阵列可以映射到BRAM/URAM/LUTRAM,本文并展示了它们如何初始化以及如何重置。

2. static RAM

2.1 无 reset 的情形

无 reset,意味着静态变量存储器的值不会受到 reset 信号的影响。

#include <ap_int.h>

int example(int i) {
    static ap_int<10> A[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
#pragma HLS BIND_STORAGE variable = A type = RAM_2P impl = BRAM
    static ap_int<10> B[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
#pragma HLS BIND_STORAGE variable = B type = RAM_2P impl = LUTRAM
    static ap_int<10> C[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
#pragma HLS BIND_STORAGE variable = C type = RAM_2P impl = URAM
    A[i] += B[i] + C[i];
    B[i] += 5;
    C[i] += 10;

    int result = (A[i] + B[i] + C[i]).to_int();
    return result;
}

查看存储绑定信息:

================================================================
== Bind Storage Report
================================================================
+-----------+------+------+--------+----------+---------+--------+---------+
| Name      | BRAM | URAM | Pragma | Variable | Storage | Impl   | Latency |
+-----------+------+------+--------+----------+---------+--------+---------+
| + example | 1    | 1    |        |          |         |        |         |
|   B_V_U   | -    | -    | pragma | B_V      | ram_2p  | lutram | 1       |
|   C_V_U   | -    | 1    | pragma | C_V      | ram_2p  | uram   | 1       |
|   A_V_U   | 1    | -    | pragma | A_V      | ram_2p  | bram   | 1       |
+-----------+------+------+--------+----------+---------+--------+---------+

与 global_array_RAM 不同的是,static RAM 是支持使用 URAM 来实现的,我们使用下列指令绑定资源。

#pragma HLS BIND_STORAGE variable = C type = RAM_2P impl = URAM

从报告中我们也可以观察到,变量C已被分配为uram资源。

Verilog 代码结构:

以变量C为例,其实现的Verilog代码如下:

module example_C_V_RAM_2P_URAM_1R1W (address0, ce0, q0, address1, ce1, d1, we1,  reset,clk);

parameter DataWidth = 10;
parameter AddressWidth = 4;
parameter AddressRange = 10;

input[AddressWidth-1:0] address0;
input ce0;
output reg[DataWidth-1:0] q0;
input[AddressWidth-1:0] address1;
input ce1;
input[DataWidth-1:0] d1;
input we1;
input reset;
input clk;

(* ram_style = "hls_ultra", cascade_height = 1 *)reg [DataWidth-1:0] ram[0:AddressRange-1];

initial begin
    $readmemh("./example_C_V_RAM_2P_URAM_1R1W.dat", ram);
end


always @(posedge clk)  
begin 
    if (ce0) begin
        q0 <= ram[address0];
    end
end

always @(posedge clk)  
begin 
    if (ce1) begin
        if (we1) 
            ram[address1] <= d1; 
    end
end

endmodule

2.2 含 reset 的情形

含 reset,意味着静态变量存储器的值在 reset 信号有效时,会恢复到初始状态。

需要在源代码中添加如下指令:

#pragma HLS reset variable=A
#pragma HLS reset variable=B
#pragma HLS reset variable=C

 Verilog 代码结构:

以变量C为例,其实现的Verilog代码如下:

module example_C_V_RAM_2P_URAM_1R1W
#(parameter
    DataWidth    = 10,
    AddressWidth = 4,
    AddressRange = 10
)(
    input  wire                    clk,
    input  wire                    reset,
    input  wire [AddressWidth-1:0] address0,
    input  wire                    ce0,
    output wire [DataWidth-1:0]    q0,
    input  wire [AddressWidth-1:0] address1,
    input  wire                    ce1,
    input  wire                    we1,
    input  wire [DataWidth-1:0]    d1
);
//------------------------Local signal-------------------
reg  [AddressRange-1:0] written = {AddressRange{1'b0}};
wire [DataWidth-1:0]    q0_ram;
wire [DataWidth-1:0]    q0_rom;
wire                    q0_sel;
reg  [0:0]              sel0_sr;
//------------------------Instantiation------------------
example_C_V_RAM_2P_URAM_1R1W_ram #(
    .DataWidth(DataWidth),
    .AddressWidth(AddressWidth),
    .AddressRange(AddressRange))
example_C_V_RAM_2P_URAM_1R1W_ram_u(
    .clk      ( clk ),
    .reset    ( reset ),
    .ce0      ( ce0 ),
    .address0 ( address0 ),
    .q0       ( q0_ram ),
    .ce1      ( ce1 ),
    .address1 ( address1 ),
    .we1      ( we1 ),
    .d1       ( d1 )
);

example_C_V_RAM_2P_URAM_1R1W_rom #(
    .DataWidth(DataWidth),
    .AddressWidth(AddressWidth),
    .AddressRange(AddressRange))
example_C_V_RAM_2P_URAM_1R1W_rom_u(
    .clk      ( clk ),
    .ce0      ( ce0 ),
    .address0 ( address0 ),
    .q0       ( q0_rom )
);
//------------------------Body---------------------------
assign q0     = q0_sel? q0_ram : q0_rom;
assign q0_sel = sel0_sr[0];

always @(posedge clk) begin
    if (reset)
        written <= 1'b0;
    else begin
        if (ce1 & we1) begin
            written[address1] <= 1'b1;
        end
    end
end

always @(posedge clk) begin
    if (ce0) begin
        sel0_sr[0] <= written[address0];
    end
end

endmodule

这部分内容可以参见《Vitis HLS 学习笔记--global_array_RAM初始化及复位-CSDN博客》。

3. static ROM

#include <ap_int.h>

int example(int i) {
    static const ap_int<10> A[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
#pragma HLS BIND_STORAGE variable = A type = ROM_1P impl = BRAM
    static const ap_int<10> B[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
#pragma HLS BIND_STORAGE variable = B type = ROM_1P impl = LUTRAM

    return A[i] + B[i];
}

由于 ROM 是只读的,所以使用 ROM_1P 来实现,即只有一个读取口。

ROM 存储器实现不可由 URAM 来实现。

查看存储器绑定报告: 

================================================================
== Bind Storage Report
================================================================
+-----------+------+------+--------+----------+---------+--------+---------+
| Name      | BRAM | URAM | Pragma | Variable | Storage | Impl   | Latency |
+-----------+------+------+--------+----------+---------+--------+---------+
| + example | 1    | 0    |        |          |         |        |         |
|   A_V_U   | 1    | -    | pragma | A_V      | rom_1p  | bram   | 1       |
|   B_V_U   | -    | -    | pragma | B_V      | rom_1p  | lutram | 1       |
+-----------+------+------+--------+----------+---------+--------+---------+

可以看到 ROM 也是通过 bram/lutram 来实现的,不过不影响,没有对外暴露写端口。

Verilog 代码结构:

 

 以变量A为例,其实现的Verilog代码如下:

(* rom_style = "block" *) module example_A_V_ROM_1P_BRAM_1R (
address0, ce0, q0, reset,clk);

parameter DataWidth = 4;
parameter AddressWidth = 4;
parameter AddressRange = 10;

input[AddressWidth-1:0] address0;
input ce0;
output reg[DataWidth-1:0] q0;
input reset;
input clk;

(* ram_style = "block" *)reg [DataWidth-1:0] ram[0:AddressRange-1];

initial begin
    $readmemh("./example_A_V_ROM_1P_BRAM_1R.dat", ram);
end

always @(posedge clk)  
begin 
    if (ce0) 
    begin
        q0 <= ram[address0];
    end
end

endmodule

4. 总结

在本文中,我们探讨了静态阵列在Vitis HLS中的初始化和复位问题,特别是与全局阵列RAM相比,静态RAM的不同之处。我们了解到静态阵列可以映射到BRAM、URAM或LUTRAM,并且可以通过特定的HLS指令进行初始化和重置。在无reset情形下,静态变量存储器的值不受reset信号影响,而在含reset情形下,存储器的值会在reset信号有效时恢复到初始状态。此外,我们还讨论了静态ROM的实现,它是只读的,通常使用BRAM或LUTRAM实现,但不能使用URAM。通过这些讨论,我们可以更好地理解如何在硬件设计中有效地使用这些存储结构,以及如何通过Vitis HLS工具来优化它们的实现。总的来说,这些知识对于那些希望在FPGA编程中实现高效存储和数据访问的开发者来说是非常宝贵的。

标签:reset,q0,ROM,--,RAM,DataWidth,input,URAM
From: https://blog.csdn.net/DongDong314/article/details/139479267

相关文章

  • 一站式详解Maven工程的setting文件内容
    maven 是目前java 常见的一款jar包管理工具,除了大家熟知的依赖管理外, maven也可以很方便的对项目进行编译、测试,打包、部署等操作。本文将详细带大家了解一下Maven工程conf文件夹下的setting.xml文件,需要的朋友可以参考下:setting.xml文件是Maven的主要配置文件,它包......
  • 在本地的maven仓库中有所需要的依赖包,为何还会远程下载依赖
    在平时开发中我们经常会遇见这样的问题:明明本地有需要的依赖包,但是maven还是会从远程仓库拉取,如果远程仓库有需要的包还好,如果没有,或者无网络环境下没法访问远程仓库,那就直接报错,走不下去了。其实这很好处理的:原因:在本地仓库的每个依赖包都存在这样的文件:_remote.repositories......
  • 如何下载EarMaster Pro软件及详细安装步骤
    根据大数据调查表明软件功能和优势:灵敏的音高识别系统,准确辨认出您演唱或演奏的乐段。我们必须承认来自丹麦皇家歌曲学院的多媒体歌曲教育软件EarMasterPro以问答的交互形式,寓教于乐的视听方法,给专业和非专业歌曲人士以极大的歌曲学习帮助。很明显EarMaster提供了相当多的......
  • macbookrpro使用体验
    前言之前用的电脑是拯救者y70002020,用了四五年,年前就有换电脑的打算。计划就是买一个苹果电脑,在查看了挺多电脑,多方面对比后,最终还是买了Macbookpro。我买的笔记本的配置如下:购买14英寸的原因之前我的拯救者是15.6英寸的,背起来很沉,所以想换个14英寸的电脑。购买36GB......
  • 博物馆展览与服务一体化平台的设计与实现(论文+源码)_kaic
     摘 要博物馆展览与服务一体化,其工作流程繁杂、多样、管理复杂与设备维护繁琐。而计算机已完全能够胜任博物馆展览与服务一体化工作,而且更加准确、方便、快捷、高效、清晰、透明,它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大的方便,从而给博物馆展览与服......
  • 快速了解JVM机制
    1.JVM简介JVM是JavaVirtualMachine的简称,意为Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。常⻅的虚拟机:JVM、VMwave、VirtualBox。JVM和其他两个虚拟机的区别:VMwave与VirtualBox是通过软件模拟物......
  • FL Studio for Mac 21.2.3.3586官方中文破解版及FL注册解锁秘钥
    Hey小仙女们!今天小助手来跟你们分享一个超级激动人心的消息哦!你们有没有听说过FLStudio21破解版?这可是一款让你的音乐创作更加轻松、时尚和精彩的软件呢!FLStudioforMac21.2.3.3586官方中文破解版重磅发布纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心......
  • 屏幕录制TechSmith Camtasia 2024 v24.0.0.1041 中文破解版2024最新免费版
    camtasia2024是由美国TechSmith公司出品的一款屏幕录制及视频编辑软件,其包含了屏幕录像、视频剪辑和编辑、视频录音配音、视频菜单制作、视频剧场和视频播放等功能,可以将多种格式的图像、视频剪辑连接成电影,支持输出AVI、MP4、GIF、RM、WMV、MOV等常见格式,并可将电影文件打包成......
  • 1.安装opencv-python失败的解决办法 2.pip 安装失败 3.WARNING:Ignoring invalid distr
    问题:安装opencv-python失败:用:pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpleopencv-python安装会被卡在Buildingwheelforopencv-python(pyproject.toml)...之后便安装失败。使用顺序:先使用方法二,再使用方法一(有可能不会解决问题),用方法三查看问题出......
  • AI菜鸟向前飞 — LangChain系列之十七 - 剖析AgentExecutor
    AgentExecutor顾名思义,Agent执行器,本篇先简单看看LangChain是如何实现的。    先回顾AI菜鸟向前飞—LangChain系列之十四-Agent系列:从现象看机制(上篇)AI菜鸟向前飞—LangChain系列之十五-Agent系列:从现象看机制(中篇)一个Agent的“旅行”AI菜鸟向前飞—Lang......