当前位置: 首页 > news >正文

FPGA学习笔记#7 Vitis HLS 数组优化和函数优化

本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习


学习笔记:《FPGA学习笔记》索引
FPGA学习笔记#1 HLS简介及相关概念
FPGA学习笔记#2 基本组件——CLB、SLICE、LUT、MUX、进位链、DRAM、存储单元、BRAM
FPGA学习笔记#3 Vitis HLS编程规范、数据类型、基本运算
FPGA学习笔记#4 Vitis HLS 入门的第一个工程
FPGA学习笔记#5 Vitis HLS For循环的优化(1)
FPGA学习笔记#6 Vitis HLS For循环的优化(2)
FPGA学习笔记#7 Vitis HLS 数组优化和函数优化
FPGA学习笔记#8 Vitis HLS优化总结和案例程序的优化


目录

  • 1.数组优化
  •     1.1.双端口内存
  •     1.2.数组分割
  •         1.2.1.一维数组分割
  •         1.2.2.多维数组分割
  •     1.3.数组合并
  •         1.3.1.横向合并
  •         1.3.2.纵向合并
  •         1.3.3.数组分割和数组合并的结合使用
  •     1.4.数组转换(reshape)
  •     1.5.数组分割、合并和转换的对比
  •     1.6.其他数组优化
  •         1.6.1.定义ROM
  •         1.6.2.数组初始化
  •         1.6.3.FPGA的复位(一定要知道!)
  • 2.函数优化
  •     2.1.数据类型优化
  •     2.2.inline
  •     2.3.Allocation
  •     2.4.DATAFLOW

1.数组优化

数组的优化对程序性能的提升是非常重要的,一个合理的内存结构可以提高程序的并行度,我们要找到资源和性能的权衡点,最大化FPGA使用率。

如果数组为top函数传入的参数,会表现为外部memory;如果设计在内部,则会用内部RAM、LUTRAM、UltraRAM、寄存器等形式表示。

1.1.双端口内存

考虑如下图所示的例程,top函数接收一个输入数组mem[N](N=4),将每三个连续数据求和,输出到sum[N-2]数组中,共2轮循环。

很明显,在每一次循环中需要读取mem数组三次,写入sum数组一次,可以看到右侧的时序图,完成一次写操作需要3个时钟周期。

对于这样输出只用一次、输入使用多次,我们可以使用RESOURCE directive配置为双端口内存,提高对内存的读取效率:

#pragma HLS RESOURCE variable=mem core=RAM_2P_BRAM

并同时对loop进行UNROOL:

对应的资源消耗和时序如下,现在一个时钟周期可以读取2个数据,UNROLL出的2组电路在4个时钟周期便完成计算。


1.2.数组分割

1.2.1.一维数组分割

如下图是对于一个6长度数组的不同memory分配,这三种方式分别对应了一个数组对连续块进行处理(常见的可以考虑前一半和后一半分别有不同的处理,block/factor=2)、一个数组对间隔数据进行处理(常见的可以考虑奇偶数据,cyclic/factor=2)、最高效率并发处理。

Block/Factor=3方式分割:数组等分成三份,相邻2数据为1#pragma HLS ARRAY_PARTITION variable=mem block factor=3 dim=1
Cyclic/Factor=3方式分割:数组等分为三份,03一组14一组25一组
#pragma HLS ARRAY_PARTITION variable=mem cyclic factor=3 dim=1
Register方式分割:数组等分为6份,一个数据一组(占一个寄存器)
#pragma HLS ARRAY_PARTITION variable=mem complete dim=1

不同分割方法的时序如下:

对于上面例程中的1输出-3输入运算关系,使用Block/Factor=2,分为2个数组,再使用双端口RAM,一次最多可以读取4数据,完全够用,无需开到Factor=3。


1.2.2.多维数组分割

以多维数组My_array[10][6][4]为例,10是一维,6是二维,4是三维,使用的约束和一维数组的一样,只需要改变dim的值:

