CORTEX-A8裸机系列:第十二章 中断控制器与外部中断

第十二章 中断控制器与外部中断

本章代码,查看我的github网站:https://github.com/weiqi7777/…

1、异常处理的2个阶段

1) 异常向量表跳转

依赖于CPU设计时自动提供的异常向量表的机制,也就是当异常发生时,硬件能自动的跳转到异常向量表执行。

该阶段主要任务是产生异常前后的现场保存/恢复现场,跳转到真正的异常处理程序。

2) 进入了真正的异常处理程序

通过判断寄存器,得知是哪一类的中断产生,然后再检查子类中断寄存器,查看具体是哪一个中断产生,然后跳转到对应的程序执行。

2、210的中断控制器

210包括4个VIC(vectored interrupt controller)。

当要清除中断挂起,需要往VICADDRESS寄存器(VIC0ADDRESS,VIC1ADDRESS,VIC2ADDRESS,VIC3ADDRESS)写入0。

210支持的中断源很多,所以直接设计了4个中断寄存器,每个32位,每位对应一个中断源,(理论上210最多支持128个中断源,但是实际上只有93个,有些位是空的);210没有子中断寄存器,每个中断源都是并列的。当中断发生时,在中断处理程序中依次查询4个中断源寄存器,看哪一个的哪一位置1,则这个位对应的寄存器就发生了中断,即找到了中断编号。

于是计算中断编号就比较麻烦了,很耗费时间,就影响了实时性。(实时性就是中断发生到响应的时间,这个时间越短越好)。

所以210开拓了一种全新的寻找isr的机制。210提供了很多寄存器来解决每个中断源对应isr的寻找问题。这些都是硬件来实现的。

210的中断号有两种,一个是VIC port no,表示的是在寄存器中的偏移,另外一个是No,这个是中断的物理号,每个中断对应一个。应用层使用的是中断的物理号,所以底层代码需要处理,将中断的物理号转换为对应寄存器的对应位。

以下是中断相关的寄存器

2.1、VICIRQSTATUS

中断源在屏蔽之后的状态。为1,说明中断有效。

2.2、VICFIQSTATUS

快速中断源在屏蔽之后的状态

2.3、VICRAWINTR

中断源未屏蔽之前的状态,这个寄存器,表明中断源的原始状态,但是CPU是否响应该中断,还需要后续的一些设置(需要看VINCINTENABLE和VICINESELECT寄存器)才行。

2.4、VINCINTSELECT

中断的选择,是选择普通中断还是快中断。

210支持两种中断,irq和fiq。Irq是普通中断,fiq是快速中断。快速中断提供了一种更快响应处理的中断通道,用于对实时性要求很高的中断源。Fiq在CPU设计时预先提供了一些机制保证fiq可以被快速处理,从而保证实时性。Fiq的限制就是只能有一个中断源被设置为fiq,其他都是irq。

CPU是如何保证fiq比irq快?一、fiq模式有专用的r8-r12寄存器,因此在fiq的isr中可以直接使用r8-r12而不用保存,这就能节省时间。二、异常向量表中fiq是最后一个异常向量入口,因此fiq的isr不需要跳转,这样就比其他异常少跳转了一次,省了函数跳转的时间。

2.5、VICINTENABLE

中断使能寄存器,负责相应的中断的使能,也就是当中断产生时,CPU是否要响应该中断。只要在这个中断编号对应的VICINTENABLE响应位写1即可。

这个寄存器写1才有效果,写0没有效果。

该寄存器可读可写,读的话,是得到中断是否使能的状态,1是使能,0是不使能。

2.6、VICINTENCLEAR

中断除能寄存器,负责相应的中断的除能,往相应寄存器相应的位写入1,就对该中断禁止了。

2.7、VICSOFTINT

软中断寄存器,产生软中断,也就是软件往这个寄存器的某些位写1,那么就会触发软件中断,CPU会执行该位对应的中断处理函数。

2.8、VICSOFTINTCLEAR

软中断除能寄存器。将对应的软中断给除能。使用软中断,CPU执行完中断后,因为软中断没有被清除,所以又会执行中断。所以要在中断处理程序中,将软中断给清除掉,避免再次进入中断。

2.9、VICPROTECTION

中断保护模式寄存器。开启保护模式后,中断中只有特权模式才能访问中断控制器寄存器,用户模式下是不能访问中断控制器寄存器的。如果没有开启的话,用户模式和特权模式都是可以访问中断控制器寄存器的。

2.10、VICADDRESS

中断地址寄存器,当对应中断产生的时候,硬件会将中断处理函数地址赋值给这个寄存器。

在中断处理函数结束后,要往中断地址寄存器写入任意值,以清除中断挂起。

2.11、VICSWPRIORITYMASK

屏蔽优先级中断寄存器。设置这个寄存器,可以屏蔽某些优先级的中断,使CPU不响应这些优先级的中断。

2.12、VICVECTADDR[0-31]

中断异常程序地址寄存器,这个是一个寄存器组,共有32个,每一个对应一个中断的中断处理函数的地址。当对应中断产生的时候,硬件会从该中断号对应的中断地址寄存器,取出该执行的中断处理函数的地址,然后赋值给PC,就执行中断处理函数了。

VICVECTADD0-31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,设置中断的时候,把这个中断的isr地址直接放入到这个中断对应的VECTADDR寄存器即可。

2.13、VICVECTPRIORITY[0-31]

中断优先级寄存器,设置中断的优先级,有效值是0-15。

设置多个中断同时发生时先处理谁后处理谁的问题。一般来说高优先级的中断可以打断低优先级的中断,从而嵌套处理中断。

3、中断设置流程
3.1、流程

1) 绑定异常向量表到异常处理程序,禁止所有中断源,选择所有中断类型为IRQ,清除VICADDR寄存器为0

2) 中断的使能和禁止:根据终端号判断这个中断属于VIC几,然后再中断源减去这个VIC的偏移量,得到这个中断号在本VIC中的偏移量,然后1<<x位,写入相应的VIC的INTENABLE/INTENCLEAR寄存器即可

3) 绑定实现的ISE到VICnVECTADDR:VICVECTADDR寄存器共有4*32个,每个中断源都有一个VECTADDR寄存器,我们应该将为这个中断源写的isr地址写入到这个中断源对应的VECTADDR寄存器中即可

4) 发生中断时,硬件会自动把相应中断源的isr地址从VICnVECTADDR寄存器中保存在VICnADDR寄存器中,所以第二阶段的中断处理程序中,判断是哪一个VIC发生中断,只需要判断哪一个VIC的VICnIRQSTATUS不为0,就说明该VIC发生了中断。然后将该VIC的VICADDR赋值给函数指针,然后去执行该函数。

3.2、中断2部分工作

中断的工作分为2部分:

第一部分是我们为中断响应而做的预备工作:

1) 初始化中断控制器

2) 绑定写好的isr到中断控制器

3) 相应中断的使能

第二部分是硬件产生中断后自动执行isr

1) 经过异常向量表跳转入IRQ/FIQ的入口

2) 做中断现场保护(在start.S)中,然后跳入isr_handler

3) 在isr_handler中先找到哪个VIC中断了,然后直接去这个VIC的VICADDR寄存器中取出isr地址执行

4) Isr执行完,中断现场恢复,直接返回继续做常规任务。

4、外部中断

外部中断属于VIC0。

外部中断0-15是各自单独占有一个中断源,中断16-31是公用一个中断源,EINT 16_31。

关键寄存器, CON,PEND, MASK

