next

【Vivado那些事】创建不包含源文件的IP

不打扰是莪最后的温柔 提交于 2021-01-12 23:02:48
有时候我们想参考官方的源码,但是有些I P 怎么也找不到官方的源码,具体原因是什么呢? 下面从下面两种Vivado创建IP的流程看下具体的原因: 所谓“数字积木”,就是 Vivado集 成 开发环境基于IP的 “积木块”设计思想。 VIvado中IP定制化流程如下: 来源UG 896 IP目录将来自下面的IP统一到一个环境中,这些IP包括XilinxIP、第三方IP和用户IP 。 基于 IP-XACT标准,VivadoIP封装器工具提供了独一无二的“重用”特性。IP封装器 为 Vivado的任何用户提供了一种能力,即将设计流程任意阶段的一个设计进行封装,然后 将该 IP作为一个系统级的IP进行使用。 创建不包含源文件的I P 上面建立的IP可以很方便操作一下看到源文件,实际使用过程中IP作为知识产权的成果,设计者并不希望公开IP 核的源代码 ,下面将带你建立一个不包含源文件的IP。 第一步:在操作系统下,执行菜单命令【开始】-【所有程序】-【 Xilinx Design Tools】 - 【Vivado2018】 点击 【Vivado2018】,启动Vivado集成开发环境。 第二步:在“ Vivado2018”主界面下,选择“Create New Project”选项,弹出“New Project-Createa New Vivado Project”对话框。 第三步:单击【

CDC的那些事:跨时钟域

时光毁灭记忆、已成空白 提交于 2021-01-12 18:09:11
一转眼,老李在数字芯片设计领域又摸爬滚打了四年。 跨时钟域设计 几乎是现代数字芯片设计中所有设计人员必须要掌握的基本知识,但是从老李自身的经历来说,这方面的知识 在本科和研究生的课程当中都没有讲过,却是面试中经常被考到的知识点 。同时工作中工程师也必不可少地要和 CDC 打交道,考虑如何进行跨时钟域设计,以及掌握 CDC 相关的 EDA 工具。以下文章我们就从跨时钟域设计的最基本开始讲起。 这里我们先复习一下 同步电路 和 异步电路 的概念。在现代 SoC 设计中,绝大多数的电路都是同步电路。同步电路是由时钟驱动存储元件的电路,也就是说存储元件的状态只在时钟沿到来的时候才能发生变化。因为组合逻辑电路在输入变化时输出可能出现毛刺 (glitch) ,而存储元件因为只会在时钟沿到来时才会更新状态,那么在时钟沿之间的时间状态是稳定的,这样的同步电路可以 消除组合电路中的毛刺 ,如下图所示。 相应的,时钟周期的大小取决于最长的传输延时 (propagation delay) 。同步电路的好处是时序很清晰,电路中的存储元件例如触发器都是依照一个固定的节拍来工作, 便于 EDA 工具来进行延时的分析和计算 ,所以同步电路几乎占据了当前数字芯片的绝大多数部分。 而异步电路就没有时钟的概念了,存储元件所存的状态跟随了输入信号的变化立刻发生变化。信号之间的传递通常通过握手 (handshake)

memcg lru lock 血泪史

穿精又带淫゛_ 提交于 2021-01-12 18:08:16
背景 自电子计算机诞生以来,内存性能一直是行业关心的重点。内存也随着摩尔定律,在大小和速度上一直增长。现在的阿里云服务器动辄单机接近TB的内存大小,加上数以百记的CPU数量也着实考验操作系统的资源管理能力。 作为世间最流行的操作系统Linux, 内核使用LRU, Last Recent Used 链表来管理全部用户使用的内存,用一组链表串联起一个个的内存页,并且使用lru lock来保护链表的完整性。 所有应用程序常用操作都会涉及到LRU链表操作,例如,新分配一个页,需要挂在inactive lru 链上, 2次访问同一个文件地址, 会导致这个页从inactive 链表升级到active 链表, 如果内存紧张, 页需要从active 链表降级到inactive 链表, 内存有压力时,页被回收导致被从inactive lru链表移除。不单大量的用户内存使用创建,回收关系到这个链表, 内核在内存大页拆分,页移动,memcg 移动,swapin/swapout, 都要把页移进移出lru 链表。 可以简单计算一下x86服务器上的链表大小:x86最常用的是4k内存页, 4GB 内存会分成1M个页, 如果按常用服务器256GB页来算, 会有超过6千万个页挂在内核lru 链表中。超大超长的内存链表和频繁的lru 操作造成了2个著名的内核内存锁竞争, zone lock, 和 lru lock.

C语言链表

随声附和 提交于 2021-01-12 18:06:24
c语言链表详解(超详细) 链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。 作为有强大功能的链表,对他的操作当然有许多,比如:链表的创建,修改,删除,插入,输出,排序,反序,清空链表的元素,求链表的长度等等。 初学链表,一般从单向链表开始 --->NULL head 这是一个空链表。 ---->[p1]---->[p2]...---->[pn]---->[NULL] head p1->next p2->next pn->next 有n个节点的链表。 创建链表 typedef struct student{ int score; struct student *next; } LinkList; 一般创建链表我们都用typedef