#pragma HLS ARRAY_PARTITION variable=mem block factor=3 dim=?
#pragma HLS ARRAY_PARTITION variable=mem cyclic factor=3 dim=?
#pragma HLS ARRAY_PARTITION variable=mem complete dim=?

对于指定不同dim,HLS会对不同的数组进行整体分割,如图为dim=3和dim=1所针对的数据,如果对dim3使用block/factor=2,则My_array_0和1一组,2和3一组进行分配。

我们以矩阵加法为例,如图有两个4*5矩阵mat_a和mat_b,其相加后结果存储在sum矩阵中:

我们可以三个数组采用单端口BRAM存储,均对第一维使用Block/Factor=4的分割,即每个矩阵分割为4个长度为5的一维数组,并对循环添加PIPELINE、UNROLL约束来进行优化:

我们看一下Factor=4和2的情况,当Factor<该维数据个数时,会将对应数据依次拼接,总之一定会将一个N维数组变为一个N-1维数组。

不同factor的时序图如下,可以通过地址线确定其在内存中也是顺序排列:


1.3.数组合并

将多个小数组合并为一个大数组不仅可以减少资源用量,在合理使用下也能提高性能。

数组合并使用的约束是ARRAY_MAP,其分为横向和纵向。

1.3.1.横向合并

横向/水平方向合并(Horizontal mapping)使用的约束语句如下,其扩展数组长度,而不扩展数组位宽。

#pragma ARRAY_MAP variable=A instance=ab_array horizontal
#pragma ARRAY_MAP variable=B instance=ab_array horizontal

如下图,有数组A[N]和B[M],使用该约束后会合并为AB[N+M],低地址为0 ~ N-1,高地址为N ~ N+M-1。

这一操作会扩展B(数据位宽较小者)的位宽,拼接后的数组以所有数组中最大位宽为准,长度为各个数组相加。

可以看出,这一操作所针对的场景和数组分割中的Block相似。

得到的数组的内存分配如下:


1.3.2.纵向合并

纵向/垂直方向合并(Vertical mapping)的依赖语句如下:

#pragma ARRAY_MAP variable=A instance=ab_array vertical
#pragma ARRAY_MAP variable=B instance=ab_array vertical

如下图中,N>M,则扩展A数组的位宽为sizeof(A[0])+sizeof(B[0]),将B数组的对应数据和A数组对应数据拼接,A数组的长度不变。

这一操作针对的场景和数组分割中的cyclic相似。

数组合并后的内存分配如下:


1.3.3.数组分割和数组合并的结合使用

ARRAY_PARTITION和ARRAY_MAP是可以结合使用的,考虑如下例子:

对于2个数组m_accum和v_accum,我们在一个循环中分别使用其奇数下标的数据,在另一个循环中分别使用其偶数下标的数据。

这是我们从单个数组角度上,我们需要使用cyclic进行数据分割;从2个循环的角度上,我们需要将奇数据和奇数据水平拼接,偶数据和偶数据水平拼接,我们就可以使用如下的约束语句:

#pragma HLS ARRAY_PARTITION variable=m_accum cyclic factor=2 dim=1
#pragma HLS ARRAY_PARTITION variable=v_accum cyclic factor=2 dim=1
#pragma HLS ARRAY_MAP variable=m_accum[0] instance=mv_accum horizontal
#pragma HLS ARRAY_MAP variable=v_accum[0] instance=mv_accum horizontal
#pragma HLS ARRAY_MAP variable=m_accum[1] instance=mv_accum_1 horizontal
#pragma HLS ARRAY_MAP variable=v_accum[1] instance=mv_accum_1 horizontal

1.4.数组转换(reshape)

对于单个数组,如果我们想让其从数据上仍为一个数组,但从结构上改变其数据排布,那么可以使用ARRAY_RESHAPE约束进行数组的reshape。

以一维数组为例,如下是3种reshape方法:

Block/Factor=2:将数组一分为二,然后进行拼接,长度减半,数据位宽翻倍
#pragma HLS ARRAY_RESHAPE dim=1 factor=2 type=block variable=arr
Cyclic/Factor=2:将数据奇偶分组(对2取模为组号)进行拼接,长度减半,位宽翻倍
#pragma HLS ARRAY_RESHAPE dim=1 factor=2 type=cyclicvariable=arr
Complete:将所有数据拼到一个数据中,长度最短,位宽最长
#pragma HLS ARRAY_RESHAPE dim=1 type=complete variable=arr

其内存中的数据分配如下图:


1.5.数组分割、合并和转换的对比

有例程如下图,数组A[N] B[M],第一个循环分别处理A数组的奇偶数据,第二个循环分别处理B数组的前半、后半数据,第三、四个循环分别依次读取A、B,并写入到pa、pb

可以发现,第一个循环更适合对A启用cyclic/factor=2,第二个循环更适合对B启用block/factor=2。
我们对A和B尝试以下这几种约束,分别将A和B横向ARRAY_MAP拼接、将A和B纵向ARRAY_MAP拼接、对A启用ARRAY_RESHAPE cyclic/factor=2并对B启用ARRAY_RESHAPE block/factor=2。

因此,我们分别指定如下约束,其中最右侧为我们刚才分析的约束:

最终得到结果如下,可以看到,使用RESHAPE的性能最高,但资源消耗也远超其他约束。


1.6.其他数组优化

1.6.1.定义ROM

方法1:使用const + 初始化值

缺点:初始值较多时较繁琐,代码管理不便

方法2:使用头文件,将初始值放在文件中,代码/工程管理较方便

该头文件内结构应如下所示:

1,
2,
3,
4,
5

需要注意的是使用下面的方式是不行的,因为这种方法是使用了#include展开文件到声明位置的原理,#include "xxx.h"必须是所在行唯一的语句。

方法3:如果一个数据的value是通过数学计算得到的,并且在程序中不被更新,Vitis HLS会自动将其定义为ROM,如下图的sin_table:

默认情况下ROM的输出latency是2,我们可以在RESOURCE directive中将其配置为自定义值。


1.6.2.数组初始化

如果想要将数组映射为RTL的memory,那么需要加static进行修饰,这样既可以保证数组映射为memory,而且还能节省初始化的时间。

如果想要将数组映射为ROM,就需要用到上面的三种定义ROM的方式。


1.6.3.FPGA的复位(一定要知道!)

这一点在第一篇笔记中提到过,这里讲到了静态变量,所以再说一遍。

在 HLS 中,所有静态和全局变量都会被初始化为零(如果给定了初始化值,则初始化为其他值)。这包括 RAM,其中每个元素都被清除为零。

然而,这种初始化只发生在 FPGA 首次编程时。任何后续处理器复位都不会触发初始化过程

如果需要清除设备的内部状态,那么应该包含某种复位协议(根据复位状态处理所需要的程序)。


2.函数优化

2.1.数据类型优化

对于参数等数据使用的数据类型,如果可以提前确认某一个值的上限,使用ap_int<>等类型可以有效减少资源的使用量,如下图:


2.2.inline

HLS中有INLINE约束,给函数添加INLINE约束后,在编译时会自动将inline修饰的函数展开到调用位置(硬件层面上),可以减少调用函数带来的开销。

#pragma HLS INLINE

如下图,启用INLINE后最终只产生了一个模块:

同时,可以在directive中关闭inline:

#pragma INLINE off

2.3.Allocation

在上篇笔记中有过介绍,使用ALLOCATION约束将Accumulator函数实例化2次

#pragma ALLOCATION instances=Accumulator limit=2 function

对默认、limit=1、limit=2的情形进行了测试,可以看到limit=2带来了更高的性能,但会消耗更多资源:


2.4.DATAFLOW

应用于函数的DATAFLOW,可以将多个调用间的依赖关系形成流水线并行执行

相关文章:

FPGA学习笔记#7 Vitis HLS 数组优化和函数优化

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;主要根据教程&#xff1a;跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 学习笔记&#xff1a;《FPGA学习笔记》索引 FPGA学习笔记#1 HLS简介及…...

欧几里得算法python