4.1、GPxnCON

配置GPIO管脚为外部中断,GPHn为外部中断源。

4.2、EXT_CON

配置外部中断的触发方式。触发方式就是外部中断产生的条件。

触发方式有两种:电平触发和边沿触发。

4.3、EXT_PEND

中断挂起寄存器,每一位对应一个外部中断,没有中断产生值为0。发生中断后,硬件会自动将这个寄存器该中断对应的位置为1。

4.4、EXT_MASK

中断屏蔽寄存器。用来屏蔽中断的,如果对应位设置为1,那么该位对应的中断是被屏蔽的。

4.5、EXT_FILTER

中断滤波寄存器

有两种滤波方式,一种是Delay filter,一种是Digital filter。

Delay filter是固定延时(和时钟没有关系),35ns,也就是当中断第一次检测到后,35ns后会再次检测一下,如果第二次检测中断确实产生,就认为中断产生,然后CPU执行中断。这个可以用在电平中断中,滤除电平毛刺。

Digital filter,数字滤波,和时钟是有关系的。滤波时间是时钟的周期*滤波周期数,每隔滤波周期数时间去检测一个中断,这里的时钟应该用的是PCLK,也就是GPIO的CLK。这个可以用在边沿触发的中断中,滤除抖动。

5、外部中断编程实践
5.1、外部中断对应的GPIO模式设置

5.2、中断触发模式设置

5.3、中断允许、清挂起

5.4、中断处理程序isr编写

系列其他篇

  • CORTEX-A8裸机系列:第十章 时钟
  • CORTEX-A8裸机系列:第十一章 串口

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。

使用Fast Models的Cortex-M33 AMBA-PV TLM-2.0子系统

导读

在上一篇文章《Fast Models和RTX入门》中,我们使用Fast Models IP库中已有的IP组件创建了一个基于Cortex-M33的定制平台。大多数时候,你会希望在设计中添加自己的IP,并创建一个平台来测试你的软件。在这篇文章中,我们将探讨如何做到这一点。如果你想在平台中添加一些自己的组件,那么你可以使用System Canvas将组装好的Cortex-M33平台导出为SystemC组件(即子系统),然后使用AMBA-PV TLM-2.0兼容的端口将生成的子系统与你自己的SystemC IP连接起来。

作者:Naveen Khajuria
阅读直达链接:https://community.arm.com/dev…

欢迎大家点赞留言,更多Arm技术文章动态请关注Arm技术专栏

sv使用default clocking指定全局默认时钟

在sv的assertion中,会用到时钟打拍操作。一般会在assertion代码块中,显示的写上使用的时钟,

property counter_2;
@(posedge clk)
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2:  assert property(counter_2); 

如果说,不写使用的时钟,即如下代码:

 property counter_2;
 counter == 2 |-> ##1 counter_r == 2;
 endproperty
 assert_counter_2:  assert property(counter_2); 

编译就会有如下错误:

Error-[NCIFA] No clock inferred for assertion
tb.sv, 50
tb, "cover_counter_2"
The concurrent assertion statement has no clock as a whole or in part.
Assertions cannot be unclocked in SystemVerilog.

因为没有指定时钟,所以##1操作,就不知道使用什么时钟可以实现延迟一个时钟的操作。

如果说,我们编写的assertion,都使用一个时钟,那么我们可以把这个时钟,定义为全局的时钟。这样,编写的assertion中,就不在需要显示指定时钟,就可以直接使用##这样的操作。

定义全局时钟,使用 default clocking进行定义。

default clocking cb @(posedge clk);
endclocking: cb 

然后编写assertion。

 property counter_2;
 counter == 2 |-> ##1 counter_r == 2;
 endproperty
 assert_counter_2:  assert property(counter_2); 

此时编译仿真正常

更多相关阅读

奔跑吧,SOC(三) 互联总线协议
奔跑吧,SOC(二) 片上互联总线
奔跑吧,SOC(一) 软件是怎么控制硬件的

原文首发于骏的世界博客
作者:卢骏
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。

【专利解密】赛灵思 基于FPGA的AI芯片

【嘉德点评】赛灵思发明的基于FPGA的人工智能芯片,整合了深度神经网络计算所需要的必要元素,保证了其可以高效、快速的完成所需要进行的AI训练任务

集微网消息,18年10月,全球FPGA芯片巨头赛灵思在中国展示了其基于ACAP架构的7nm首款人工智能芯片Versal。ACPA架构是赛灵思在18年3月推出的新一代芯片架构,目的就是为了推动其人工智能芯片的发展。

这种人工智能芯片提供了多个为AI推断和高级信号处理工作负责而优化的AI引擎,其基于ARM架构打造,具有高性能以及低时延的优良性能,尤其是针对于云端、网络、自动驾驶技术等做了优化。

而在同年18年8月30日,赛灵思则申请了一项名为“在集成电路中实现神经网络的系统和方法”的发明专利(申请号:201880061751.0),申请人为赛灵思公司,这是一项用于人工智能训练的硬件芯片设计方案。

根据该专利目前公开的资料,让我们一起来看看这项基于FPGA设计的人工智能芯片吧。

如上图,展示了FPGA架构的芯片结构,其中包括大量不同的可编程片块,包括多千兆位收发器101、可配置逻辑块102、随机存取存储器块103、配置和时钟逻辑块102、数字信号处理块106和其他可编程逻辑块108。

该专利中,这个图示是为了展示可用于实现可编程电路的IC示例性架构,例如,一行中逻辑块的数量、行的相对宽度、行的数量和顺序、行中包含的逻辑块的类型、逻辑块的相对大小在不同的任务中都可以进行相应的调整以及改变。

那么对于人工智能芯片而言,为了完成神经网络的功能,这种IC如何搭建神经网络系统呢?具体方案如下图所示。

该图中展示了神经网络系统200,其中包括预处理单元202、多个神经网络层及损失计算单元210,这些层单元均可以通过FPGA或者DSP等模块实现。预处理单元可以接收输入训练集220,也可以在输入训练集中人工的增加批次(例如,通过执行失真、着色、旋转、缩放等其他操作增加训练集的数量)。

借助于这套系统,可以实现各种各样的训练算法,包括加权、反向传播、前向传播等,而且由于是在硬件层面实现的,因此这种人工智能芯片会比采用软件仿真的方式更加快捷并且具有更小的硬件以及软件上的开销。

如上图,为这种使用多个计算单元实现的神经网络系统的框图,该图展示了使用多个FPGA及这些可编程芯片之间的通信的流接口的流式架构。流式架构指的是每个芯片之间通过流接口来实现,数据就在这些接口之中传递,当主机1104将训练集发送到神经网络系统1102之后,可以从神经网络系统中接收学习后的权重。

而下图则展示了使用单个可编程脉动阵列的单个可编程IC架构。

可以看到,其中使用单个处理阵列1204(也就是单个FPGA)来实现神经网络系统,其中单个处理阵列也被称为脉冲阵列,其可以用于计算神经网络系统的全连接层、卷积层和最大池化层上的前向以及反向传播计算,每个层的权重将被保存在I/O缓冲器中。

而单个FPGA虽然在算力上比不上多FPGA结构,但是对于一些小型任务,单个FPGA依旧是游刃有余,这样通过设计多套处理器结构,可以从容的应对各种不同的任务,既减少了硬件的消耗,也使得方案设计的更加合理。

