0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

activiti通过创建流程实例引擎实现不同流程的流转

Android编程精选 来源:CSDN 作者:靖节先生 2022-07-13 09:20 次阅读

1. 什么是工作流

1.1 工作流介绍

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。

1.2 工作流系统

什么是工作流系统

具有工作流程功能的软件系统。用于更好的管理业务流程。

适用行业,各行各业

比如,消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。

具体场景,凡是涉及到业务流程的所有场景

关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等

行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。

人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。

财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。

客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。

1.3 工作流实现方式

目前常见的工作流程有两种方式:

通过状态字段实现流程控制。原始,适合简单流程控制。

工作流引擎实现流程控制。适用场景更广泛,扩展性更好。

1.4 工作流实现原理

Activiti牛批之处在于,它在不改变代码的前提下实现各种业务流程的管理,适用性,扩展性很优秀。

activiti通过创建流程实例引擎,可以实现不同流程的流转,通过不断读取创建的流程节点实现流程流转。

2. Activiti7概述

2.1 Activiti介绍

Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

当然这里还有一些小故事,Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动, 其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任, Tom Baeyens 就是原来 jbpm 的架构师,而 jbpm 是一个非常有名的工作流引擎,当然 activiti 也是一个工作流引擎。

下边介绍三个名词概念,就不长篇大论了,简单总结下。

BPM:BPM(Business Process Management),即业务流程管理。

BPM系统:那就是业务流程管理的系统。

BPMN,这个比较噢重要,多说两句,具体往下看。

BPMN(Business Process Model And Notation) - 业务流程模型和符号 是由 BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。

总结来说就是用来建模业务流程的标准规则,一个个符号!

1d809b58-01d8-11ed-ba43-dac502259ad0.png

2.2 Activiti使用

一般情况下都是通过创建BPMN进行业务流程建模,两种方式,idea插件或者eclipse插件,通过符号创建流程。

idea安装bpmn插件

在 IDEA 的 File 菜单中找到子菜单”Settings”,后面我们再选择左侧的“plugins”菜单,如下图所示

1d93f978-01d8-11ed-ba43-dac502259ad0.png

1db89b34-01d8-11ed-ba43-dac502259ad0.png

3. Activiti环境配置

3.1 创建数据库

CREATEDATABASEactivitiDEFAULTCHARACTERSETutf8;

3.2 初始化数据库表:

创建Maven工程

pYYBAGLOHwWADI4ZAABXW1-YN60483.jpg

加入依赖



4.0.0

com.activiti.demo
activiti_demo
1.0-SNAPSHOT

 

1.6.6
1.2.12



 

org.activiti
activiti-engine
7.0.0.Beta1



org.activiti
activiti-spring
7.0.0.Beta1



org.activiti
activiti-bpmn-model
7.0.0.Beta1



org.activiti
activiti-bpmn-converter
7.0.0.Beta1



org.activiti
activiti-json-converter
7.0.0.Beta1



org.activiti
activiti-bpmn-layout
7.0.0.Beta1



org.activiti.cloud
activiti-cloud-services-api
7.0.0.Beta1



mysql
mysql-connector-java
5.1.40



junit
junit
4.12


 

log4j
log4j
${log4j.version}


org.slf4j
slf4j-api
${slf4j.version}


org.slf4j
slf4j-log4j12
${slf4j.version}

 


org.mybatis
mybatis
3.4.5



commons-dbcp
commons-dbcp
1.4






alfresco
ActivitiReleases
https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/

true


配置日志

#SetrootcategoryprioritytoINFOanditsonlyappendertoCONSOLE.
#log4j.rootCategory=INFO,CONSOLEdebuginfowarnerrorfatal
log4j.rootCategory=debug,CONSOLE,LOGFILE

#SettheenterpriseloggercategorytoFATALanditsonlyappendertoCONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE

#CONSOLEissettobeaConsoleAppenderusingaPatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m


#LOGFILEissettobeaFileappenderusingaPatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m

配置activity.cfg.xml


编写代码

/**
*Activiti初始化25张表
*执行的是activiti-engine-7.0.0.Beta1.jar包下对应不同内置好的sql语句
*orgactivitidbdropactiviti.db2.drop.engine.sql
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassActivitiInit{

/**
*方式一
*/
@Test
publicvoidGenActivitiTables(){

// 1.创建ProcessEngineConfiguration对象。第一个参数:配置文件名称;第二个参数:processEngineConfiguration的bean的id
ProcessEngineConfigurationprocessEngineConfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration");
//2.创建ProcessEngine对象
ProcessEngineprocessEngine=processEngineConfiguration.buildProcessEngine();
//3.输出processEngine对象
System.out.println(processEngine);

}

/**
*方式二
*/
@Test
publicvoidGenActivitiTables2(){
//条件:1.activiti配置文件名称:activiti.cfg.xml  2.bean的id="processEngineConfiguration"
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
}