解决哈希冲突的三种方法

若如初见. 提交于 2021-01-12 09:10:08
一、拉链法 上篇博文我们举的例子,HashMap,HashSet其实都是采用的拉链法来解决哈希冲突的,就是在每个位桶实现的时候,我们采用链表(jdk1.8之后采用链表+红黑树)的数据结构来去存取发生哈希冲突的输入域的关键字(也就是被哈希函数映射到同一个位桶上的关键字)。首先来看使用拉链法解决哈希冲突的几个操作: ①插入操作:在发生哈希冲突的时候,我们输入域的关键字去映射到位桶(实际上是实现位桶的这个数据结构,链表或者红黑树)中去的时候,我们先检查带插入元素x是否出现在表中,很明显,这个查找所用的次数不会超过装载因子(n/m:n为输入域的关键字个数,m为位桶的数目),它是个常数,所以插入操作的最坏时间复杂度为O(1)的。 ②查询操作:和①一样,在发生哈希冲突的时候,我们去检索的时间复杂度不会超过装载因子,也就是检索数据的时间复杂度也是O(1)的 ③删除操作:如果在拉链法中我们想要使用链表这种数据结构来实现位桶,那么这个链表一定是双向链表,因为在删除一个元素x的时候,需要更改x的前驱元素的next指针的属性,把x从链表中删除。这个操作的时间复杂度也是O(1)的。 与开放定址法相比,拉链法有如下几个优点: ①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短; ②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

2.移植uboot-添加2440单板,并实现NOR、NAND启动

喜你入骨 提交于 2021-01-12 08:04:03
上章分析了 uboot启动流程 后,接下来便来配置新的单板,实现nor、nand启动 1.首先在uboot里新建单板2440 1.1 将2410的单板文件夹拷贝成 2440 : cd board/samsung/ cp smdk2410 smdk2440 -rf // 拷贝文件夹, 然后将smdk2440下的smdk2410.c改为 smdk2440.c ,以及修改更改好的Makefile 1.2 将2410的头文件拷贝成 2440 : cd ../../include/configs/ cp smdk2410.h smdk2440.h 2.新建后,还需要修改boards.cfg,使uboot支持2440单板: 仿照 smdk2410 arm arm920t - samsung s3c24x0 添加: smdk2440 arm arm920t - samsung s3c24x0 添加后,就能够使用 make smdk2440_config 命令. (该命令便会调用include/configs/smdk2440.h和board/samsung/smdk2440里的文件来配置uboot) 3.修改uboot系统时钟 在start.S里,uboot只设置了 CLKDIVN寄存器 而2440的系统时钟需要设置两个寄存器: MPLLDIVN (设置FCLK频率)、 CLKDIVN

一文学会动态规划解题技巧

▼魔方 西西 提交于 2021-01-12 07:52:25
前言 动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学,其实就像我们之前学 递归 那样,任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事,本文将会用比较浅显易懂地讲解来帮助大家掌握动态规划这一在工程中非常重要的思想,相信看完后,动态规划的解题套路一定能手到擒来(文章有点长,建议先收藏再看,看完后一定会对动态规划的认知上升到一个台阶!) 本文将会从以下角度来讲解动态规划: 什么是动态规划 动态规划从入门到进阶 再谈动态规划 什么是动态规划 以下是我综合了动态规划的特点给出的动态规划的定义: 动态规划是一种 多阶段决策 最优解模型,一般用来求最值问题,多数情况下它可以采用 自下而上 的递推方式来得出每个子问题的最优解(即最优子结构),进而自然而然地得出依赖子问题的原问题的最优解。 划重点: 多阶段决策 ,意味着问题可以分解成子问题,子子问题,。。。,也就是说问题可以拆分成多个子问题进行求解 最优子结构 ,在自下而上的递推过程中

ArrayList和LinkedList的区别

醉酒当歌 提交于 2021-01-12 07:02:59
ArrayList和LinkedList都实现了List接口,他们有以下的不同点: ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。 也可以参考ArrayList vs. LinkedList。 1) 因为 Array 是基于索引 (index) 的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array 获取数据的时间复杂度是 O(1), 但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。 2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况

杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)

空扰寡人 提交于 2021-01-12 04:23:22
Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your job is simple, for each task, you should output F n module 10 9 + 7 . Input The first line has only one integer T , indicates the number of tasks. Then, for the next T lines, each line consists of 6 integers, A , B , C , D , P , n . 1 ≤ T ≤ 20 0 ≤ A , B , C , D ≤ 10 9 1 ≤ P , n ≤ 10 9 Sample Input 2 3 3 2 1 3 5 3 2 2 2 1 4 Sample Output 36 24 题意:题目给出ABCDPn,第一项是A,第二项是B,然后还有个递推式,问第n项是多少 思路:如果我们按照他的递推式去推得答案的话,n的范围是1e9肯定会超时,但是我们又必须要用到这个式子,我们就想有没有加快的方法,其实做多了题会发现这是矩阵快速幂的形式 矩阵快速幂就是把你原有的递推式再加快执行, 但是 fn