以上就是赛灵思发明的基于FPGA实现的神经网络系统,从该系统的结构中可以看出,系统整合了深度神经网络计算所需要的必要元素,这样就保证了多种不同的任务均可以应用在这样的芯片上。同时,该专利设计了单个以及多个处理器阵列,可以应对不同的情况,节省了硬件开销。

关于嘉德

深圳市嘉德知识产权服务有限公司由曾在华为等世界500强企业工作多年的知识产权专家、律师、专利代理人组成,熟悉中欧美知识产权法律理论和实务,在全球知识产权申请、布局、诉讼、许可谈判、交易、运营、标准专利协同创造、专利池建设、展会知识产权、跨境电商知识产权、知识产权海关保护等方面拥有丰富的经验。

(校对/holly)

海思AI芯片(Hi3519A-3559A)学习(四)在3519A板子上运行sample code

本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之四,系列文章请见底部。这篇文章将介绍在海思3519A板子上运行sample code。
作者:ltshan139

sample code编译

先解压缩SDK(Hi3519AV100_SDK_V2.0.1.0.tgz)得到Hi3519AV100_SDK_V2.0.1.0文件夹。其sample源代码藏在Hi3519AV100_SDK_V2.0.1.0\smp\a53_linux\mpp\sample下面。如下所示,每个目录对应一个小功能。

Install cross toolchain后(见前文),就直接在sample下面make,就会对所有子目录中源代码进行编译,然后对应每个子目录分别生成一个可执行文件sample_xxx。

当然,上面一系列操作都是在linux服务器上,比如ubuntu等进行的。

安装nfs文件系统

在开发调试过程中,我们需要在linux服务器上安装nfs,以便开发代码可以mount到板子来运行。

sudo apt-get install nfs-kernel-server          //install sw
sudo apt-get install nfs-common             //install sw
sudo /etc/init.d/service nfs-kernel-server restart     // Start service  

使nfs目录生效

sudo mkdir xx/xx/nfs   //创建一个目录

路径以及nfs目录名由自己指定

这个目录下的内容将来会被mount到板子上

sudo vi /etc/exports 并且添加一行:/home/tt/nfs      *(rw,sync,no_root_squash)

exportfs -rf来使得上面nfs目录设置生效。

板子网络配置

板子插上网线,上电后,在板子的shell里面输入ifconfig

如果显示eth0  192.168.1.100,说明kernel已经将板子自动配置成一个IP了

这时,一定要输入 ping linux服务器ip来验证板子和服务器网络通信是否正常。我这边服务器ip是192.168.0.121,它们不在一个网段,是ping不通的。我这里将板子ip进行了修改(比如ifconfig eth0 192.168.0.100)就能ping通了。

回到第二步,如果ifconfig完后,啥也没有显示,可以考虑下面的命令来进行配置:

ip link set eth0 up
ip addr add 192.168.1.40/24 dev eth0
ip route add default via 192.168.1.1
ip route show

     

将服务器上的nfs目录mount到板子上

mount -t nfs 192.168.0.121:/xx/xx/nfs /nfsroot -o nolock

该命令就是将前面步骤中服务器上创建的目录mount到板子的/nfsroot。

运行sample

sample里面小功能绝大多数和sensor相关,但是目前新sensor还没点亮,所以就运行一个叫tde的最简单sample,它不需要sensor输入, 直接由芯片内部生成二维图形并渲染,最后经hdmi输送到屏幕。

在linux服务器上,将tde sample目录拷贝到xx/nfs下

cp -a xx/xx/mpp/sample/tde /xx/xx/nfs

在板子上,直接运行该可执行文件即可

cd /nfsroot

./sample_tde 1  (后面这个参数1表示hdmi output)

版权声明:本文为CSDN博主「ltshan139」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/avideointerfaces/article/details/88722157

海思AI芯片系列文章

  • 海思Hi3519A/3559A(三)Ubuntu18.0.4上编译uboot和kernel
  • 海思AI芯片(Hi3519A/3559A)方案学习(二)RuyiStudio安装
  • 海思AI芯片(Hi3519A/3559A)方案学习(一)资料以及术语介绍

更多海思AI芯片、Tengine、MNN、Paddlepaddle等嵌入式AI技术干货欢迎关注嵌入式AI专栏

【专利解密】云塔科技,高集成度无源滤波器助力毫米波通信

【嘉德点评】云塔科技的无源滤波器专利,将无源器件的第一电容集成在芯片上,结合安装器件的第一电感形成无源滤波器,可大大提高无源器件的集成度,有利于其小型化,同时还降低了无源滤波器寄生参数的不可控性,提高了性能的规模量产一致性

集微网消息,随着5G网络的部署和卫星互联网的兴起,面向物理层毫米波的研究也在争分夺秒的进行。前不久,云塔科技联合中科大微电子学院,发布了其自主研制的5G毫米波滤波器,使用了独特的超高性能集成无源器件(SPD)技术,这也标志着国内毫米波技术在商业化进程走出了关键一步。

滤波器作为电路系统中的重要子模块,通常使用电容、电感和电阻的组合电路对信号等进行滤波,消除噪声干扰,以确保系统运行的稳定性和可靠性。而随着电路的小型化和集成化,滤波元件受电路板工艺自身精度以及寄生参数的影响,会导致电容与电感与自身标定值的不一致性,尤其是当信号处于毫米波段,无源滤波器装置的参数会存在极大的不可控性,容易导致系统崩溃。

为此,云塔科技于2017年10月26日申请了一项名为“一种无源滤波器装置和无源滤波器模组”的发明专利(申请号:201711018596.8),申请人为安徽云塔电子科技有限公司。这一发明可使得各个无源滤波器独立工作滤波,同时增加了无源器件的集成度,改善了与基板之间的导电导热性能。

图1无源滤波器装置结构图

参考图1,本发明提出的一种无源滤波器结构包括基板10、集成无源器件20与安装器件30。其中基板10平铺在底层,其第一表面101包含多个金属域102,用于实现其表面无源器件与安装器件的电连接。集成无源器件20包含多个芯片,并嵌有电容,以倒装的方式利用导电凸起安装在基板表面。安装器件30包含多个电感,结合无源器件20的第一电容实现滤波作用。

图2无源滤波器等效电路

图2为图1滤波器的一种等效电路图,由左图可知,第一电感对低频信号阻碍小,对高频信号阻碍大,第一电容则对低频信号衰减小,对高频信号衰减大,因此该无源滤波器装置容易通过低频信号,可等效为低通滤波器。而右图中第一电感和第一电容的位置互换,此时等效电路通高频,阻低频,等效为高通滤波器。因此发明中的技术方案可提高无源器件的集成度,有利于无源滤波器装置的小型化,并降低了参数的不可控性、减小了寄生参数,增强其与基板的导电导热性能。另外,本发明的无源滤波器装置不含有源器件,并能以独立存在的方式耦合到其他电路中,实现选择频段进行滤波。

在上述技术方案的基础上,一方面集成无源器件20芯片上的第一电容为MIM(金属-绝缘层-金属)电容,其两个极板的有效厚度均不小于1μm,可大幅度降低极板的寄生电阻,提高电容的品质因数。另一方面通过采用高品质因数的电感用于提高了谐振回路的谐振特性,从而进一步发提高无源滤波器装置的滤波效果。

简而言之,云塔科技的这一发明公开了一种无源滤波器装置,将无源器件的第一电容集成在芯片上,并结合安装器件的第一电感形成无源滤波器,可大大提高无源器件的集成度,有利于其小型化,同时还降低了无源滤波器参数的不可控性,提高了性能的规模量产一致性。