3.3 创建数据库表

执行上边的代码。

3.4 数据库表命名规则

1e0a67f2-01d8-11ed-ba43-dac502259ad0.png

Activiti 的表都以 ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的 API 对应。

ACT_RE_*: 'RE'表示 repository。这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

ACT_RU_*: 'RU'表示 runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。

ACT_HI_*: 'HI'表示 history。这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_GE_*: 'GE'表示 general。通用数据, 用于不同场景下

4. Activiti架构简介

activiti.cfg.xml

activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置了 ProcessEngineConfiguration和数据源。

ProcessEngineConfiguration

流程引擎的配置类,通过 ProcessEngineConfiguration 可以创建工作流引擎 ProceccEngine,常用的两种方法。

ProcessEngine

工作流引擎,相当于一个门面接口,通过 ProcessEngineConfiguration 创建 processEngine,通过ProcessEngine 创建各个 service 接口。

Service

通过 ProcessEngine 创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。

1e1c12e0-01d8-11ed-ba43-dac502259ad0.png

5. Activiti入门案例

5.1 流程定义

什么是流程定义

流程定义是线下按照 bpmn2.0 标准去描述 业务流程,通常使用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。本教程使用activiti-eclipse-designer 插件完成流程建模。使用 designer 设计器绘制流程,会生成两个文件:.bpmn和.png

创建bpmn文件

Palette(画板)

在 eclipse 或 idea 中安装 activiti-designer 插件即可使用,画板中包括以下结点:

Connection—连接

Event---事件

Task---任务

Gateway---网关

Container—容器

Boundary event—边界事件

Intermediate event- -中间事件

流程图设计完毕保存生成.bpmn 文件

idea创建bpmn

poYBAGLOHt6ACjdEAACjqsn3kNY798.jpg

pYYBAGLOHrSAEECGAAB6qcUKUAU644.jpg

生成png图片

第一步:将 holiday.bpmn 文件改为扩展名 xml 的文件名称:holiday.xml

第二步:在 holiday.xml 文件上面,点右键并选择 Diagrams 菜单,再选择 Show BPMN2.0 Designe

pYYBAGLOHpiAfCrNAACBBTGeg7k237.jpg

第三步:打开后的效果图如下:

pYYBAGLOHnyAQUzhAABnzxm3NS8897.jpg

打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:

poYBAGLOHmCANQhlAABvBfMwgTI324.jpg

第五步:中文乱码的解决

打开 IDEA 安装路径,找到如下的安装目录

1ed2721a-01d8-11ed-ba43-dac502259ad0.png

根据自己所安装的版本来决定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions 文件的最后一行追加一条命令:-Dfile.encoding=UTF-8

如下所示

pYYBAGLOHjGAbI5CAACGYDCvMSs945.jpg

一定注意,不要有空格,否则重启 IDEA 时会打不开,然后 重启 IDEA,把原来的 png 图片删掉,再重新生成,即可解决乱码问题

5.2 部署流程

什么是流程部署

将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。

单个文件部署方式

分别将 bpmn 文件和 png 图片文件部署

压缩包部署方式