一、问题描述 求最大公约数 class Fraction:def __init__(self, a, b):self.a aself.b bx self.gcd(a, b)self.a / xself.b / xdef gcd(self, a, b):while b >0:r a % ba bb rreturn adef zgs(self, a, b):x self.gcd(a, b)return a / x * bdef __add__(self, other…...

【layui】echart的简单使用

图表类型切换&#xff08;柱形图和折线图相互切换&#xff09; <title>会员数据</title><div class"layui-card layadmin-header"><div class"layui-breadcrumb" lay-filter"breadcrumb"><a lay-href""&g…...

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候&#xff0c;在苹果开发者中心不能直接上传打包文件&#xff0c;需要下载mac的xcode这些工具进行上传&#xff0c;但这些工具无法安装在windows或linux电脑上。 这里&#xff0c;我们可以不用xcode这些工具来上传&#xff0c;可以用国内的香…...

vue2项目启用tailwindcss - 开启class=“w-[190px] mr-[20px]“ - 修复tailwindcss无效的问题

效果图 步骤 停止编译"npm run dev"安装依赖 npm install -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9 创建文件/src/assets/tailwindcss.css&#xff0c;写入内容&#xff1a; tailwind base; tailwind components; tailwind utiliti…...

mysql中数据不存在却查询到记录?

前言 首先看下面的查询语种 select * from AudioKnowledgeChatInfo where AudioId297795550566600706; 查询结果如下 看到上面的查询结果&#xff0c;是不是一脸懵&#xff1f;这audioId明显不对啊&#xff0c;怎么查询到了&#xff1f; 原因剖析 首先我们来看看数据库表…...

vue3+elementplus+虚拟树el-tree-v2+多条件筛选过滤filter-method

筛选条件 <el-inputv-model"searchForm.searchTreeValue"input"searchTreeData"style"flex: 1; margin-right: 0.0694rem"placeholder"请输入要搜索的设备"clearable/><imgclass"refresh-img"src"com_refres…...

【C#设计模式(4)——构建者模式(Builder Pattern)】

前言 C#设计模式(4)——构建者模式(Builder Pattern) 运行结果 代码 public class Computer {private string part1 "CPU";private string part2 "主板";private string part3 "内存";private string part4 "显卡";private st…...

LabVIEW实验室液压制动系统

压制动系统是许多实验设备的重要安全组件&#xff0c;尤其在高负荷、高速实验环境下&#xff0c;制动系统的性能对设备和操作人员的安全至关重要。传统的实验室液压制动系统监测方法存在数据采集实时性差、精度低、故障预警不及时等问题。为了提高实验安全性和设备运行的稳定性…...

解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated

问题&#xff1a;Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. 解决方式&#xff…...

【寻找重复数字】——脑筋急转弯...

寻找重复数字 287. 寻找重复数 题目难度 中等 相关标签与企业信息 [相关标签] [相关企业] 题目描述 给定一个包含 n 1 n 1 n1 个整数的数组 nums&#xff0c;其数字都在 [ 1 , n ] [1, n] [1,n] 范围内&#xff08;包括 1 1 1 和 n n n&#xff09;&#xff0c;可…...

AI基础知识

目录 1.激活函数:one: 激活函数的作用:two: sigmoid函数:three: tanh函数:four: ReLu:five: Leaky ReLU 2.Softmax函数3.优化器:one: 优化器的作用:two: BGD&#xff08;批梯度下降&#xff09;:three: SGD&#xff08;随机梯度下降&#xff09;:four: MBGD&#xff08;Mini Ba…...

ubuntu 22.04 硬件配置 查看 显卡

ubuntu 22.04 硬件配置 查看 显卡 1. 参考文档 ubuntu 安装 nvidia 驱动 https://blog.51cto.com/u_13628828/7056095 input: HDA NVidia HDMI/DP,pcm3 as /devices/pci0000:00/0000:00:01.0/0000:01:00.1/sound/card1/input11 input: HDA NVidia HDMI/DP,pcm7 as /devices/…...

【计算机网络】网络框架

一、网络协议和分层 1.理解协议 什么是协议&#xff1f;实际上就是约定。如果用计算机语言进行表达&#xff0c;那就是计算机协议。 2.理解分层 分层是软件设计方面的优势&#xff08;低耦合&#xff09;&#xff1b;每一层都要解决特定的问题 TCP/IP四层模型和OSI七层模型…...

linux nvidia/cuda安装

1.查看显卡型号 lspci |grep -i vga2.nvidia安装 2.1在线安装 终端输入&#xff08;当显卡插上之后&#xff0c;系统会有推荐的安装版本&#xff09; ubuntu-drivers devices可得到如下内容 vendor : NVIDIA Corporation model : TU104GL [Tesla T4] driver : nvid…...

硬件设备网络安全问题与潜在漏洞分析及渗透测试应用

以下笔记学习来自B站泷羽Sec&#xff1a; B站泷羽Sec 一、硬件设备的网络安全问题点 1.1 物理安全问题 设备被盗或损坏渗透测试视角 攻击者可能会物理接近硬件设备&#xff0c;尝试窃取设备或破坏其物理结构。例如&#xff0c;通过撬锁、 伪装成维修人员等方式进入设备存放…...

#渗透测试#SRC漏洞挖掘#CSRF漏洞的防御

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

C++ | Leetcode C++题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {int m matrix.size(), n matrix[0].size();// 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大的…...

RabbitMQ 不公平分发介绍

RabbitMQ 是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。在 RabbitMQ 中&#xff0c;消息分发策略对于系统的性能和负载均衡至关重要。默认情况下&#xff0c;RabbitMQ 使用公平分发&#xff08;Fair Dispatch&#xff09;策…...

测试实项中的偶必现难测bug--一键登录失败

问题描述:安卓和ios有出现部分一键登录失败的场景,由于场景比较极端,衍生了很多不好评估的情况。 产生原因分析: 目前有解决过多次这种行为的问题,每次的产生原因都有所不同,这边根据我个人测试和收集复现的情况列举一些我碰到的: 1、由于我们调用的是友盟的一键登录的…...

危!这些高危端口再不知道问题就大了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 端口作为网络通信的基本单元&#xff0c;用于标识网络服务和应用程序。 但某些端口由于其开放性和易受攻击的…...

Redis集群模式之Redis Sentinel vs. Redis Cluster

在分布式系统环境中&#xff0c;Redis以其高性能、低延迟和丰富的数据结构而广受青睐。随着数据量的增长和访问需求的增加&#xff0c;单一Redis实例往往难以满足高可用性和扩展性的要求。为此&#xff0c;Redis提供了两种主要的集群模式&#xff1a;Redis Sentinel和Redis Clu…...

Leetcode 罗马数字转整数

代码的算法思想可以分为以下几步&#xff1a; 建立映射表&#xff1a; 首先&#xff0c;代码使用 HashMap 来存储罗马数字字符与其对应的整数值关系。例如&#xff0c;I 对应 1&#xff0c;V 对应 5&#xff0c;以此类推。这是为了方便后续快速查找每个罗马字符对应的整数值。 …...

东方通TongWeb替换Tomcat的踩坑记录

一、背景 由于信创需要&#xff0c;原来项目的用到的一些中间件、软件都要逐步替换为国产品牌&#xff0c;决定先从web容器入手&#xff0c;将Tomcat替换掉。在网上搜了一些资料&#xff0c;结合项目当前情况&#xff0c;考虑在金蝶AAS和东方通TongWeb里面选择&#xff0c;后又…...

ceph介绍和搭建

1 为什么要使用ceph存储 什么是对象存储&#xff1f; 对象存储并没有向文件系统那样划分为元数据区域和数据区域&#xff0c;而是按照不同的对象进行存储&#xff0c;而且每个对象内部维护着元数据和数据区域。因此每个对象都有自己独立的管理格式。 对象存储优点&#xff1a…...

树莓派安装FreeSWITCH

1、下载相关资源&#xff1a; # 假设所有资源都下载到/opt/目录下 cd /opt # 下载FreeSWITCH源码 git clone https://github.com/signalwire/freeswitch # 下载libks源码 git clone https://github.com/signalwire/libks # 下载sofia-sip源码 git clone https://github.com/fr…...

OpenSSL 生成根证书、中间证书和网站证书

OpenSSL 生成根证书、中间证书和网站证书 一、生成根证书&#xff08;ChinaRootCA&#xff09;二、生成中间 CA&#xff08;GuangDongCA&#xff09;三、生成网站证书&#xff08;gdzwfw&#xff09; 一、生成根证书&#xff08;ChinaRootCA&#xff09; 创建私钥&#xff1a; …...

MySQL核心业务大表归档过程

记录一下2年前的MySQL大表的归档&#xff0c;当时刚到公司&#xff0c;发现MySQL的业务核心库&#xff0c;超过亿条的有7张表&#xff0c;最大的表有9亿多条&#xff0c;有37张表超过5百万条&#xff0c;部分表行数如下&#xff1a; 在测试的MySQL环境 &#xff1a; pt-archiv…...

dapp获取钱包地址,及签名

npm install ethersimport {ethers} from ethers const accounts await ethereum.request({method: eth_requestAccounts}); // 获取钱包地址 this.form.address accounts[0] console.log("accounts:" this.address)const provider new ethers.BrowserProvider(…...

探索Dijkstra算法的普遍最优性:从经典算法到最新学术突破

引言 在计算机科学中&#xff0c;Dijkstra算法是解决单源最短路径问题的经典算法&#xff0c;尤其在地图导航、网络通信和机器人路径规划等领域有着广泛应用。近期&#xff0c;学术界在此算法上取得了重大突破&#xff1a;研究人员证明了Dijkstra算法的“普遍最优性”&#xff…...

建网站和建网页的区别/成人短期技能培训

RabbitMQ集群概述通过 Erlang 的分布式特性&#xff08;通过 magic cookie 认证节点&#xff09;进行 RabbitMQ 集群&#xff0c;各 RabbitMQ 服务为对等节点&#xff0c;即每个节点都提供服务给客户端连接&#xff0c;进行消息发送与接收。这些节点通过 RabbitMQ HA 队列&…...

怎么做简单的微信浏览的网站/成都最新数据消息

http://www.52c51.com/article/63.html市场上盛行的电子高压灭蚊手拍&#xff08;简称“电蚊拍”&#xff09;&#xff0c;以其实用、灭蚊效果好、无化学污染、安全卫生等优点&#xff0c;普遍受到人们的欢迎。其实这种电灭蚊拍线路简单&#xff0c;具有一定电子制作能力的青少…...

网站二维码收费怎么做/自动引流推广app

在使用之前&#xff0c;首先要创建一个Ext.data.Store的实例&#xff0c;如下面的代码所示。 var data [ [boy, 0], [girl, 1] ]; var store new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader(…...

网站后台管理模板html/沈阳专业seo

”能别带耳机吗&#xff1f;“”你能别来打扰我工作吗&#xff1f;“&#xff1a;“不能&#xff01;”前阵子有篇热文&#xff1a;当一个程序员一天被打扰 10 次&#xff0c;后果很惊人&#xff01;看后网友都表示深有同感&#xff0c;来看看这些网友都是怎么讲的:热心市民开发…...

怎么做网站不会被屏蔽/电商平台发展现状与趋势

1、添加项目 2、选择maven-archetype-webapp 3、添加公司/组织名称,项目名称&#xff0c;版本号 4、补全未生成的文件夹 5、pom.xml中添加jetty插件信息 [html] view plaincopy <plugins> <plugin> <groupId>org.mortbay.jetty</groupId&…...

中国建设网官方网站企业网银/新闻源软文发布平台

我有一个angular2项目,其中index.html包含标题栏.其他组件将负责登录和显示其他内容.我必须在标题栏中显示一个标识,仅当用户登录时才会出现在index.html中.如果用户登录,我在app.component.ts中设置一个标志.如何在index.html中引用该标志&#xff1f;noHold Application// th…...