借助5G甚至6G的东风,云塔科技深耕毫米波技术领域,利用超高集成无源器件技术,成功推出sub-6GHz和毫米波频段的滤波器产品。在这一5G终端产品即将爆发性增长的阶段,相信云塔科技在未来定能够大放异彩。

关于嘉德

深圳市嘉德知识产权服务有限公司由曾在华为等世界500强企业工作多年的知识产权专家、律师、专利代理人组成,熟悉中欧美知识产权法律理论和实务,在全球知识产权申请、布局、诉讼、许可谈判、交易、运营、标准专利协同创造、专利池建设、展会知识产权、跨境电商知识产权、知识产权海关保护等方面拥有丰富的经验。

(校对/holly)

突围数字化转型,让特步同比增长24.8%的全渠道中台

导读:多年前,曾有媒体向丁水波提问:“对于你个人来说,转型过程中最痛苦的部分是什么?”“最关键的是市场意识的转变。耳听为虚眼见为实,做起来给外界看到了,他们才会明白和接受。很多东西得做完成功了,才可以让别人信服,但这中间的时间周期会比较长一点。”丁水波这样回应道。

近年来特步在运动鞋细分领域不断加码。2019 年,公司陆续收购了索康尼、迈乐、盖世威和帕拉丁的相关运营权,形成了涵盖大众运动、专业运动和时尚运动三大细分市场的品牌矩阵,打破了过去单一的品牌格局。但一系列收购也令特步的商誉增至 8.3 亿元。

与此同时,特步的旗下业务也在持续变革。

今年零售业受到受疫情巨大冲击的同时,也倒逼特步新营销业务的快速提升。疫情以来,数字化转型全面加速,品牌服装企业们纷纷奔向线上线下渠道融合变革的新零售模式。在这一重要趋势中,特步也不例外,今年特步电商业务通过调整内部货品结构、精准营销推广、布局直播业务等举措持续变革,强化新营销矩阵。相关数据显示,618 活动中,特步主品牌全渠道累计成交突破 2.5 亿元,国内品牌第三;特步儿童新品高速成长,全网增速达 77%。山海系列、猫和老鼠系列、騛速系列等受到消费者青睐。就这样,特步彻底破圈。而这一切的业务增长与都源于特步的第三次战略升级。

作为成立于 2001 年,中国领先的体育用品企业之一的特步,门店数 6230 家。从服饰行业来看绝大多数零售企业都是做批发的。在这种模式下,品牌商与消费者之间是割裂与隔绝的。

  • 一方面,品牌商无法快速把新产品推向市场,送到消费者手上;
  • 另一方面,它们也无法了解消费者对产品的评价,无从知道消费者的需求。

这最终导致整个服饰行业陷入库存危机。

2013 年开始,特步营收出现明显下滑,还陆续关闭了上千家线下门店。面对传统模式的弊端,加上来自国际快时尚品牌的压力,2015 年特步董事局主席兼 CEO 丁水波提出了三年转型战略。

在回归运动,聚焦跑步的同时,改变批发模式转向零售模式。2016 年,特步启动集团第三次战略升级,打造以消费者体验为核心的“3+”( 互联网+、体育+、产品+) 的战略目标,积极拥抱云计算、大数据等新技术,实现业务引领和技术创新,支撑企业战略变革的稳步推进。在这一过程中,特步发现要做零售,就得重新梳理原来基于批发的业务流程,拆分或整合部门,业务部门也得不断去尝试新的业务机会。但是大家在这么做的时候,发现原来的 IT 系统根本支撑不了,只会拖后腿。在集团战略的促使下,阿里云中间件团队受邀对特步 IT 信息化进行了深度调研,挖掘阻碍特步战略落地的些许挑战:

  • 商业套件导致无法满足特步业务多元化发展要求,例如多品牌拆分重组所涉及的相关业务流程以及组织调整。对特步而言,传统应用系统都是紧耦合,业务的拆分重组意味着必须重新实施部署相关系统;
  • IT 历史包袱严重,内部烟囱系统林立。通过调研,阿里云发现特步烟囱系统多达六十三套,仅 IT 供应商就有三十余家。面对线上线下业务整合涉及到的销售、物流、生产、采购、订货会、设计等不同环节及场景,想要实现全渠道整合,需要将几十套系统全部打通;
  • 高库存、高缺货问题一直是服装行业的死结,特步同样被这些问题困扰着。系统割裂导致数据无法实时在线, 并受限于传统单体 SQL Server 数据库并发限制,6000 多家门店数据只能采用 T+1 方式回传给总部,直接影响库存高效协同周转;
  • IT 建设成本浪费比较严重,传统商业套件带来了“烟囱式”系统的弊端,导致很多功能重复建设、重复数据 模型以及不必要的重复维护工作。

一边是业务部门要不断寻求发展机会,一边是 IT 部门被折腾得够呛,但仍然跟不上业务变化。

因为这个全渠道项目对于特步而言意义重大,它肩负着特步从批发模式走向了零售模式的重任。因此,阿里云根据特步业务转型战略需求,为之量身打造了基于云原生架构的全渠道业务中台解决方案,将不同渠道通用功能在云端合并、标准化、共享,衍生出全局共享的商品中心、渠道中心、库存中心、订单中心、营销中心、用户 中心、结算中心。

无论哪个业务线、哪个渠道、哪个新产品诞生或调整,IT 组织都能根据业务需求,基于共享服务中心现有模块快速响应,打破低效的“烟囱式”应用建设方式。全渠道业务中台遵循互联网架构原则,规划线上线下松耦合云平台架构,不仅彻底摆脱传统 IT 拖业务后腿的顽疾并实现灵活支撑业务快速创新,将全渠道数据融通整合 在共享服务中心平台上,为数据化决策、精准营销、统一用户体验奠定了良好的产品与数据基础,让特步真正走上了 “互联网+”的快车道。

2017 年 1 月特步与阿里云启动全渠道中台建设,耗时 6 个月完成包括需求调研、中台设计、研发实施、测试验证等在内的交付部署,历经 4 个月实现全国 42 家分公司、6000+ 门店全部上线成功。

特步全渠道业务中台总体规划示意图:

基于云原生中间件的技术架构示意图:

而这其中一些架构关键节点,值得借鉴:

应用侧

新技术架构全面承载面向不同业务部门的相关应用,包括门店 POS、电商 OMS、分销商管理供销存 DRP、会员客户管理 CRM。此外,在全渠道管理方面也会有一些智能分析应用,比如库存平衡,同时可 以通过全渠道运营平台来简化全渠道的一些配置管理。所有涉及企业通用业务能力比如商品、订单等,可以 直接调用共享中心的能力,让应用“更轻薄”。

共享中心

全渠道管理涉及到参与商品品类、订单寻源、共享库存、结算规则等业务场景,也涉及与全渠道相关的会员信息与营销活动等。这些通用业务能力全部沉淀到共享中心,向不同业务部门输出实时 / 在线 / 统 一 / 复用的能力。直接将特步所有订单 / 商品 / 会员等信息融合、沉淀到一起,从根本上消除数据孤岛。 

技术层:为了满足弹性、高可用、高性能等需求,通过 Kubernetes / EDAS / MQ / ARMS / PTS 等云原生中间件产品,目前特步核心交易链路并发可支撑 10w / tps 且支持无线扩容提升并发能力。采用阿里历经多年 双11 考验的技术平台,稳定性 / 效率都得到了高规格保障,让开发人员能够更加专注在业务逻辑实现,再无后顾之忧。基础设施:底层的计算、存储、网络等 IaaS 层资源。