/**
*流程定义的部署
* activiti表有哪些?
*act_re_deployment部署信息
*act_re_procdef流程定义的一些信息
*act_ge_bytearray流程定义的bpmn文件及png文件
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassActivitiDeployment{

/**
*方式一
*分别将bpmn文件和png图片文件部署
*/
@Test
publicvoidactivitiDeploymentTest(){
//1.创建ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//2.得到RepositoryService实例
RepositoryServicerepositoryService=processEngine.getRepositoryService();

//3.进行部署
Deploymentdeployment=repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("请假申请单流程")
.deploy();

//4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}

/**
*方式二
*将holiday.bpmn和holiday.png压缩成zip包
*/
@Test
publicvoidactivitiDeploymentTest2(){
//1.创建ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//2.得到RepositoryService实例
RepositoryServicerepositoryService=processEngine.getRepositoryService();

//3.转化出ZipInputStream流对象
InputStreamis=ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holidayBPMN.zip");

//将inputstream流转化为ZipInputStream流
ZipInputStreamzipInputStream=newZipInputStream(is);

//3.进行部署
Deploymentdeployment=repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假申请单流程")
.deploy();

//4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}

}

操作数据表

-- activiti表有哪些?
--部署信息
select*fromact_re_deployment;

--流程定义的一些信息
select*fromact_re_procdef;

--流程定义的bpmn文件及png文件
select*fromact_ge_bytearray;

5.3 启动流程

/**
*启动流程实例:
*前提是先已经完成流程定义的部署工作
*背后影响的表:
*act_hi_actinst已完成的活动信息
*act_hi_identitylink参与者信息
*act_hi_procinst流程实例
*act_hi_taskinst任务实例
*act_ru_execution执行表
*act_ru_identitylink参与者信息
*act_ru_task任务
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassActivitiStartInstance{
publicstaticvoidmain(String[]args){
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//2.得到RunService对象
RuntimeServiceruntimeService=processEngine.getRuntimeService();

//3.创建流程实例流程定义的key需要知道holiday
ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("holiday");

//4.输出实例的相关信息
System.out.println("流程部署ID"+processInstance.getDeploymentId());
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());
System.out.println("流程实例ID"+processInstance.getId());
System.out.println("活动ID"+processInstance.getActivityId());

}
}

5.4 流程定义查询

/**
*流程定义查询
*
*@authorzrj
*@date2020/12/29
*@sinceV1.0
**/
publicclassQueryProceccDefinition{

@Test
publicvoidqueryProceccDefinition(){
//流程定义key
StringprocessDefinitionKey="holiday";
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//获取repositoryService
RepositoryServicerepositoryService=processEngine.getRepositoryService();
//查询流程定义
ProcessDefinitionQueryprocessDefinitionQuery=repositoryService.createProcessDefinitionQuery();
//遍历查询结果
Listlist=processDefinitionQuery
.processDefinitionKey(processDefinitionKey)
.orderByProcessDefinitionVersion().desc().list();

for(ProcessDefinitionprocessDefinition:list){
System.out.println("------------------------");
System.out.println("流程部署 id :"+processDefinition.getDeploymentId());
System.out.println("流程定义id:"+processDefinition.getId());
System.out.println("流程定义名称:"+processDefinition.getName());
System.out.println("流程定义key:"+processDefinition.getKey());
System.out.println("流程定义版本:"+processDefinition.getVersion());
}
}
}

5.5 流程定义删除

/**
*删除指定流程id的流程
*/
publicvoiddeleteDeployment(){
//流程部署id
StringdeploymentId="8801";
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();

//通过流程引擎获取repositoryService
RepositoryServicerepositoryService=processEngine.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true级联删除流程定义,即使该流程有流程实例启动也可以删除,设
//置为false非级别删除方式,如果流程
repositoryService.deleteDeployment(deploymentId,true);
}

5.6 流程定义资源查询

/**
*获取资源
*/
@Test
publicvoidgetProcessResources()throwsIOException{
//流程定义id
StringprocessDefinitionId="";
//1.得到ProcessEngine对象
ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();
//获取repositoryService
RepositoryServicerepositoryService=processEngine.getRepositoryService();
//流程定义对象
ProcessDefinitionprocessDefinition=repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
//获取bpmn
Stringresource_bpmn=processDefinition.getResourceName();
//获取png
Stringresource_png=processDefinition.getDiagramResourceName();
//资源信息
System.out.println("bpmn:"+resource_bpmn);
System.out.println("png:"+resource_png);
Filefile_png=newFile("d:/purchasingflow01.png");
Filefile_bpmn=newFile("d:/purchasingflow01.bpmn");
//输出bpmn
InputStreamresourceAsStream=null;
resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_bpmn);
FileOutputStreamfileOutputStream=newFileOutputStream(file_bpmn);
byte[]b=newbyte[1024];
intlen=-1;
while((len=resourceAsStream.read(b,0,1024))!=-1){
fileOutputStream.write(b,0,len);
}
//输出图片
resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_png);
fileOutputStream=newFileOutputStream(file_png);
//byte[]b=newbyte[1024];
//intlen=-1;
while((len=resourceAsStream.read(b,0,1024))!=-1){
fileOutputStream.write(b,0,len);
}
}


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6631

    浏览量

    84360
  • 工作流
    +关注

    关注

    0

    文章

    42

    浏览量

    12350
  • Activiti
    +关注

    关注

    0

    文章

    4

    浏览量

    2732

原文标题:工作流引擎 Activiti 入门详解

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    fpga原型验证流程

    FPGA原型验证流程是确保FPGA(现场可编程门阵列)设计正确性和功能性的关键步骤。它涵盖了从设计实现到功能验证的整个过程,是FPGA开发流程中不可或缺的一环。
    的头像 发表于 03-15 15:05 308次阅读

    SOLIDWORKS 2024通过自动化和缩短工作流程实现智能工作

    随着科技的快速发展,工程设计和制造业正在经历变革。在这个过程中,SOLIDWORKS 2024的发布为我们提供了一个全新的视角,以实现更智能的工作流程。本文将探讨SOLIDWORKS 2024如何通过自动化和缩短工作
    的头像 发表于 01-10 11:37 243次阅读
    SOLIDWORKS 2024<b class='flag-5'>通过</b>自动化和缩短工作<b class='flag-5'>流程</b>来<b class='flag-5'>实现</b>智能工作

    半孔板比常规pcb板多出什么流程

    半孔板是一种特殊的PCB板,相比于常规的PCB板,它在制造过程中需要多出一些步骤和流程。在本文中,将介绍半孔板相较于常规PCB板所多出的流程。 首先,半孔板的制造流程与常规PCB板的流程
    的头像 发表于 12-25 16:13 363次阅读

    EDA全流程的重要意义,以及国内EDA全流程进展

    电子发烧友网报道(文/吴子鹏)EDA是Electronic design automation的缩写,中文名称是电子设计自动化,是指通过设计软件来完成集成电路的功能设计、综合、验证、物理设计等流程
    的头像 发表于 12-14 00:08 1494次阅读

    SMP多核secondary cpu启动流程

    图,详细分析可以参考上篇博文。其中以下流程执行secondary cpu启动相关的一些初始化工作: 在初始化完成且hotplug线程创建完成后,就可通过以下流程唤醒cpu hotplu
    的头像 发表于 12-05 17:41 262次阅读
    SMP多核secondary cpu启动<b class='flag-5'>流程</b>

    3D-IC 设计之 Memory-on-Logic 堆叠实现流程

    3D-IC 设计之 Memory-on-Logic 堆叠实现流程
    的头像 发表于 12-01 16:53 322次阅读
    3D-IC 设计之 Memory-on-Logic 堆叠<b class='flag-5'>实现</b><b class='flag-5'>流程</b>

    Bamboo-pipeline:Python高效流程编排引擎

    Bamboo-pipeline 是蓝鲸智云旗下SaaS标准运维的流程编排引擎。其具备以下特点: 多种流程模式 :支持串行、并行,支持子流程,可以根据全局参数自动选择分支执行,节点失败处
    的头像 发表于 10-31 16:39 567次阅读
    Bamboo-pipeline:Python高效<b class='flag-5'>流程</b>编排<b class='flag-5'>引擎</b>

    通过RA MCU和微型ROS简化机器人设计流程

    通过RA MCU和微型ROS简化机器人设计流程
    的头像 发表于 10-24 17:55 263次阅读
    <b class='flag-5'>通过</b>RA MCU和微型ROS简化机器人设计<b class='flag-5'>流程</b>

    PCB行业应如何实现流程追溯?

    为了解决这些问题,PCB制造企业需要对 PCB产品进行全流程追溯,通过数字化系统确保所有流程数据都在可追溯的状态下,从而保证产品品质稳定可靠。那么,PCB行业应如何实现
    发表于 09-12 11:40 360次阅读
    PCB行业应如何<b class='flag-5'>实现</b>全<b class='flag-5'>流程</b>追溯?

    vivado创建工程流程

    vivado的工程创建流程对于大部分初学者而言比较复杂,下面将通过这篇博客来讲解详细的vivado工程创建流程。帮助自己进行学习回顾,同时希
    的头像 发表于 07-12 09:26 1294次阅读
    vivado<b class='flag-5'>创建</b>工程<b class='flag-5'>流程</b>

    用 TCL 定制 Vivado 设计实现流程

    在于可以通过在 Vivado 中创建工程的方式管理整个设计流程,包括工程文件的位 置、阶段性关键报告的生成、重要数据的输出和存储等。 如下左图所示,用户建立了一个 Vivado 工程后,工具会自动
    发表于 06-28 19:34

    车间生产工艺流程虚拟仿真:化工作流程,提高生产效率

    随着虚拟现实技术的不断发展,越来越多的工厂和企业开始应用VR技术,利用虚拟现实技术打造出车间生产工艺流程虚拟仿真,以实现数字化转型。车间生产工艺流程虚拟仿真是一种通过虚拟现实技术
    的头像 发表于 05-18 15:08 1185次阅读

    使用springboot完成流程的业务功能

    总览 一、flowable-ui部署运行 二、绘制流程图 三、后台项目搭建 四、数据库 五、流程引擎API与服务 六、参考资料 总览 使用flowable自带的flowable-ui制作流程
    的头像 发表于 05-15 17:40 401次阅读
    使用springboot完成<b class='flag-5'>流程</b>的业务功能

    用TCL定制Vivado设计实现流程

    今天推出Xilinx已发布的《Vivado使用误区与进阶》系列:用TCL定制Vivado设计实现流程
    的头像 发表于 05-05 09:44 721次阅读
    用TCL定制Vivado设计<b class='flag-5'>实现</b><b class='flag-5'>流程</b>

    如何利用Tcl在Vivado中实现定制化的FPGA设计流程

    FPGA 的设计流程简单来讲,就是从源代码到比特流文件的实现过程。大体上跟 IC 设计流程类似,可以分为前端设计和后端设计。
    的头像 发表于 04-23 09:08 1698次阅读
    如何利用Tcl在Vivado中<b class='flag-5'>实现</b>定制化的FPGA设计<b class='flag-5'>流程</b>?