后台系统

客户内部的后台系统,比如 SAP、生产系统、HR/OA 等。

全渠道业务中台为特步核心战略升级带来了明显的变化,逐步实现了 IT 驱动业务创新。经过中台改造后,POS 系统从离线升级为在线化。包括收银、库存、会员、营销在内的 POS 系统核心业务全部由业务中台统一提供服务,从弱管控转变为集团强管控,集团与消费者之间真正建立起连接,为消费者精细化管理奠定了坚实的基础。

中台的出现,实现了前端渠道的全局库存共享,库存业务由库存中心实时处理。借助全局库存可视化,交易订单状态信息在全渠道实时流转,总部可直接根据实时经营数据对线下店铺进行销售指导,实现快速跨店商品挑拨。中台上线后,售罄率提升 8%,缺货率降低 12%,周转率提升 20%,做到赋能一线业务。

IT 信息化驱动业务创新,通过共享服务中心将不同渠道类似功能在云端合并共享,打破低效的“烟囱式”应用建设方式,吸收互联网 DDD 领域驱动设计原则,设计线上线下松耦合云平台架构,不仅彻底摆脱了传统 IT 拖业务后腿的顽疾并灵活支撑业务快速创新。全渠道数据融通整合在共享服务中心平台上,沉淀和打造出特步的核心数据资产,培养出企业中最稀缺的“精通业务,懂技术”创新人才,使之在企业业务创新、市场竞争中发挥核心作用。

2018 年对特步来说是值得自豪的一年。

当年实现营收 63.8 亿元,同比增长 25%,创下上市以来的历史新高,全年净利润增速高达 61%,三年转型效果初显。在这背后,除了体育+、产品+ 的转型之外,还有互联网+的数字化转型。特步的技术团队历时 3 年与阿里云合作打造的“特步全渠道零售平台”正式上线,为市场的爆发铺平了道路。截止 2019 年初,业务部门对 IT 部门认可度持续上升,目前全渠道业务支撑系统几乎全部自主搭建,80% 前台应用已经 全部运行在中台之上,真正实现技术驱动企业业务创新。

结合强大的云智能技术、多样的行业实践,以及庞大的生态伙伴,阿里云已经成为新零售市场最大的云,帮助企业通过上云推动自身的零售转型。随着云计算的普及与云原生的广泛应用,越来越多的从业者、决策者清晰地认识到「云原生化将成为企业技术创新的关键要素,也是完成企业数字化转型的最短路径」。

因此,具有前瞻思维的互联网企业从应用诞生之初就扎根于云端,谨慎稳重的新零售、政府、金融、医疗等领域的企业与机构也逐渐将业务应用迁移上云,深度使用云原生技术与云原生架构。面对架构设计、开发方式到部署运维等不同业务场景,基于云原生架构的应用通常针对云的技术特性进行技术生命周期设计,最大限度利用云平台的弹性、分布式、自助、按需等产品优势。

 想要了解更多云原生产品所能带来的技术优势,更多企业的实践?点击立即下载阿里云云原生架构白皮书:https://developer.aliyun.com/topic/cn-architecture-paper

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

如何DIY轻型的Mobilenet回归器

之前我们有跟大家讨论过如何DIY一个轻型的Mobilenet SSD的物体检测器,本专栏的其他文章亦有介绍如何部署该类轻型MSSD的物体检测器于嵌入式设备中,如RK3288、RK3399等。本文我们继续跟大家讨论轻型的神经网络,今天想跟大家介绍的是回归器(Regressor)。回归器不同于分类器,回归器旨在利用CNN学习如何预测连续的值,分类器对应的输出非离散的id(二分类、多分类)。我们不展开去介绍回归器的理论知识,下面我们介绍一些回归器的应用场景。
首发:https://zhuanlan.zhihu.com/p/71648953
作者:张新栋

我们在实际的计算机视觉项目中,其实很多场景应用到了回归器。比如人脸的关键点检测,就是一个特殊的回归器应用场景。以68个关键点的检测任务为例,其实质就是转化成一个输出[1×136]向量的回归器;再比如人脸姿态估计,也是一个典型的回归器模型。人脸姿态估计目前主流的做法分两种,一种的2D->3D的方式,即先检测人脸关键点,然后计算关键点和平均正脸关键点的一个投影矩阵,最后迭代优化以估算出人脸的姿态pitch、roll、yaw;另外一种是转化成一个直接回归的模型,即输出一个1×3的向量,分别代表roll、yaw、pitch,随后以数据驱动的方式去训练该模型。

介绍了回归器和其常见的应用以后,我们回到本文的主题:如何DIY轻型的Mobilenet回归器。Mobilenet已经是一个对嵌入式设备非常友好的网络结构,在许多嵌入式设备中都能高效的运行。本文中,我们将跟大家介绍如何基于Mobilenet,DIY一个轻型的回归器。以人脸姿态估计这个任务为例,我将其分为如下几个阶段(这里不考虑数据准备工作),模型设计、数据导入、训练参数。我们以tensorflow-keras作为示例的框架。

模型设计

我们的最终目的是要将训练好的模型部署到嵌入式设备中,所以尽量避免一些对嵌入式设备计算不友好的Op。阅读过本专栏其他文章的朋友也许会比较熟悉,一般需要注意的Op有Padding、Squeeze、Reshape、GlobalAveragePooing等,不过具体实现需要参考你部署所借助的inference框架。Mobilenet的设计可参考如下代码:

def build_model(depth_multiptiler = 1.0, image_size = 64, channels = 3):
    input = keras.Input(shape=(image_size,image_size,channels), name = "input")
    mobilenet_feature   = MobileNetBase(
        img_input = input,
        alpha = depth_multiptiler,
    )

    x0 = keras.layers.Dense(128, activation=tf.nn.relu)(mobilenet_feature)
    x0 = keras.layers.Dropout(0.2)(x0)
    pitch = keras.layers.Dense(1)(x0)

    x1 = keras.layers.Dense(128, activation=tf.nn.relu)(mobilenet_feature)
    x1 = keras.layers.Dropout(0.2)(x1)
    yaw  = keras.layers.Dense(1)(x1)

    x2   = keras.layers.Dense(128, activation=tf.nn.relu)(mobilenet_feature)
    x2   = keras.layers.Dropout(0.2)(x2)
    roll = keras.layers.Dense(1)(x2)

    output = keras.layers.concatenate([
        pitch, yaw, roll, 
    ], axis=-1)

    model = keras.Model(inputs = input, outputs = output)

    print (model.summary())

    return model

def MobileNetBase(
              img_input=None,
              alpha=1.0,
              depth_multiplier=1,
              dropout=1e-3,
              include_top=True,
              input_tensor=None,
              pooling=None,
              name = "input"):

    x = _conv_block(img_input, 32, alpha, strides=(2, 2))
    x = _depthwise_conv_block(x, 64, alpha, depth_multiplier, block_id=1)

    x = _depthwise_conv_block(x, 128, alpha, depth_multiplier,
                              strides=(2, 2), block_id=2)
    x = _depthwise_conv_block(x, 128, alpha, depth_multiplier, block_id=3)

    x = _depthwise_conv_block(x, 256, alpha, depth_multiplier,
                              strides=(2, 2), block_id=4)
    x = _depthwise_conv_block(x, 256, alpha, depth_multiplier, block_id=5)

    x = _depthwise_conv_block(x, 512, alpha, depth_multiplier,
                              strides=(2, 2), block_id=6)
    x = _depthwise_conv_block(x, 512, alpha, depth_multiplier, block_id=7)

    x = _depthwise_conv_block(x, 512, alpha, depth_multiplier, block_id=8)
    
    x = _depthwise_conv_block(x, 512, alpha, depth_multiplier, block_id=9)
    
    x = _depthwise_conv_block(x, 512, alpha, depth_multiplier, block_id=10)
    
    x = _depthwise_conv_block(x, 512, alpha, depth_multiplier, block_id=11)
    
    x = _depthwise_conv_block(x, 1024, alpha, depth_multiplier, strides=(2, 2), block_id=12)
    
    x = _depthwise_conv_block(x, 1024, alpha, depth_multiplier, block_id=13)
    
    x = layers.AveragePooling2D(pool_size=(2, 2), padding='valid')(x)
    
    x = layers.Reshape((int(1024*alpha),), name='reshape_1')(x)
    return x


def _conv_block(inputs, filters, alpha, kernel=(3, 3), strides=(1, 1)):
    channel_axis = -1
    filters = int(filters * alpha)
    x = layers.ZeroPadding2D(padding=((0, 1), (0, 1)), name='conv1_pad')(inputs)
    x = layers.Conv2D(filters, kernel,
                      padding='valid',
                      use_bias=False,
                      strides=strides,
                      name='conv1')(x)
    x = layers.BatchNormalization(axis=channel_axis, name='conv1_bn')(x)
    return layers.ReLU(6., name='conv1_relu')(x)


def _depthwise_conv_block(inputs, pointwise_conv_filters, alpha,
                          depth_multiplier=1, strides=(1, 1), block_id=1):
    # channel_axis = 1 if backend.image_data_format() == 'channels_first' else -1
    channel_axis = -1
    pointwise_conv_filters = int(pointwise_conv_filters * alpha)
    if strides == (1, 1):
        x = inputs
    else:
        x = layers.ZeroPadding2D(((0, 1), (0, 1)),name='conv_pad_%d' % block_id)(inputs)
    x = layers.DepthwiseConv2D((3, 3),
                               padding='same' if strides == (1, 1) else 'valid',
                               depth_multiplier=depth_multiplier,
                               strides=strides,
                               use_bias=False,
                               name='conv_dw_%d' % block_id)(x)
    x = layers.BatchNormalization(
        axis=channel_axis, name='conv_dw_%d_bn' % block_id)(x)
    x = layers.ReLU(6., name='conv_dw_%d_relu' % block_id)(x)

    x = layers.Conv2D(pointwise_conv_filters, (1, 1),
                      padding='same',
                      use_bias=False,
                      strides=(1, 1),
                      name='conv_pw_%d' % block_id)(x)
    x = layers.BatchNormalization(axis=channel_axis,
                                  name='conv_pw_%d_bn' % block_id)(x)
    return layers.ReLU(6., name='conv_pw_%d_relu' % block_id)(x)

其中,为了对该回归器进行加速,默认的输入尺寸设定为64×64,depth\_multiplier可根据实际情况选取0.5~1.0。这里我们回归器输出的是三个1×1的向量,该类回归器的设计方式在实际应用中可调整的效果要优于直接输出一个1×3的向量,不过引入的代价是增加了全连接层的数量。

数据导入

基于tensorflow-keras训练的数据导入大致分如下几种,一种是直接加载仅RAM中,该类方式的有点是训练加载数据块,缺点是在面对较大的数据量时不适用;另一种是采用文件形式按照特定格式加载训练数据,训练数据的标注文件先载入RAM中,然后每次按批次的加载训练数据及标注数据,此类方式的优点是可处理数据量较大的训练数据,缺点是加载数据的时效性较差(可以开启多线程加速数据的加载过程)。本文介绍的是以文件形式进行加载。先看一下文件的标注格式,

filename,pitch,yaw,roll
LFPW/LFPW_image_train_0005_5.jpg,-0.248872,-0.503261,-0.082886 

首先第一行为标注文件的格式,第二行开始往下都是标注数据。第一列元素为图片文件名,第二列元素为pitch角度,第三个为yaw角度,第四个为roll角度。准备好标注文件以后,我们需要建立标注文件到数据加载的流程,可参考如下代码。

    datagen = tf.keras.preprocessing.image.ImageDataGenerator(
        featurewise_center=False, 
        samplewise_center=False, 
        featurewise_std_normalization=False, 
        samplewise_std_normalization=False, 
        zca_whitening=False, 
        zca_epsilon=1e-06, 
        rotation_range=10, 
        width_shift_range=0.1, 
        height_shift_range=0.1, 
        brightness_range=(1, 1.3), 
        shear_range=0.1, 
        zoom_range=(0.85, 1.15), 
        channel_shift_range=0.0, 
        fill_mode='nearest', 
        cval=0.0, 
        horizontal_flip=False, 
        vertical_flip=False, 
        rescale=None, 
        preprocessing_function=headpose_preprocess, 
        data_format=None, 
        validation_split=0.15, 
        dtype=None)

    data_frame = pd.read_csv(annotation_file)
    train_data_generator = datagen.flow_from_dataframe(
        dataframe   = data_frame,
        directory   = data_dir,
        x_col       = "filename",
        y_col       = ["pitch", "yaw", "roll"],
        class_mode  = "other",
        target_size = (image_size, image_size),
        batch_size  = batch_size,
        shuffle     = True,
        subset      = "training"
    )
    valid_data_generator = datagen.flow_from_dataframe(
        dataframe   = data_frame,
        directory   = data_dir,
        x_col       = "filename",
        y_col       = ["pitch", "yaw", "roll"],
        class_mode  = "other",
        target_size = (image_size, image_size),
        batch_size  = batch_size,
        shuffle     = True,
        subset      = "validation"
    )

以上代码我们还需要注意的一点是,数据的预处理函数,这里面的可操作性比较灵活,以如下代码为例,我们在预处理做了数据增广、数据白化的处理:

seq = iaa.Sequential([
    iaa.OneOf([
        iaa.GaussianBlur(sigma=(0, 0.5)), # blur images with a sigma of 0 to 1.0
        iaa.Dropout((0.0, 0.03), name="Dropout"),
        iaa.AdditiveGaussianNoise(scale=0.03*255, name="MyLittleNoise"),
        iaa.AdditiveGaussianNoise(loc=32, scale=0.001*255, name="SomeOtherNoise"),
    ])
])

def headpose_preprocess(image):
    if np.random.random_sample() > 0.5:
        image = seq.augment_image(image)
    image = np.array(image)
    converted_img  = image - 123.0 
    converted_img /= 58.0
    return converted_img

训练参数

训练参数里我们需要注意如下几个方面,一个是采用什么优化算法(SGD、ADAM、Momentum等)、learning rate(影响模型收敛、发散)、损失函数(回归器一般采用Mean-Square-Error,MSE)、回调函数(可处理模型保存、日志打印等等)。在使用tensorflow-keras处理以上任务非常简单方便,参考如下代码:

    # Create checkpoint callback
    callback = tf.keras.callbacks.ModelCheckpoint(
        checkpoint_path,
        save_weights_only=True,
        verbose=1,
        period=1
    )

    # build model
    model = build_model(depth_multiptiler, image_size, channels)
    optimizer = keras.optimizers.Adam(lr)
    model.compile(
        loss='mean_squared_error',
        optimizer=optimizer,
        metrics=['mean_absolute_error', 'mean_squared_error']
    )

    # load check point
    latest_ck_path = tf.train.latest_checkpoint(checkpoint_dir)
    if latest_ck_path is not None:
        model.load_weights(latest_ck_path)

    # fit model with data generator
    model.fit_generator(
        generator = train_data_generator,
        steps_per_epoch = train_data_generator.samples,
        epochs = EPOCHS,
        validation_data  = valid_data_generator,
        validation_steps = valid_data_generator.samples,
        verbose = 1,
        use_multiprocessing = False,
        callbacks=[callback]
    )

最后

在进行完以上步骤后,我们就可以进行模型的训练。回过头来再看看模型本身,基于Mobilenet、输入size为64×64、depth\_multiplier为0.75,该模型在RK3399中一次inference仅需要10ms,运行效率相当可观。在后续专栏内容里,我们还会跟大学继续讨论,如何去训练该类小型网络以得到好的inference效果,如采用数据蒸馏、知识迁移、半监督学习等等。欢迎大家留言讨论、关注专栏,谢谢大家!

推荐阅读

  • 如何DIY轻型的Mobilenet-SSD模型译
  • 实战MNN之Mobilenet SSD部署(含源码)

专注嵌入式端的AI算法实现,欢迎关注作者微信公众号和知乎嵌入式AI算法实现专栏

更多嵌入式AI相关的技术文章请关注极术嵌入式AI专栏

实体经济的数智化要塞,为什么是供应链?

大家是否注意过一个现象,许多国际城市的经济新区,都开始以某种产业集群来命名。

以前,人们喜欢用杰斐逊、胡志明、华盛顿之类的人名,亦或是海港城、武夷山之类的自然景观,来为一座城市命名。如今,越来越多的城镇开始用起在全球经济供应链中的定位来命名,比如迪拜互联网城、开曼创业城、绵阳科技城等等。

这些特殊区位,是当地经济的发展之锚,也是全球社会向供应链地理转变的表现。供需的动态变化成为驱动社会组织演进的核心动能,人们努力靠近基础设施和供应链附近,无论是现实的,还是虚拟的。在这个由生产者、中间商、销售者组成的完整生态体系中,满足供需、享受生活、追求发展。

物理学家加来道雄给这样的状态起了一个名字——供应链世界。有学者认为,在这样的世界体系中,地图上连通线(供应链)的重要性甚至超过了传统地图上的国界线。

现实供应链是传统基建的核心,进入数字互联时代,供给和需求的连接方式也发生了变化,是时候重新思考世界的供应链,以及供应链的世界了。

在中国,有能力也有意愿讨论供应链与数智技术融合的平台,屈指可数,十多年来为中国供应链降本增效做出贡献的京东,无疑是不容忽视的存在。因此,从11月25日举行的2020京东全球科技探索者大会(JDDiscovery)上,从京东未来十年的新一代基础设施中读懂未来供应链变局,自然至关重要。

物理世界与数字世界的供应链之变

“新基建”这个名词之妙,在于其精准指向了决定社会流动性和经济韧性的基石——全球竞争互联所需要的数智基础设施。这些基础设施相互连在一起,就形成了一个全新的供应链网络。

“旧基建”靠高速公路、高速铁路等托举其经济活动的高速率,“新基建”则利用AI、工业互联网、大数据中心等,用无处不在的数字化将全球市场主体、人和物包裹在一起。

疫情期间的重要医疗物资流动,需要数智化供应链系统来保障效率;高效的政务服务同样需要虚拟化的数字信息服务供应链来保驾护航。随着社交电商、社区电商、内容电商的兴起,日益复杂的零售行业也需要全渠道供应链来满足碎片化的供需场景。

而对于急于从疫情打击中修复过来的全球产业来说,面对需求和供给端的各种不确定性,供应链的智能化、协同化、柔性化、精准化,也就成了帮助企业降低风险、提升效能的“刚需”。

京东集团副总裁、京东零售集团生态业务中心负责人林琛在大会上分享了他所感受到的产业变化:越来越多的厂商在转变观念,打造以用户需求为中心的反向供应链体系,洞察用户需求成为了产品开发的最核心驱动因素。

不难发现,从企业到行业再到国家经济体,供应链正在成为互联竞争的关键赛点。

不破不立:供应链数智化转型的三大痛点

要建构新的产业逻辑,首先要有对于各个行业的特殊需求的理解,只有基于普遍存在的真实痛点的深刻理解,才能在供应链走向智能化的过程中,把握其与产业的契合点。那么,当下各行各业所需要的供应链差异化是什么呢?

首先是效率。在供应链世界里,低效是最致命的敌人。许多提升效率的方法,比如改变集装箱的大小、货运行业单据电子化等等,都曾带来过数百亿美元的商业价值。而人工智能、区块链、机器视觉、实时计算、柔性自动化等技术的爆发,也让数字协同和网络智能成为持续优化垂直行业供应链成本、效率和体验的绝佳武器。

其次是路径。能够带来效率提升的云计算、AI、5G等基础技术,与产业实际应用之间有不少距离,如何像“旧基建”一样,让学校、医院、工矿等领域可以直接连入数智化供应链体系,就需要具体、全链路的服务体系和解决方案来作为支撑,降低产业应用门槛。

最后是共生。当下能够提供数智化转型方案的平台有很多,而供应链的特殊之处在于,它的核心任务是将遥远的多方联系在一起,这些主体之间可能缺乏相互信任,因此就需要真实信息的实时共享,让这张网中的所有人都能随时把握事态的进展,互相依靠、彼此共生。这背后需要的不仅仅是区块链、AI等技术体系的完善,平台的品牌认知度、技术可靠性、安全公信力等等,都需要久经考验。

从这个角度看,当下中国产业的转型焦虑,也在表达着对新的技术浪潮或者说供应链能量的渴求。渴望通过全新的基础设施,来保持、增加中国工业化的优势,抵御各种“黑天鹅”、“灰犀牛”。

在JDDiscovery-2020京东全球科技探索者大会上,京东的数智化社会供应链也试图将自身在供应链物流领域的多年积累、理解和创新,交付给产业界,推动数智化社会供应链的进化。

京东“三叉戟”出动,三步破局社会供应链数智化

如何让数智化供应链,成为实体经济的增长新动能,目前看来,京东分成了“三步走”。

第一步,在自身零售体系上搭建全球顶尖的物流供应链数智化体系,夯实基础。

京东本身就是实体经济数字化转型的典型,以供应链中十分基础的物流场景为例,京东集团副总裁、JDL京东物流智能供应链产业平台负责人王强在活动现场,分享了京东的最新科技成果:

规模应用的物流机器人军团,基于5G、物联网、人工智能、智能硬件等技术,可以通过机器人自动化、智能快递车、智能快递柜等,自动化分拣效率提升100%;布局全国的云仓储基地打造,天狼仓将传统仓储效率提升了3倍、坪效2.5倍,与同规模国际智能设备的数据相比,订单生产效率超出8%。京东集团2020年Q3财报显示,库存周转天数低至34天,JDL京东物流科技就成为背后智能应用链网络的核心支撑。

这些供应链关键环节的智能产品,能够简单直接有效地解答产业需求者的疑问:数智化供应链到底能为垂直行业带来哪些影响。

第二步,形成一体化智能供应链解决方案,开放给产业。打造一个技术驱动的数字化社会供应链,不仅需要技术,也需要社会,怎样降低全社会应用数智化技术的成本,京东选择用规模化效益来实现数智化的普惠,将17年来积累的全栈数智化技术、产品和服务体系,就在不断对外输出中淬炼成了多个平台型解决方案,把技术打包成开“箱”即用的商品,以增强产业端的快速适配。

比如JDL京东物流打造的物流科技产品“京慧”智能供应链,就基于智能化算法,为安利公司定制了商品布局、销量预测、智能补货、库存仿真等方案,让安利的成品物流费用节约10%以上,库存周转天数下降多达到40%以上,分销效率、运营效率提升一倍。用敏捷性供应链为行业在风浪中保驾护航。京东集团副总裁、JDL京东物流战略与创新业务部负责人傅兵认为,通过专业定制化供应链服务,不仅让“快消品”实现了“快消费”,更实现了“快送达”,从而,一个融合共赢的零售商业新生态就此形成。

第三步,与供应链领域、实体经济垂直行业深度融合。

技术集群在落地过程中可能遇到各种各样的复杂情况,比如仓储中就有可能遇到网络条件相对较差的环境,数据到云端的上传和处理时延会让客户很难受,这时洞察场景特点提供个性化技术方案、与场合深度融合的服务能力就非常重要了。

这时,京东多年服务B端的优势就充分体现出来。与各种不同类型的政企机构和产业带展开合作,在天津与雀巢联手打造了面积近3万平米的智能仓配中心,为某大型国际食品巨头打造了智能场站、数字车队、链上签等产品。此外,还联合地方政府制定区域农特产品质量管控体系,通过谷语系统实现品质溯源,帮助偏远贫困县打造高端品牌,实现增收。

正如京东集团副总裁、京东零售技术委员会负责人颜伟鹏所说,多年的全链路技术积累,让京东能够切实赋能业务,帮助业务快速上线,创造可量化的价值,真正将数智化成果可视化。同时通过可靠且高适配性的技术基座,让企业灵活应对快速变化的市场需求,最大程度地增加业务及商业模式的创新时间与空间。

极致科技、开放平台、极简融合,成为京东破解社会供应链数智化的“三叉戟”。

(京东集团技术委员会主席、京东智联云总裁、IEEE Fellow周伯文)

历史学家马克·莱文森(Marc Levinson)认为,疏通供应链可给世界带来超乎想象的好处。对于中国这个供应链最为复杂的经济区位之一,供应链转型的价值也是不可估量的。

大家都说中国是“唯一历史未曾中断而延续至今的文明古国”,这种文明的韧性,根基之一就来自于超大规模的多元复合结构,各个体系内部的自然、社会、经济相互依赖、多元共生,建立了深刻的有机联系。而供应链体系,也是这样一个相互塑造、彼此连接的规模体系,其转型升级难度,可想而知。

京东的努力,对于中国加速产业数字化转型、缩小与欧美国家数字化差距,扮演着非常重要的角色。

之所以能做到这一点,最核心的是“一力降十会”的技术优势,在JDD 2020,京东集团技术委员会主席、京东智联云总裁、IEEE Fellow周伯文博士也宣布成立京东探索研究院,关注人工智能、物联网、区块链、自主系统、下一代计算等核心方向,在未来的10年加大投入探索的领域,向人机共生、数字世界和物理世界互联互通的彼岸进发。

“生如逆旅,一苇以航”。2020年,数智化技术正在成为全球经济的最大变量,京东的供应链数智化告诉我们,中国科技企业手中所握着的武器,早已在时间缝隙中淬炼出了扭转时代的能量。

Verilog设计与逻辑综合实例解析(Memory)

Memory是芯片设计的重要组成部分。

Memory可以小到形成一个简单的寄存器。随着芯片面积的增大,芯片中的Memory越来越多。

本文讨论综合出设计中Memory的多维数组的含义和选择来自工艺厂商Memory的一些需要考虑的因素。

如何实现多维数组

Memory可以由综合工具直接根据数组结构综合出来。

以下是用于综合出小型存储器的实例 RTL代码。

module my_memory (datai,datao,clk,wr_n,addr) ;
       parameter width = 4   ;
       parameter log2_depth = 16 ;
       input [width-1 : 0] datai ,addr ;
       input clk ,wr_n,rd_n ;
       output [width-1 :0] datao ;
 
       reg [width-1 :0] memory [log2_depth -1 :0] ;
       reg [width -1 : 0 ] datao ;
        always@(posedge clk) begin
               if(wr_n == 1’b0)  memory[addr] <= datai ;
               else if(rd_n == 1’b0) datao <= memory[addr] ;  //Synchronous   read
    end
endmodule  //my_module

上述代码会综合出64个根据地址索引的触发器。

Verilog-2001引入了多维数组结构。上面的例子可以扩展到三个维度,即x,y和z,如下:

module my_memory(datai , datao , clk ,wr_n ,addr_x , addr_y ,addr_z) begin
       parameter width = 4 ;
       parameter log2_d = 4 ;
        input [width -1 : 0] datai , addr_x ,addr_y , addr_z ;
        input clk ,wr_n ,rd_n ;
    output [width -1 : 0] datao ;
    reg [width-1 :0] memory [log2_d -1 : 0 ]  //addr_x
                                          [log2_d -1 : 0 ]  //addr_y
                                        [log2_d -1 : 0 ] ; //addr_z
    reg [width-1 : 0] datao ;
    always@(posedge clk) begin
           if(wr_n == 1’b0 ) memory[addr_x][addr_y][addr_z] <= datai ;
            else if(rd_n == 1’b0) datao <= memory[addr_x][addr_y][addr_z] ;
    end
end

上面的多维数组最终会被合成x * y * z * width=4 * 4 * 4 * 4= 256个单独的触发器。

使用来自半导体供应商的硬核memory会有更好的时序,面积和功耗,因为它的逻辑是经过优化的,而不是使用离散逻辑。

但是,例化一个工艺相关的memory将使得该设计在不同工艺下不可重用。所以,我们应该在顶层用一个wrapper实例化设计和memory,而不是在设计中实例化memory。

实例化工艺相关的memory有哪些需要考虑的因素?

根据应用,memory的选择基于在以下性能参数上:
面积:如果该芯片,面积是主要关注点,那么就需要高密度的memory。通常而言,面积还取决于memory的工艺。

频率:如果速度是主要关注点,那么就需要高速的memory

功耗:这是低电压和低功耗应用的关键问题之一。此外,如果功耗变高,则整个系统的性能变得更低。它还增加了最终的封装成本。

还需要考虑memory的其他设计变量:

memory容量:例如,将memory指定为512Kbits。

**电压:**某些memory是针对特定电压范围而设计的。

**同步或异步:**指定memory是否具有同步读/写或异步读/写。使用哪一个主要取决于是否存在时钟和匹配设计的时序要求。

单端口或多端口:确定memory是否由单个或多个读/写端口访问。使用多端口memory的一个关键问题是多个端口正在尝试写入相同地址的memory会发生什么问题

**触发器或基于锁存器:**确定memory内的基本单元是否是基于触发器或者锁存器。

这种memory的重要考虑因素是可测试性功耗。基于触发器的设计比基于锁存器更容易测试。随着memory大小的增加,memory的可扫描性是重要的标准。许多供应商都提供了BIST逻辑,使memory可扫描。

本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/xZHE7iv1xZSgmfPHMLwdrA
未经作者同意,请勿转载!

推荐阅读
  • 数字IC验证系列之事务级建模
  • 数字IC验证系列之Driver&Sequencer
  • 数字IC验证系列之事务对象

想了解更多内容,欢迎关注芯片数字实验室专栏