精华内容
下载资源
问答
  • 用Powerpoint打开ppt文件出现提示:"PowerPoint无法显示文件中某些幻灯中的文字、图像或对象,“xx.ppt”解决办法

        今天用Powerpoint打开ppt文件出现提示:"PowerPoint无法显示文件中某些幻灯片中的文字、图像或对象,“xx.ppt”,因为他们已被损坏。演示文稿中受影响的幻灯片将被空白幻灯片替换,并且无法恢复丢失的信息。要确保该文件能够被以前版本的PowerPoint打开,请使用“文件”菜单中的“另存为”命令,使用相同名称或新名称保存该文件。" 
        打开N个PPT 都存在这样的问题,这个问题,重装了office 2003还是没解决问题,在互联网上查了一通,发现相似问题很多,但是都没有解决方法,因为ppt文件前几天都是好的,不可能大面积出现这样的问题,有些PPT在五一节前还在编辑的。
          这台机器这段时间一直都没有安装过什么软件,难道是补丁?我研究了一下,发现是4月27号,升级了一堆安全补丁,难道安装是由补丁引起的,就在控制面板的安装卸载程序中查找最近安装的有关的补丁,发现有个有个Security Update for PowerPoint 2003 (KB2464588),卸载了这个补丁,问题就得到解决。

          如果你的安装卸载程序面板中没有列出补丁,选择“显示更新“这个选择框,如果微软或360再提示你安装这个补丁将他列为不需要安装的补丁就好了。

    展开全文
  • 8000干货:那些很厉害的人是怎么构建知识体系的

    万次阅读 多人点赞 2019-09-29 11:18:27
    本文约8000,正常阅读需要15~20分钟。读完本文可以获得如下收益: 分辨知识知识体系的差别 理解如何用八大问发现知识的连接点; 掌握致用类知识体系的构建方法; 能够应用甜蜜区模型找到特定领域来构建知识体系...

    本文约8000字,正常阅读需要15~20分钟。读完本文可以获得如下收益:

    1. 分辨知识和知识体系的差别
    2. 理解如何用八大问发现知识的连接点;
    3. 掌握致用类知识体系的构建方法;
    4. 能够应用甜蜜区模型找到特定领域来构建知识体系。

    1. 知识体系?有必要吗?

    小张准备通过跑步锻炼身体,可因为之前听说过小腿变粗、膝盖受伤、猝死等等与跑步有关的意外状况,有点担心自己会掉进各种坑里,就在微信上问朋友圈一直晒跑步里程的朋友老安。

    小张问老安:“老安,我想跑步,有什么要注意的没?”

    老安回答:“注意跑姿就行了,要前脚掌先着地,不然容易损伤膝盖。”说完还给小张发了张片。

    小张大喜,心想,幸亏问了老安,不然膝盖就废了。

    第二天早上上班,小张碰见一个部门的黑子,想起来黑子前段时间说他参加了什么夜跑团,就问黑子:“黑子,听说你参加了夜跑团,跑步经验肯定很丰富了,我最近也想跑步,担心跑出问题,给点建议怎么样?”

    黑子说:“建议嘛,的确有一条啊,别轻信网络上各种文章说的什么脚后跟先着地容易损伤膝盖应该前脚掌先着地之类的话。你知道吗,我参加的夜跑团里,有很多经验丰富的跑者,他们说呀,80%的马拉松跑者跑步时都是后脚跟先着地。人家跑那么久那么远都没事儿,就说明,脚后跟先着地是正确的选择。”黑子说着,拿出手机,找了张图给小张看。

    小张边看图边说:“有道理,有道理,还是黑子专业。”可他心里面却犯嘀咕,怎么回事儿啊这是,老安和黑子,说的完全是相反的。

    小张决定找一位资深的跑者问问,想来想去,想到他的大学同学飞将军,他常年跑步,全马都跑了6次了,最近好像还开发了一门如何跑步的课程。于是中午吃饭时,他用微信发了条消息给飞将军:“飞将军啊,我最近有点想跑步,你是专业的,给我点建议,怎么跑比较好呢?”

    过了一会儿,飞将军发过来一条消息:“你先回答我几个问题:1)你是想跑马还是慢跑锻炼?2)你身高、体重、体脂率各是多少?3)体力如何?4)有没有心脏病、高血压、头晕等情况?5)有没膝关节受伤、腰椎间盘突出等情况?6)准备在哪里跑?塑胶跑道、跑步机、水泥马路还是别的?……”

    小张一看飞将军连珠炮式发出的12个问题,不禁叫了一声“天呐”。

    好啦,现在请你回答一个问题:老安、黑子和飞将军,这三个人,哪一位更专业?

    如果我没猜错,你的答案和我一样:飞将军更为专业。

    为什么呢?

    因为飞将军没有像老安和黑子那样直接给一个前脚掌先着地或脚后跟先着地的建议,而是先望闻问切,从各个方面了解小张的情况,然后才给出适合小张的建议。

    那为什么他能够做到这一点呢?

    因为飞将军在跑步这个领域,拥有丰富的知识,涵盖跑姿、配速、相关疾病、路面、心率等等,这些知识有机地结合在一起,形成了一套知识体系,能够从多个维度综合评估一个人该如何开始跑步、如何进阶。

    不仅仅跑步这个领域有知识体系,各个领域都有知识体系,我们生活中遇到的大部分问题,都可以找到一个围绕着它形成的知识体系。

    针对某个领域、某个问题的知识体系,对我们有非常多的好处,典型的有三类:

    1. 表达能力升级。这是因为构建知识体系的过程,会用到并培养成长思维、批判思维和系统思维,提升思考能力。当我们能够把一件事情的逻辑、层面、各个维度想明白,就能讲明白。
    2. 从零到一成为专家。知识体系是结构化的,知识点之间彼此关联,有无数回路,四通八达。这样的好处是,我们遇到一个问题,就会触发某个知识点,我们捕捉到这个知识点,就可以沿着知识体系的无数关联和回路,快速找到相关的其他知识的点,组合起来,形成针对所遇到问题的解决方案,就表现出专业水准,就当得起“领域专家”之称。
    3. 智慧影响待人接物。知识内化,形成体系,吐故纳新,不断进化,我们的智慧就会跟着升级,就能应用于实际生活。一方面知道的越多越能体会知识无涯越会虚心、包容,越能与他人和谐相处,另一方面体系越完善越能帮助自己和他人解决问题,促进彼此关系。

    举两个例子对比一下,我们马上能感受到拥有知识体系的好处。

    医生D1,接诊一位大腿中箭的士兵,马上想到:“中箭了就得赶紧拔出来才好。”于是他一顿操作猛如虎,拔掉了士兵屁大腿上的长箭。不料鲜血迸出,他赶紧找来一团棉花,一条线绳给士兵包扎上。然后拍拍手,告诉士兵,长箭已除,万事大吉。

    医生D2,也接诊了一位屁股中箭的士兵,他没有立即动手拔箭,而是先问了士兵中箭的详情、各个身体部位的感觉、以往的箭伤治疗史等等情况,然后准备了清洗、消炎、包扎要用的各种物品,接下来消炎、拔箭、敷药、包扎,最后又叮嘱了饮食禁忌、日常护理、活动建议、复诊、常见并发症和应对策略等等事情,才结束治疗。结果这位士兵很快痊愈了。

    D1缺乏诊治箭伤的知识体系,脑中只有几点零散的知识,只会头痛医头脚痛医脚,想不到感染、发烧、饮食禁忌等事情,结果他的病人回去后,伤口感染、化脓,引起各种并发症,后来救治无效,含恨离世。

    反观D2,因为有知识体系,能够系统的、多维度的、多环节的考虑各种问题,妥善制定箭伤医治策略,他的病人得到了很好的诊治,很快就痊愈了。

    医疗领域的知识体系,可以治病救人,效用立竿见影。其他领域的知识体系,在处理该领域相关的问题时,也有类似的效果。我们的工作和生活中,就能找到很多例子,你不妨回想一下自己过去的经历,找一件事能够说明知识体系作用的事情出来,这样能加深我们对知识体系重要性的理解。

    2. 善用八大问发现知识的连接点

    从跑步和治病这几个例子中,我们可以看到,知识点是一个一个的,散乱的,比如“跑步时前脚掌先着地不伤膝盖”、“中箭后要赶快把箭拔出来”,就像我们小时候玩的木质积木。

    而知识体系是某个人结合自己的问题和实践形成的知识集合,知识点之间彼此以形式多样的方式关联,形成了特定的结构。比如飞将军关于跑步的知识体系,就是由跑姿、配速、跑量、心率、常见相关病症、跑鞋、路况、饮食等知识点相互链接而成。这样的知识体系,像我们乐高积木搭起来的建筑物。


    那么,现在有一个问题:用我们前面图片中的木质积木,可以搭建出上面的积木房子吗?

    估计我们的答案是一样的:不能。这也是为什么传统的木质积木无法风靡的关键原因——很难搭建出有稳固的、有创造性的东西,不耐玩。

    那为什么乐高积木就能够搭建出种类繁多、形式各异的“建筑物”呢?

    请大家看一下乐高积木的积木块:


    发现它们和传统积木块的不同了吗

    对,它们上面有很多凸起的圆点点!这些圆点点非常关键,它们可以嵌入其他积木块预留的凹槽,把两个积木块连接起来。

    也就是说,乐高积木块上有连接点,所以可以彼此连接,拼搭出各种具有稳定结构的“建筑物”!

    把知识比作积木块,如果知识上生出连接点,就也可以彼此连接,构建出适用于特定领域和特定问题的知识体系

    那么问题来了:知识有连接点吗?

    答案是肯定的,因为在各个领域都存在知识体系,知识体系是由若干知识榫合而成,知识要彼此榫合,就一定有连接点。

    知识本身就有连接点,而我们无法利用这些连接点构建出知识体系,往往是因为:我们没有发现连接点。就是说,连接点原本就存在,只是我们没看到。

    进一步说,只要有办法找到并标注出知识的连接点,散乱的知识就可能彼此连接成一个体系。

    那么问题来了:如何找到知识的连接点呢?

    拆书帮的创始人赵周老师,在讲如何将移动时代手机阅读到的信息转化为知识时,总结了一个结构化的方法,叫“八大问”。我们可以借助“八大问”,来分析信息、观点、事件、经历等,从中整理出知识和连接点。

    我们先介绍八大问,然后来看怎么使用它来挖掘知识的连接点。

    八大问是一个提问的框架,将针对信息、观点、事件、经历等的提问,分为“前、因、后、果,适、用、边、界”八类。

    这八类问题,可用来分析或整理信息,把信息变成知识,并找到知识的连接点。八大问又可以分为两组,前因后果和适用边界,前因后果用于分析信息,适用边界用于整理信息。

    为方便记忆,赵周老师找了八个成语帮助我们,前对应前车可鉴,因对应相因相生,后对应以观后效,果对应自食其果,适对应适得其反,用对应使用条件,边对应旁敲边鼓,界对应楚河汉界。

    赵周老师针对每一大问,都提供了几个典型问题,帮助我们理解和使用这一问。具体来讲,是这样的:

    • 前(前车可鉴):1)为什么这件事对我重要?2)他是怎么引出这个信息的?
    • 因(相因相生):1)作者提出了哪些关于原因的假设?2)怎么验证或排除这些假设?3)还有其他可能性吗?
    • 后(以观后效):1)若已从信息去做之后会怎样?2)对我的好处(效用)是什么?
    • 果(自食其果):1)不这么做的后果是什么?2)不改变的问题有多严重?
    • 适(适得其反):1)有没有相反的观点?2)有没有不支持这个的实例?
    • 用(使用条件):1)要这样做,需要具备哪些条件(考虑成本收益、态度、能力……)?2)这件事可以用什么其他方式来完成?
    • 边(旁敲边鼓):1)从前有没有类似的(或乍看起来差不多的)信息?2)其他领域/行业/人如何解决类似问题?
    • 界(楚河汉界):1)无论是相反的还是类似的信息,和这个信息的真正区别是什么?交界在哪里?

    在使用八大问时,不一定要原模原样的问赵周老师给出的示范问题,可以在理解这八类问题的前提下,针对具体情境,提出适合的问题。也就说,八大问最重要的是提供了一种提出有洞察力的问题的框架,这是它的意义所在,如果你有能力,可以领会心法,保持心法不变,提出新的问题,如果一开始不知道怎么用,则建议直接使用示范问题或在其基础上做变化。

    现在,我们举个例子,演示一下八大问的用法。

    小薇热情、活泼、健谈、点子多、标新立异、夸张、情绪波动大,她从事保险销售,业绩很好,领导安排她开发一个内部课程,给大家讲讲如何发展客户、维系客户。小薇答应两天搞定讲义,然后给大家讲。她动作很快,马上就开始写PPT,可总是被各种事务打断,一会儿有客户打电话,一会儿微信上有人咨询,一会儿又要出去见客户签合同,一会儿有同事请教,结果一个星期过去了,PPT只有一页标题。

    领导问小薇了两次次,什么时候可以讲,小薇都说太忙了,PPT才刚开了个头,一直没找出时间做。第三次的时候,领导皱着眉头给了小薇一个建议:“小薇啊,你时间管理能力还有很大提升空间啊,建议你好好学习下史蒂芬·柯维的时间管理四象限,把手头上的事情理一理。”小薇连忙称是,开始学习时间管理四象限。

    熟悉这个场景吗?你我的时间管理学习之路,基本上都是这么开始的。

    这种模式,其实也是我们切入一个新领域时的模式:遇到一个问题,要解决,就要用到新的知识、新的技能,开始学习之路,慢慢在实践中积累这个领域的知识。

    但是,我们积累的知识,能否形成体系,却依赖于我们能否做到“发现知识的连接点、主动链接不同的知识”。

    不管以前我们做得怎样,现在我们可以使用八大问来加速这个过程。

    让我们再次聚焦小薇的问题,看看怎样应用八大问来发现知识的连接点。现在,小薇知道了一个时间管理的方法,叫作“时间管理四象限”。

    先问“前”,这里小薇可以问“为什么掌握时间管理四象限对我很重要?”,答案可能是“做好时间管理,能帮助我合理安排任务,找到完成讲义开发的时间。”所以,学习时间管理四象限是有必要的。

    再问“因”,领导让小薇学习时间管理四象限,他提出了什么关于原因的假设呢?答案是“小薇时间管理能力欠缺,不能合理安排各种事务。”领导认为小薇只要管理好时间,就能抽出时间来完成PPT。这个假设正确吗?这是小薇没能在两天内完成讲义的唯一的原因吗?不一定哦,小薇没有完成PPT,除了时间管理的缘故,还有一个很重要的原因,是她内心不觉得“开发课程传授经验”这件事有多么重要,在她看来,最重要的事情是搞定客户赢得保单。

    接下来问“后”,小薇可以问“学习时间管理四象限对我的好处是什么?”她对照着时间管理四象限图,翻看《高效能人士的七个习惯》,很快想到了好处:聚焦要事,从容工作,提高工作质量和产出。简单讲,要事第一,提高工作效能。

    然后问“果”,直接用赵周老师的示范问题,“不这么做的后果是什么?”后果很明显,课程的交付时间会一再拖延,领导会认为小薇不重视自己的工作安排,甚至会怀疑小薇别有用心,进而影响小薇后续的工作开展,甚至影响升职加薪。所以从这个角度看,小薇需要尊重领导的工作安排,尽快搞定这项任务,所以她还是有必要学习时间管理。这样分析,小薇发现了一个点,某些工作任务的重要性,取决于领导的看法,所以她还应该学习目标管理、向上管理。

    再接下来问“适”,小薇问了自己这个问题“有没有人学了时间管理四象限却还是安排不好工作?”她马上想到同事小兰,曾经学习过时间管理四象限,可现在依然是每天忙东忙西丢东忘西经常出状况。

    然后问“用”,小薇可以这样问:“使用时间管理四象限的前提条件是什么?”经过研究,小薇发现,史蒂芬·柯维是一名企业管理者,同时也是为企业负责人提供咨询的人,他提出的时间管理矩阵,更多是针对管理者的,因为管理者有更多的掌控感和自由度,能够决定某件事情是否重要,进而根据紧急性来判断是立即做还是规划时间做。而像她和小兰,都在执行层面,多数时候无法决定一件事情的重要性,而不能判别重要性,就难以应用时间管理四象限。这也是小兰学了时间管理四象限依然工作忙乱的一个原因,同时也是她的领导觉得时间管理四象限管用的原因。这样一想,小薇知道了使用时间管理四象限的两个前提条件:1)个人具有分辨事情重要性的能力;2)个人对事情具有一定的掌控性和自由度。

    接下来问“边”,小薇先问自己“有没有与时间管理四象限类似的时间管理方法?”小薇一搜索,发现时间管理方法很多,GTD(衣柜整理法)、番茄工作法、三只青蛙、日历、猴子法则、Unbroken Time、思维导图、黄金工作时间……全都和时间管理有关。她一一搜集相关信息,进一步了解这些时间管理方法。接下来她又想到,管理时间其实是为了管理工作任务,那关于任务管理,有哪些方法呢?她一搜索,发现了看板、思维导图、80/20法则、清单、OKR、SMART法则等。

    最后问“界”的问题,“时间管理四象限的适用情况是什么?”小薇觉得,时间管理四象限,更适合这两类人:1)管理者;2)可以在一定范围内自我安排工作任务和时间的人。

    经过一轮八大问,小薇对时间管理四象限的认识更深入了,管理者、任务管理、时间管理、重要性、向上管理、要事第一、工作效能、工作自主度、规划……这些关键词留在了她的记忆中,成了可以与其他知识链接的连接点。

    八大问的目的,正是帮助我们从不同角度、维度来分析和整理信息,加深我们对知识的理解、认识,进而帮助我们为知识建立各个层面、各种角度的连接点,有了这些连接点,知识点彼此之间更容易产生关系,知识也更容易被外界问题刺激、唤醒。

    3. 如何构建知识体系

    一旦我们标注出知识的连接点,就可以把具备可连接性的两个知识经由连接点链接在一起,围绕着不同知识的不同类型的连接点,持续地、反复地执行这个操作,就可以慢慢形成知识体系。

    我们以小薇为例来说明这个过程。

    前面我们通过八大问中的“界(楚河汉界)”这一问,找到了“时间管理四象限”这个知识的一个连接点——管理者,即时间管理四象尤其适用于职场中的管理者。

    假如小薇在检索时间管理方法时,搜到了“猴子法则”,买了一本书叫作《别让猴子跳回背上》,学习了一下,运用八大问做了分析,画出了猴子法则和它的连接点,如下图所示:

    对比时间管理四象限的连接点和猴子法则的连接点,可以发现,通过“管理者”这个连接点,就可以把两者链接起来。

    假设小薇要考取中国寿险理财规划师,需要持续的看书学习,可她看书时总是分神,无法专注,于是就向一位特别爱看书的朋友请教如何才能专注看书,朋友告诉她使用“番茄工作法”,她了解了一下,发现番茄工作法是弗朗西斯科·西里洛上大学时为了专心学习发明的方法,特别适合看书学习这类伏案工作,她接着用八大问分析,画出了番茄工作法的连接点,如下图所示:

    番茄工作法属于时间管理领域的方法,那它就可以通过“时间管理”这个连接点,和时间管理四象限链接起来。

    随着小薇不断践行时间管理,了解到越来越多的方法,于是她就慢慢形成了时间管理方面的知识体系:

    现在可以看到知识体系的完整构建过程了:我们基于一个场景(问题),找到一个知识,运用八大问分析,挖掘各式各样的连接点,在持续实践中接触新的知识,反思回顾,把新知和旧知经由含义相近的连接点链接起来,形成体系。

    这个过程用文字来描述,只需要几百个字,阅读只需两三分钟,于是你可能会想,构建知识体系原来这么简单这么快呀,我很快就能搭建出自己的知识体系。实际上并非如此,知识体系的形成,是在生活实践中,不断解决问题,不断反思经验,不断发现连接点,不断链接知识,慢慢完成的,决不是一朝一夕之功。

    比如小薇从时间管理四象限链接到猴子法则,只有在她当了管理者,深受下属抛给她的猴子之苦时,才可能真正用到猴子法则,才能真正完成链接。这个过程,时机不成熟,就不会发生,所以看似简单的一个链接,分分钟的事情,实际上可能需要一年、两年,甚至三五年。

    经过实践和时间的考验,我们构建出了某个领域的知识体系,是不是万事大吉了呢?

    非也!

    我们还需要不断更新迭代自己在某个领域的知识体系,因为时代在发展,环境日新月异,问题层出不穷,用于解决问题的知识也会因之而快速演变。

    比如老韩是PPT设计师,对PPT 2016非常熟悉,各种功能了然于心,可2019年初Office 2019发布后,他就需要更新自己围绕着PPT 2016构建出来的知识体系,如果不这么做,遇到客户提出的特定于PPT 2019的问题,就没办法解决。

    比如小卢是增粉达人,原来微博微信的各种增粉策略、方法、实践,了然于胸,专门为各类自媒体团队提供增粉服务,现在短视频大火,抖音崛起,迅速成为国民级应用,那小胡就需要迅速学习基于抖音平台的增粉策略,包括抖音的推荐规则、封杀原则、内容分布、流量特点、视频结构等等,只有这样,他才能继续我他的客户提供有价值的服务。

    幸运的是,不管环境如何演变,只要我们掌握构建知识体系的方法,挖掘出新知识的连接点,就可以将新知识纳入既有知识体系,继而知识体系就可以获得更新,我们就能借助既有知识体系的势能,在新的领域打开局面。

    4. 在哪个领域建立自己的知识体系

    前面我们着重介绍了八大问发现知识的连接点、用连接点链接不同知识构建知识体系,并反复强调,拥有知识体系,可以专业、系统、全面、多维度的看待问题,创造难以复制的价值。

    现在,有的小伙伴心头可能会升起一个问号——“既然知识体系如此重要,那我是不是要在生活中的每个领域都构建出知识体系呢?”

    非也非也!

    我们不可能在每个领域都搭建一套知识体系——我们没那么多时间和精力。同时,也没那个必要。

    请想象如下场景:你发烧了三天,不见好转,头疼、浑身无力、骨肉疼痛,无法工作。

    你会怎么办?

    去研究关于发烧的各种知识、构建出发烧的知识体系,然后把自己治好,还是说,去医院,花钱让医生帮忙看病?

    你选的是去医院看病,对吧,很明智的选择。这也是我们面对多数领域问题的最佳选择——付费请目标领域的专业人士帮助解决。

    多数领域的问题,都可以外包给他人来解决,我们不用费尽心力在各方面都成为拥有强大知识体系的专家。

    我们要做的,是找到自己的根据地,发展出自己的知识体系,用自己的知识体系创造价值,交换其他领域的专业服务。

    那么,问题来了,怎么确定想要建立知识体系的领域呢?

    下面三个问题,提供了一个定位框架:

    1. 我擅长什么?
    2. 我爱好什么?
    3. 这个世界需要什么?

    这三个问题对应答案的交集,就是我们构建知识体系的甜蜜区:

    请反复探寻,找到自己的甜蜜区,锚定它,投入时间和精力,在实践中将各种知识融会贯通,构建出知识体系。

    最后,问个问题:现在的你,拥有(或打算构建)哪个领域的知识体系?欢迎留言和我分享_


    新上线了一门视频课程——程序员面试宝典,金九银十招聘季,想找工作的你,可以来看看!程序员面试宝典

    展开全文
  • 芯片的设计流程成本

    万次阅读 多人点赞 2019-06-08 21:32:27
    每天都在用,但你知道芯片的设计流程成本吗? 2017-05-10 06:10 来源:半导行业观察 芯片,是无数设计工程师们烧死很多脑细胞后产生的作品,完全可以称得上是当代的艺术品。无论是电工们,还是科技小白,...

    每天都在用,但你知道芯片的设计流程和流片成本吗? 

    2017-05-10 06:10

    来源:半导行业观察

    芯片,是无数设计工程师们烧死很多脑细胞后产生的作品,完全可以称得上是当代的艺术品。无论是电工们,还是科技小白,甚至是大妈们,离开了芯片,生活都无法继续(是不是说得太严重了)。

    集成电路是怎么来得呢,当然是设计出来的呗,这不是废话吗?但是,你知道具体的设计流程吗?下面,就请目不转睛地跟着我们来了解集成电路的完整设计制造流程。

    常见的集成电路分为数字、模拟和数模混合三大类,我们分头来说。

    数字集成电路设计

    数字集成电路设计多采用自顶向下设计方式,首先是系统的行为级设计,确定芯片的功能、性能,允许的芯片面积和成本等。然后是进行结构设计,根据芯片的特点,将其划分成接口清晰、相互关系明确的、功能相对独立的子模块。接着进行逻辑设计,这一步尽量采用规则结构来实现,或者利用已经验证过的逻辑单元。接下来是电路级设计,得到可靠的电路图。最后就是将电路图转换成版图。

    • 1 系统功能描述

    • 2 逻辑设计

    逻辑设计是将系统功能结构化。通常以文本、原理图、逻辑图表示设计结果,有时也采用布尔表达式来表示设计结果。依据设计规范完成模块寄存器传输级代码编写,并保证代码的可综合、清晰简洁、可读性,有时还要考虑模块的复用性。

    随后进行功能仿真和FPGA 验证,反复调试得到可靠的源代码。其中,还要对逻辑设计的RTL 级电路设计进行性能及功能分析,主要包括代码风格、代码覆盖率、性能、可测性和功耗评估等。

    • 3 电路设计

    电路设计大体分为逻辑实现、版图前验证和版图前数据交付三个阶段。逻辑实现将逻辑设计表达式转换成电路实现,即用芯片制造商提供的标准电路单元加上时间约束等条件,使用尽可能少的元件和连线完成从RTL描述到综合库单元之间的映射,得到一个在面积和时序上满足需求的门级网表。

    时钟树插入也将在逻辑实现中完成,插入时钟树后,再进行逻辑综合、功耗优化和扫描链插入后得到门级网表,并通过延迟计算得到相关标准延时格式(SDF)文件。版图前验证利用逻辑实现得到的相关门级网表和SDF文件,进行门级逻辑仿真和测试综合,包括静态时序仿真、动态仿真、功耗分析、自动测试图形生成等,经过版图前验证得到的电路设计门级网表必须要满足一定的时序/功耗约束要求。

    • 4 物理设计

    • 5 设计验证

    在版图设计完成之后,非常重要的一步工作就是版图验证。版图验证保证了芯片依照其设计功能准确无误地实现,主要包括设计规则检查(DRC)、电路版图对照检查(LVS)、版图的电路提取(NE)、电学规则检查(ERC)和寄生参数提取(PE)。

    模拟集成电路设计

    • 1 数字时代下的模拟电路

    • 2 模拟集成电路设计流程

    完成一个模拟集成电路的设计,需要多个步骤,具体包括:①规格定义;②电路结构选择以及工艺确定;③具体电路设计;④电路仿真;⑤版图设计;⑥版图验证;⑦后仿真。

    ① 规格定义

    通常,电路设计的规格定义始于一份清晰的问题报告书。在提出设计问题之前就应当对所要研究和设计对象的需求有一个全面、清晰的了解。这种需求可能表现在性能上,也可能仅仅出于成本的考虑。

    不管出于哪一方面的考虑,设计需求最终都会转化成为具体、直观的数量指标。例如,增益需要达到90dB,带宽要求100MHz以上,以及输入/输出阻抗大小等。所有这些指标必须在规格定义中有所体现,以便形成具体的设计目标,并方便设计结果的检验。

    ② 电路结构选择和工艺确定

    一般都会在设计阶段的初期完成工艺的选择。选择可能会基于成本、性能指标的要求,或者代工厂的产能、上市时间等。很多时候,实际上可供选择的工艺实现并不会太多。

    即使基于给定的流程,还存在很多与工艺相关的问题需要在后续的设计过程中慎重考虑。DAPs(Dependent On Absolute Parameters)、TAPs(Tolerent On Absolute Parameters)以及STMs(Sensitive To Mismatches)都会严重困扰模拟电路设计者。例如,DAPs 无法通过电路设计技巧来完全消除,但在某些特殊情形之下却可以大大减小。

    当面临工艺选择和电路结构选择时,为增强设计的鲁棒性,可以遵循以下设计原则:追求较理想的TAPs 时,应当尽可能采用器件绝对数值的比值而尽量避免直接使用绝对值;可以进行敏感性分析并采用对工艺变动不敏感的结构实现设计,从而抑制DAPs;对于STMs,可以通过精心的版图设计予以排除。

    模拟集成电路工艺

    模拟集成电路工艺主要有三种:标准的双极型晶体管(Bipolar Transistor)、多晶硅栅CMOS 和双极型CMOS(BiCMOS)工艺。

    表1 给出了IC 不同工艺的对照,用户可以根据电路的用途,从成本和功能方面综合考虑,以选择合适的工艺。

    三种主流IC 工艺的对照工艺 性能参数

    ③ 电路设计

    在整个模拟集成电路设计流程中,电路设计可以说是最具创造性的环节,是为解决特定问题而构思一个电路的创造过程,也是用具体电路元件实现规格定义的过程。它要求具有对实际系统进行建模的能力,所建立的模型既要足够简单,以便可以观察到系统的运行情况,进而思考改进系统性能的方法;又要足够全面,以充分体现系统的突出特征。最终,需要电路设计人员能够从要求的特性出发,找出满足这些特性的电路结构。

    另外,电路设计还要求设计人员以不同的方式进行分析。设计者不仅要找到问题所在,而且要明白如何修改系统,或者如何选择元件参数来得到期望的结果。这就是设计者需要完成的工作,至少是其中的一部分。相比于简单的电路结构选择,这一步骤会复杂得多,因为会涉及每一个电路元件具体的参数选择。

    ④ 电路仿真

    当电路设计人员手工计算得出元件参数后,还需要依靠EDA 工具进行仿真验证。这是因为手工计算使用的模型采用了很多近似,同时忽略掉很多高阶效应,所以缺乏工业生产所必要的精度。

    模拟电路仿真使用的EDA 软件通常有Spectre、Hspice、Pspice、ELDO、Nanosim及Hsim 等。这些工具的核心基本都是基于SPICE。SPICE 通过描述一些模型,并由代工厂提供参数值进行仿真,以达到模拟真实情况的效果,并依次进行电路参数或电路结构调整。

    通常,在这些商用仿真工具之间分出高低是相当困难的。这取决于所要仿真的电路的性质、所购买的其他工具的接口、代工厂所能提供的模型,还取决于设计的预算是否充足。所以,一般需要依据设计电路的规模、需要的仿真精度以及仿真速度进行综合考虑。

    ⑤ 版图设计

    仅仅完成基于库模型的电路仿真是不完整的,因为设计最终需要在硅片上以围观结构的互联得以实现。版图设计就是按照一定的设计规则,将电路仿真阶段得到验证的结构用物理层次的几何图形表达出来。

    对于一个设计,及时电路图级的功能和指标都完全正确,但如果版图设计不正确,也会导致产品的失败。特别是当今集成电路芯片功能日趋复杂、特征尺寸不断缩小的情况下,版图设计更加显得重要,很多时候一个成功的设计就断送在不合适的版图设计之上。

    集成电路的版图定义为制造集成电路时所用的掩膜板上几何图形的集合,这是因为集成电路由多层组成,每一层均通过光刻工艺由光掩膜板加以确定。常见的几何图形包括N 阱、有源区、多晶硅、P+注入、N+注入、接触孔以及金属互连线等。

    ⑥ 版图验证

    版图设计完成后需要进行版图验证。版图验证的任务是检查版图中可能存在的错误。随着集成电路的高度集成化和复杂化,对版图进行验证是必不可少的。版图验证基本上还是依据一定的设计规则对完成的版图进行检查,这个规则可以是代工厂提高的设计规则文件,也可能是设计上的电气要求,如短路、开路检查。

    版图设计的错误可以分成两类。第一类是违反几何设计规则的错误。在集成电路掩膜制造过程中由于制造设备分辨能力的限制,要求版图的几何图形必须满足一定的尺寸要求。

    为此对每条工艺线都会制定相应的几何设计规则,如果违反这些规则,就会导致芯片无法实现预期功能或成品率下降。相应的检查工具称为设计规则检查(DRC)工具。第二类是版图与原理图一致性比较的错误,如短路、开路、悬空端和孤立节点等。检查此类错误的工具称为LVS 工具。

    在版图验证工具中有时会提到电气规则检查(ERC),一般来讲,ERC 并不是一个单独的工具,它往往嵌套在LVS 工具中。对芯片级别的版图验证时,有时候还需要完成天线效应、闩锁效应或是金属密度的检查。只有确认所有的检查都完全正确,才可以认定设计的有效性。

    ⑦ 后仿真

    值得注意的是,这个阶段虽然强调了电路性能的实现,但由于此时并没有考虑芯片具体实现的细节,所以需要在版图设计完成之后加入寄生参数进行验证。这个过程就称为“后仿真”,主要相对于版图设计之前的电路仿真而言。

    版图设计完成之后,就可以抽取寄生参数——主要是器件互连线引入的寄生电阻和电容。抽取可以采用分布参数模型,也可以采用集总模型,或者两者兼顾,具体选择取决于电路设计的要求。一旦完成参数抽取,就可以把结果反标回原电路的相应节点并形成新的网表文件,然后进行后仿真。

    一般来说,这时候得到的结果会与电路仿真阶段有所差别,如果需要改进,就得返回到版图设计阶段。每次修改后的设计都需要重复版图验证检查,确认无误后再进行后仿真。最终,经后仿真确认的设计就转换成代工厂生产线可以识别的GDSII 文件格式。

    数模混合集成电路设计

    混合信号集成电路设计对数字电路和模拟电路做整体上的考虑以及验证,这将面临许多挑战和困难。

    传统的混合信号集成电路设计是采用有底向上的方法,用SPICE 等电路仿真器对混合电路中的模拟元件进行设计,用数字电路仿真器对数字电路部分进行仿真。然后通过手工建立网表,对数字和模拟电路的协同工作进行设计验证。

    然而,模拟电路和数字电路之间协同工作的验证比较困难,因此用这种传统设计方法仿真和验证整个混合电路系统既费时,又不精确,特别对于复杂度越来越大的系统而言,这种缺陷更显突出。

    随着EDA 技术的飞速发展,混合信号集成电路设计推进到了自顶向下的设计流程。该流程同数字系统自顶向下的流程相似,但与纯数字系统的结构有所不同,这是因为混合系统模拟部分仍然需要自底向上的设计,需要更多的时间和丰富的知识与经验。因此,研究如何采用通用的设计方法和共有的约束与资源来建立混合系统,是十分有价值的。

    混合信号集成电路的基本设计流程主要包括设计规划、系统级设计、模拟电路/数字电路划分、电路级设计与仿真、版图级设计与仿真等。

    • 1、设计规划

    研究和开发混合信号集成电路首先应从市场需求出发,选定一个研究开发的目标,然后确定混合信号集成电路的系统定义、系统指标,在此基础上开发和选择合适的算法。

    • 2、系统建模

    当算法确定后,将其映射成特定的结构,以利于线路设计及对各模块进行整体验证。此时,混合信号集成电路的系统功能行为与非功能约束都要被详细说明。另外考虑到电路的混合特性,电路必须要以不同类型的方式来规范,使用连续时变和离散时变的方式来处理,可以采用方框图结构形式将其分开。目前设计者常采用Matlab、C语言、SystemC、SPW 等软件进行系统设计。Matlab在算法工程师中应用极广,作为DSP算法的首选开发工具,它拥有很大的用户群。SystemC是一种专为集成电路系统设计而开发的语言,SPW是应用最广的系统级设计工具,在通信、视频等领域应用很多。

    • 3、数字电路/模拟电路划分

    在这个阶段,需要根据电路的功能将模拟电路和数字电路划分开来。数字电路用来处理离散的信号,模拟电路则处理连续的信号。

    • 4、电路级设计与仿真

    电路可以通过具体的元器件,例如,运算放大器、晶体管、电容器、逻辑门等来表征。混合信号集成电路包括数字和模拟两部分,其中模拟电路一般全定制设计,采用自底向上的设计流程,进行全定制版图设计、验证、仿真;数字电路一般采用自顶向下的设计流程,进行寄存器传输级描述、寄存器传输级仿真、测试、综合、门级仿真。然后,将两种电路放在混合信号验证平台中进行混合仿真。

    这种混合仿真可以是寄存器传输级的数字电路与晶体管级的模拟电路的混合仿真,也可以是门级或晶体管级的数字电路与模拟电路的混合仿真。目前设计者主要采用由Mentor Graphics、Synopsys 和Cadence 三大EDA 工具供应商提供的模拟和混合信号工具和技术进行混合仿真。

    • 5、版图级设计与后仿真

    在这两个阶段,将整合后的电路级设计,结合相关物理实现工艺,进行对相关模拟电路和数字电路的版图设计、设计规则检查、版图验证、寄生参数提取等工作。之后通过相关的混合信号验证平台对整个系统进行混合信号电路的后仿真。

    • 6、流片

    在后仿真完成后,就可以将几何数据标准(GDSII)格式的文件送到制板厂做掩膜板,制作完成后便可上流水线流片。

    芯片制造流片一张多少钱?

    不同的流片渠道、流片规模、流片者的身份,即使是在同一家Foundry厂的同一种制程下,流片价格都可能有很大的不同。

    一般来说代工厂对不同的design house会有不同的报价。

    报价的方式往往跟所用到的板数相关。每张板多少钱这样。

    打个比方,现在有产品用了25张mask,每张mask25美元,那么一张八寸wfr就是625美元。

    至于每张mask到底多少钱,一来看跟fab的关系怎样。二来,看你这个产品有多大的量。

    另外,芯片流片费用一般不按颗数计价,现在流片主要分为全晶圆和MPW两种方式。 MPW是现在很流行的一种tapout方法,主要是按晶圆面积来均分价格。 如果是整个wafer的话,成本主要是wafer费用,当然这些就跟wafer大小,制程,mask layer,哪家foundry有关了

    所以还是从foundry了解wafer的费用。

    一片wafer的芯片数的计算江湖上传说是两种方法,可以互相借鉴。

    • 1. 一片wafer上die数量的估算方法

    die数量=π(R-X-Y)2 /(X*Y) (1)

    R 为wafer的半径。

    X,Y 是MASK(左下角在原点)的右上角坐标,X,Y尺寸包括划片槽,缓冲区等尺寸

    π 3.14

    注:上式中的2是2次平方

    2.

    R:圆片半径;

    a:管芯边长;

    b:管芯边长;

    有效管芯数=3.14*(R-0.7a)*(R-0.7b)/(a*b)

    此估算方法较为准确,在“集成电路应用”杂志2002年5月期上有详细说明,可参阅。

    用CIC(國研院晶片中心)最新的公开价目表供大家参考:

    有tsmc,UMC(联电)的,业界和学界的价格也有一些区别。

    应该是可以做(或者就是)多项目晶圆(Multi Project Wafer,简称MPW)

    比如透过CIC的这个管道(应该是只针对台湾的业界、学界,可能是已有优惠了的,CIC设立的初衷就是为台湾的IC产业提供良好的服务和保障),T家28nm,小面积下是大约23.5万软妹币每平方毫米;45nm大约是12万人民币每平方毫米(CIC公开报价)。拿起尺子看一看1毫米是种什么样的存在,会很震撼的。

    (具体的报价单有官方的公开资料可以查询,这里就不放了。)

    当然,这只是CIC的一种渠道,学界研究或教学还有很多别的渠道或优惠

    展开全文
  • 52.java编程思想——创建窗口程序 程序限制 出于安全缘故,程序十分受到限制,并且有很多的事我们都不能做。您一般会问:程序看起来能做什么,传闻它又能做什么:扩展浏览器中WEB 页的功能。自从作为一个...

    52.java编程思想——创建窗口和程序片 程序片限制

    出于安全缘故,程序片十分受到限制,并且有很多的事我们都不能做。您一般会问:程序片看起来能做什么,传闻它又能做什么:扩展浏览器中WEB 页的功能。自从作为一个网上冲浪者,我们从未真正想了解是否一个WEB 页来自友好的或者不友好的站点,我们想要一些可以安全地行动的代码。所以我们可能会注意到大量的限制:

    (1) 一个程序片不能接触到本地的磁盘。这意味着不能在本地磁盘上写和读,我们不想一个程序片通过WEB页面阅读和传送重要的信息。写是被禁止的,当然,因为那将会引起病毒的侵入。当数字签名生效时,这些限制会被解除。

    (2) 程序片不能拥有菜单。(注意:这是规定在Swing 中的)这可能会减少关于安全和关于程序简化的麻烦。我们可能会接到有关程序片协调利益以作为WEB 页面的一部分的通知;而我们通常不去注意程序片的范围。这儿没有帧和标题条从菜单处弹出,出现的帧和标题条是属于WEB 浏览器的。也许将来设计能被改变成允许我们将浏览器菜单和程序片菜单相结合起来——程序片可以影响它的环境将导致太危及整个系统的安全并使程序片过于的复杂。

    (3) 对话框是不被信任的。在Java中,对话框存在一些令人难解的地方。首先,它们不能正确地拒绝程序片,这实在是令人沮丧。如果我们从程序片弹出一个对话框,我们会在对话框上看到一个附上的消息框“不被信任的程序片”。这是因为在理论上,它有可能欺骗用户去考虑他们在通过WEB 同一个老顾客的本地应用程序交易并且让他们输入他们的信用卡号。在看到AWT 开发的那种GUI 后,我们可能会难过地相信任何人都会被那种方法所愚弄。但程序片是一直附着在一个Web页面上的,并可以在浏览器中看到,而对话框没有这种依附关系,所以理论上是可能的。因此,我们很少会见到一个使用对话框的程序片。

    在较新的浏览器中,对受到信任的程序片来说,许多限制都被放宽了(受信任程序片由一个信任源认证)。

    涉及程序片的开发时,还有另一些问题需要考虑:

    ■程序片不停地从一个适合不同类的单独的服务器上下载。我们的浏览器能够缓存程序片,但这没有保证。在Java 1.1 版中的一个改进是JAR(Java ARchive)文件,它允许将所有的程序片组件(包括其它的类文件、图像、声音)一起打包到一个的能被单个服务器处理下载的压缩文件。“数字签字”(能校验类创建器)可有效地加入每个单独的JAR 文件。

    ■因为安全方面的缘故,我们做某些工作更加困难,例如访问数据库和发送电子邮件。另外,安全限制规则使访问多个主机变得非常的困难,因为每一件事都必须通过WEB 服务器路由,形成一个性能瓶颈,并且单一环节的出错都会导致整个处理的停止。

    ■浏览器里的程序片不会拥有同样的本地应用程序运行的控件类型。例如,自从用户可以开关页面以来,在程序片中不会拥有一个形式上的对话框。当用户对一个WEB 页面进行改变或退出浏览器时,对我们的程序片而言简直是一场灾难——这时没有办法保存状态,所以如果我们在处理和操作中时,信息会被丢失。另外,当我们离开一个WEB 页面时,不同的浏览器会对我们的程序片做不同的操作,因此结果本来就是不确定的。

    1     程序片的优点

    如果能容忍那些限制,那么程序片的一些优点也是非常突出的,尤其是在我们构建客户/服务器应用或者其它网络应用时:

    ■没有安装方面的争议。程序片拥有真正的平台独立性(包括容易地播放声音文件等能力)所以我们不需要针对不同的平台修改代码也不需要任何人根据安装运行任何的“tweaking ”。事实上,安装每次自动地将WEB 页连同程序片一起,因此安静、自动地更新。在传统的客户机/服务器系统中,建立和安装一个新版本的客户端软件简直就是一场恶梦。

    ■因为安全的原因创建在核心Java 语言和程序片结构中,我们不必担心坏的代码而导致毁坏某人的系统。这样,连同前面的优点,可使用Java (可从JavaScript 和VBScript中选择客户端的WEB 编程工具)为所谓的Intrant(在公司内部使用而不向Internet 转移的企业内部网络)客户机/服务器开发应用程序。

    ■由于程序片是自动同HTML 集成的,所以我们有一个内建的独立平台文件系统去支持程序片。这是一个很有趣的方法,因为我们惯于拥有程序文件的一部分而不是相反的拥有文件系统。

    2     视窗化应用

    出于安全的缘故,我们会看到在程序片我们的行为非常的受到限制。我们真实地感到,程序片是被临时地加入在WEB 浏览器中的,因此,它的功能连同它的相关知识,控件都必须加以限制。但是,我们希望Java能制造一个开窗口的程序去运行一些事物,否则宁愿安放在一个WEB 页面上,并且也许我们希望它可以运行一些可靠的应用程序,以及夸张的实时便携性。在这本书前面的章节中我们制造了一些命令行应用程序,但在一些操作环境中(例如:Macintosh)没有命令行。所以我们有很多的理由去利用Java 创建一个设置窗口,非程序片的程序。这当然是一个十分合理的要求。

    一个Java 设置窗口应用程序可以拥有菜单和对话框(这对一个程序片来说是不可能的和很困难的),可是如果我们使用一个老版本的Java,我们将会牺牲本地操作系统环境的外观和感受。JFC/Swing 库允许我们制造一个保持原来操作系统环境的外观和感受的应用程序。如果我们想建立一个设置窗口应用程序,它会合理地运作,同样,如果我们可以使用最新版本的Java 并且集合所有的工具,我们就可以发布不会使用户困惑的应用程序。如果因为一些原因,我们被迫使用老版本的Java,请在毁坏以建立重要的设置窗口的应用程序前仔细地考虑。

    3     菜单

    直接在程序片中安放一个菜单是不可能的(Java 1.0,Java1.1 和Swing 库不允许),因为它们是针对应用程序的。继续,如果您不相信我并且确定在程序片中可以合理地拥有菜单,那么您可以去试验一下。程序片中没有setMenuBar()方法,而这种方法是附在菜单中的(我们会看到它可以合理地在程序片产生一个帧,并且帧包含菜单)。

    有四种不同类型的MenuComponent (菜单组件),所有的菜单组件起源于抽象类:菜单条(我们可以在一个事件帧里拥有一个菜单条),菜单去支配一个单独的下拉菜单或者子菜单、菜单项来说明菜单里一个单个的元素,以及起源于MenuItem,产生检查标志(checkmark)去显示菜单项是否被选择的CheckBoxMenuItem。不同的系统使用不同的资源,对Java 和AWT 而言,我们必须在源代码中手工汇编所有的菜单。

    4     代码1

    import java.awt.*;

    public class Menu1 extends Frame {

        String[] flavors = { "Chocolate", "Strawberry","Vanilla Fudge Swirl", "Mint Chip", "Mocha Almond Fudge",

                "Rum Raisin", "Praline Cream","Mud Pie" };

        TextField t = new TextField("No flavor", 30);

        MenuBar mb1 = new MenuBar();

        Menu f = new Menu("File");

        Menu m = new Menu("Flavors");

        Menu s = new Menu("Safety");

        // Alternativeapproach:

        CheckboxMenuItem[] safety = { new CheckboxMenuItem("Guard"), new CheckboxMenuItem("Hide")};

        MenuItem[] file = { new MenuItem("Open"), new MenuItem("Exit")};

        // A secondmenu bar to swap to:

        MenuBar mb2 = new MenuBar();

        Menu fooBar = new Menu("fooBar");

        MenuItem[] other = { new MenuItem("Foo"), new MenuItem("Bar"), new MenuItem("Baz"), };

        Button b = new Button("Swap Menus");

        public Menu1() {

            for (int i = 0; i < flavors.length; i++) {

                m.add(new MenuItem(flavors[i]));

                // Add separators at intervals:

                if ((i + 1) % 3 == 0)

                    m.addSeparator();

            }

            for (int i = 0; i < safety.length; i++)

                s.add(safety[i]);

            f.add(s);

            for (int i = 0; i < file.length; i++)

                f.add(file[i]);

            mb1.add(f);

            mb1.add(m);

            setMenuBar(mb1);

            t.setEditable(false);

            add("Center", t);

            // Set up the system for swapping menus:

            add("North", b);

            for (int i = 0; i < other.length; i++)

                fooBar.add(other[i]);

            mb2.add(fooBar);

        }

        public booleanhandleEvent(Event evt){

            if (evt.id== Event.WINDOW_DESTROY)

                System.exit(0);

            else

                return super.handleEvent(evt);

            return true;

        }

        public booleanaction(Event evt,Object arg){

            if (evt.target.equals(b)) {

                MenuBar m = getMenuBar();

                if (m == mb1)

                    setMenuBar(mb2);

                else if (m == mb2)

                    setMenuBar(mb1);

            } else if (evt.targetinstanceofMenuItem) {

                if (arg.equals("Open")){

                    String s = t.getText();

                    boolean chosen = false;

                    for (int i = 0; i < flavors.length; i++)

                        if (s.equals(flavors[i]))

                            chosen = true;

                    if (!chosen)

                        t.setText("Choose a flavor first!");

                    else

                        t.setText("Opening " + s + ". Mmm, mm!");

                } else if (evt.target.equals(file[1]))

                    System.exit(0);

                // CheckboxMenuItems cannot use String

                // matching; you must match the target:

                else if (evt.target.equals(safety[0]))

                    t.setText("Guard the Ice Cream! "+ "Guarding is " + safety[0].getState());

                else if (evt.target.equals(safety[1]))

                    t.setText("Hide the Ice Cream! " + "Is it cold? "+ safety[1].getState());

                else

                    t.setText(arg.toString());

            } else

                return super.action(evt, arg);

            return true;

        }

        public staticvoidmain(String[] args){

            Menu1 f = new Menu1();

            f.resize(300, 200);

            f.show();

        }

    }/// :~

    5     执行

    避免了为每个菜单编写典型的冗长的add()列表调用,因为那看起来像许多的无用的标志。取而代之的是,我安放菜单项到数组中,然后在一个for 的循环中通过每个数组调用add()简单地跳过。这样的话,增加和减少菜单项变得没那么讨厌了。

    作为一个可选择的方法(我发现这很难令我满意,因为它需要更多的分配)CheckboxMenuItems 在数组的句柄中被创建是被称为安全创建;这对数组文件和其它的文件而言是真正的安全。程序中创建了不是一个而是二个的菜单条来证明菜单条在程序运行时能被交换激活。我们可以看到菜单条怎样组成菜单,每个菜单怎样组成菜单项(MenuItems),chenkboxMenuItems 或者其它的菜单(产生子菜单)。当菜单组合后,可以用setMenuBar()方法安装到现在的程序中。值得注意的是当按钮被压下时,它将检查当前的菜单安装使用getMenuBar(),然后安放其它的菜单条在它的位置上。

    当测试是“open”(即开始)时,注意拼写和大写,如果开始时没有对象,Java 发出no error(没有错误)的信号。这种字符串比较是一个明显的程序设计错误源。校验和非校验的菜单项自动地运行,与之相关的CheckBoxMenuItems 着实令人吃惊,这是因为一些原因它们不允许字符串匹配。(这似乎是自相矛盾的,尽管字符串匹配并不是一种很好的办法。)因此,我们可以匹配一个目标对象而不是它们的标签。当演示时,getState()方法用来显示状态。我们同样可以用setState()改变CheckboxMenuItem 的状态。

    我们可能会认为一个菜单可以合理地置入超过一个的菜单条中。这看似合理,因为所有我们忽略的菜单条的add()方法都是一个句柄。然而,如果我们试图这样做,这个结果将会变得非常的别扭,而远非我们所希望得到的结果。(很难知道这是一个编程中的错误或者说是他们试图使它以这种方法去运行所产生的。)这个例子同样向我们展示了为什么我们需要建立一个应用程序以替代程序片。(这是因为应用程序能支持菜单,而程序片是不能直接使用菜单的。)我们从帧处继承代替从程序片处继承。另外,我们为类建一个构建器以取代init()安装事件。最后,我们创建一个main()方法并且在我们建的新型对象里,调整它的大小,然后调用show()。它与程序片只在很小的地方有不同之处,然而这时它已经是一个独立的设置窗口应用程序并且我们可以使用菜单。

    6     对话框

    对话框是一个从其它窗口弹出的窗口。它的目的是处理一些特殊的争议和它们的细节而不使原来的窗口陷入混乱之中。对话框大量在设置窗口的编程环境中使用,但就像前面提到的一样,鲜于在程序片中使用。我们需要从对话类处继承以创建其它类型的窗口、像帧一样的对话框。和窗框不同,对话框不能拥有菜单条也不能改变光标,但除此之外它们十分的相似。一个对话框拥有布局管理器(默认的是BorderLayout 布局管理器)和过载action()等等,或用handleEvent() 去处理事件。我们会注意到handleEvent()的一个重要差异:当WINDOW_DESTORY 事件发生时,我们并不希望关闭正在运行的应用程序!

    相反,我们可以使用对话窗口通过调用dispace()释放资源。在下面的例子中,对话框是由定义在那儿作为类的ToeButton的特殊按钮组成的网格构成的(利用GridLayout 布局管理器)。ToeButton 按钮围绕它自已画了一个帧,并且依赖它的状态:在空的中的“X”或者“O”。它从空白开始,然后依靠使用者的选择,转换成“X”或“O”。但是,当我们单击在按钮上时,它会在“X”和“O”之间来回交换。(这产生了

    一种类似填字游戏的感觉,当然比它更令人讨厌。)另外,这个对话框可以被设置为在主应用程序窗口中为很多的行和列变更号码。

    6.1     代码

    import java.awt.*;

    class ToeButton extends Canvas {

        int state= ToeDialog.BLANK;

        ToeDialog parent;

        ToeButton(ToeDialog parent) {

            this.parent = parent;

        }

        public voidpaint(Graphics g){

            int x1 = 0;

            int y1 = 0;

            int x2 = size().width - 1;

            int y2 = size().height - 1;

            g.drawRect(x1, y1, x2,y2);

            x1 = x2 / 4;

            y1 = y2 / 4;

            int wide = x2/ 2;

            int high = y2/ 2;

            if (state == ToeDialog.XX) {

                g.drawLine(x1, y1, x1+ wide,y1+ high);

                g.drawLine(x1, y1 + high,x1+ wide,y1);

            }

            if (state == ToeDialog.OO) {

                g.drawOval(x1, y1, x1+ wide/ 2, y1+ high/ 2);

            }

        }

        public booleanmouseDown(Event evt,intx, int y) {

            if (state == ToeDialog.BLANK) {

                state = parent.turn;

                parent.turn = (parent.turn == ToeDialog.XX ? ToeDialog.OO : ToeDialog.XX);

            } else

                state = (state == ToeDialog.XX ? ToeDialog.OO : ToeDialog.XX);

            repaint();

            return true;

        }

    }

    class ToeDialog extends Dialog {

        // w = numberof cells wide

        // h = numberof cells high

        static finalintBLANK= 0;

        static finalintXX= 1;

        static finalintOO= 2;

        int turn= XX;// Start with x's turn

        public ToeDialog(Frame parent, intw, int h) {

            super(parent, "The gameitself", false);

            setLayout(new GridLayout(w, h));

            for (int i = 0; i < w * h; i++)

                add(new ToeButton(this));

            resize(w * 50, h * 50);

        }

        public booleanhandleEvent(Event evt){

            if (evt.id== Event.WINDOW_DESTROY)

                dispose();

            else

                return super.handleEvent(evt);

            return true;

        }

    }

    public class ToeTest extends Frame {

        TextField rows = new TextField("3");

        TextField cols = new TextField("3");

        public ToeTest() {

            setTitle("Toe Test");

            Panel p = new Panel();

            p.setLayout(new GridLayout(2, 2));

            p.add(new Label("Rows", Label.CENTER));

            p.add(rows);

            p.add(new Label("Columns", Label.CENTER));

            p.add(cols);

            add("North", p);

            add("South", new Button("go"));

        }

        public booleanhandleEvent(Event evt){

            if (evt.id== Event.WINDOW_DESTROY)

                System.exit(0);

            else

                return super.handleEvent(evt);

            return true;

        }

        public booleanaction(Event evt,Object arg){

            if (arg.equals("go")){

                Dialog d = new ToeDialog(this, Integer.parseInt(rows.getText()), Integer.parseInt(cols.getText()));

                d.show();

            } else

                return super.action(evt, arg);

            return true;

        }

        public staticvoidmain(String[] args){

            Frame f = new ToeTest();

            f.resize(200, 100);

            f.show();

        }

    } /// :~

    6.2     执行

    ToeButton 类保留了一个句柄到它ToeDialog 型的父类中。正如前面所述,ToeButton 和ToeDialog 高度的结合因为一个ToeButton 只能被一个ToeDialog 所使用,但它却解决了一系列的问题,事实上这实在不是一个糟糕的解决方案因为没有另外的可以记录用户选择的对话类。当然我们可以使用其它的制造ToeDialog.turn(ToeButton 的静态的一部分)方法。这种方法消除了它们的紧密联系,但却阻止了我们一次拥有多个ToeDialog(无论如何,至少有一个正常地运行)。

    paint()是一种与图形有关的方法:它围绕按钮画出矩形并画出“X”或“O”。这完全是冗长的计算,但却十分的直观。

    一个鼠标单击被过载的mouseDown()方法所俘获,最要紧的是检查是否有事件写在按钮上。如果没有,父窗口会被询问以找出谁选择了它并用来确定按钮的状态。值得注意的是按钮随后交回到父类中并且改变它的选择。如果按钮已经显示这为“X”和“O”,那么它们会被改变状态。我们能注意到本书第三章中描述的在这些计算中方便的使用的三个一组的If-else。当一个按钮的状态改变后,按钮会被重画。

    ToeDialog 的构建器十分的简单:它像我们所需要的一样增加一些按钮到GridLayout 布局管理器中,然后调整每个按钮每边大小为50 个像素(如果我们不调整窗口,那么它就不会显示出来)。注意handleEvent()正好为WINDOW_DESTROY 调用dispose(),因此整个应用程序不会被关闭。

    ToeTest 设置整个应用程序以创建TextField(为输入按钮网格的行和列)和“go”按钮。我们会领会action()在这个程序中使用不太令人满意的“字符串匹配”技术来测试按钮的按下(请确定我们拼写和大写都是正确的!)。当按钮按下时,TextField 中的数据将被取出,并且,因为它们在字符串结构中,所以需要利用静态的Integer.paresInt()方法来转变成中断。一旦对话类被建立,我们就必须调用show()方法来显示和激活它。

    我们会注意到ToeDialog 对象赋值给一个对话句柄 d。这是一个上溯造型的例子,尽管它没有真正地产生重要的差异,因为所有的事件都是show()调用的。但是,如果我们想调用ToeDialog 中已经存在的一些方法,我们需要对ToeDialog 句柄赋值,就不会在一个上溯中丢失信息。

    6.3     文件对话类

    在一些操作系统中拥有许多的特殊内建对话框去处理选择的事件,例如:字库,颜色,打印机以及类似的事件。几乎所有的操作系统都支持打开和保存文件,但是,Java 的FileDialog 包更容易使用。当然这会不再检测所有使用的程序片,因为程序片在本地磁盘上既不能读也不能写文件。(这会在新的浏览器中交换程序片的信任关系。)

    下面的应用程序运用了两个文件对话类的窗体,一个是打开,一个是保存。大多数的代码到如今已为我们所熟悉,而所有这些有趣的活动发生在两个不同按钮单击事件的action()方法中。

    6.3.1       代码

    import java.awt.*;

    public class FileDialogTest extends Frame {

        TextField filename = new TextField();

        TextField directory= newTextField();

        Button open = new Button("Open");

        Button save = new Button("Save");

        public FileDialogTest() {

            setTitle("File Dialog Test");

            Panel p = new Panel();

            p.setLayout(new FlowLayout());

            p.add(open);

            p.add(save);

            add("South", p);

            directory.setEditable(false);

            filename.setEditable(false);

            p = new Panel();

            p.setLayout(new GridLayout(2, 1));

            p.add(filename);

            p.add(directory);

            add("North", p);

        }

        public booleanhandleEvent(Event evt){

            if (evt.id== Event.WINDOW_DESTROY)

                System.exit(0);

            else

                return super.handleEvent(evt);

            return true;

        }

        public booleanaction(Event evt,Object arg){

            if (evt.target.equals(open)) {

                // Two arguments, defaults to open file:

                FileDialog d = new FileDialog(this, "Whatfile do you want to open?");

                d.setFile("*.java"); // Filename filter

                d.setDirectory("."); // Current directory

                d.show();

                String openFile;

                if ((openFile = d.getFile()) != null) {

                    filename.setText(openFile);

                    directory.setText(d.getDirectory());

                } else {

                    filename.setText("You pressed cancel");

                    directory.setText("");

                }

            } else if (evt.target.equals(save)) {

                FileDialog d = new FileDialog(this, "Whatfile do you want to save?", FileDialog.SAVE);

                d.setFile("*.java");

                d.setDirectory(".");

                d.show();

                String saveFile;

                if ((saveFile = d.getFile()) != null) {

                    filename.setText(saveFile);

                    directory.setText(d.getDirectory());

                } else {

                    filename.setText("You pressed cancel");

                    directory.setText("");

                }

            } else

                return super.action(evt, arg);

            return true;

        }

        public staticvoidmain(String[] args){

            Frame f = new FileDialogTest();

            f.resize(250, 110);

            f.show();

        }

    } /// :~

    6.3.2       执行

    对一个“打开文件”对话框,我们使用构建器设置两个自变量;首先是父窗口句柄,其次是FileDialog 标题条的标题。setFile()方法提供一个初始文件名--也许本地操作系统支持通配符,因此在这个例子中所有的.java 文件最开头会被显示出来。setDirectory()方法选择文件决定开始的目录(一般而言,操作系统允许用户改变目录)。

    show()命令直到对话类关闭才返回。FileDialog 对象一直存在,因此我们可以从它那里读取数据。如果我们调用getFile()并且它返回空,这意味着用户退出了对话类。文件名和调用getDirectory()方法的结果都显示在TextFields 里。

    按钮的保存工作使用同样的方法,除了因为FileDialog 而使用不同的构建器。这个构建器设置了三个自变量并且第三的一个自变量必须为FileDialog.SAVE 或FileDialog.OPEN。

    展开全文
  • Java方面有PinYin4j开源项目获取汉字的拼音,但是对多音处理的不好,自己研究了一下,终于给解决了。在这里跟大家分享一下!     工程目录结构如下   原理:将可能出现的多音 词组
  • Tendermint是一种开源的区块链套接协议,消除了区块链之前的复杂性,为区块链开发提供了模块化结构,并且在区块链核心提供了一个开源的区块链引擎,使得各种机构开发团队都能够轻松且高效地创建属于他们自己的...
  • MongoDB 分集群技术

    千次阅读 2018-04-04 14:31:54
    在了解分集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合。复制集提供了数据冗余高等级的可靠性,这是生产部署的基础。1.1.1 ...
  • STM8S_007_内FLASHEEPROM编程

    千次阅读 2017-05-18 23:08:52
    Ⅰ、写在前面我们都知道FLASHEEPROM这两种存储器,但是大部分人了解的都是专门的FLASHEEPROM芯片,如:W25Q16ATAT24C08(外部)储存芯片。 外部存储芯片本文说的内部FLASHEEPROM最大的区别就是在于:内部...
  • 但这些符号原先被描摹之实物的形状几无相似之处。谁也不能肯定这些象形字母原先究竟代表什么。我们的解释只能是学者们基于史料作出的有根据的猜测。一般认为希腊字母乃西方所有字母,包括拉丁字母的始祖。其实希腊...
  • MySql分表、分库、分片和分区知识

    万次阅读 多人点赞 2019-02-18 20:52:29
    需要进行数据的处理,采用的手段是分区、分、分库、分表。 二、分(类似分库)  分是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力...
  • 一、存储器格式(对齐): Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的(32位)数据,从第四个字节到第七个字节放置第二个存储的数据,一次排列。作为32位...
  • k-近邻算法实现手写数字识别系统

    千次阅读 2017-03-26 15:48:41
    没有哪个电影人会说自己制作的电影以前的某部电影类似,但我们确实知道每部电影在风格上的确有可能会同题材的电影相近。那么动作具有哪些共有特征,使得动作之间非常类似,而与爱情存在着明显的差别呢?...
  • 有两种外形相似、习性相近的鸟,给出某科研人员对着两种鸟类的翅展身长的记录。 问题 1. 请根据上述表格,给出一个为这两种鸟类分类的方法。 问题 2. 现观察到该丛林中的三只鸟,其翅展身长的数据分别为...
  • 2017工业大数据 风机叶片预测练习

    千次阅读 多人点赞 2018-08-20 18:54:32
    将结冰样本进行过采样,将非结冰样本 进行欠采样,或者两者同时进行,以达到结冰非结冰样本在 模型训练时有基本相近的比例。 如果我们能从序列数据中提取出易于分类的特征,就能够 准确地检测早期结冰。因此,在...
  • Digital Twin 数字孪生  是充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多物理量、多...不使用“体”这个词,主要是为了强调,数字虚拟体物理实体之间,是有着本质的差别的。因此数字双胞胎,...
  • 5万、97 张图总结操作系统核心知识点

    万次阅读 多人点赞 2020-07-14 09:19:25
    跳转(jump):从指令中抽取一个,把这个复制到程序计数器(PC) 中,覆盖原来的值 进程线程 关于进程线程,你需要理解下面这张脑图中的重点 进程 操作系统中最核心的概念就是 进程,进程是对正在运行中的程序...
  • 使用Windows中的字体生成点阵字库

    千次阅读 2018-07-09 09:55:05
     矢量字库是把每个字符的笔划分解成各种直线曲线,然后记下这些直线曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字符.它的好处就是可以随意放大缩小而不失真.而且所需存储量...
  • 通通建议家长们与其让孩子看《熊出没》、《喜羊羊与灰太狼》等没什么营养的动画,倒不如花时间陪孩子看一些经典的纪录,既能满足孩子看电视的需求,也能增长见闻,学习更多的知识  BBC(英国广播公司)的纪录...
  • 演讲嘉宾 |王晶(华为云人工智能高级算法工程师王晶) 出品 |AI科技大本营(ID:rgznai100) 近期,由CSDN主办的2019中国AI开发者大会(AI ProCon ...演讲的第一部分,他分享了文字检测识别的基础知识以及难点...
  • Berkeley socket 套接编程详解

    千次阅读 2016-12-21 09:36:49
    网络程序设计全靠套接接受发送信息,尽管套接这个词好象显得有些神秘,但 其实这个概念极易理解。 这章主要讲述Sockets API(Application Program Interface),以及一些其他的细节(比 如Socket 的历史、...
  • 2006-01-07 01:19:24 第十三章 创建窗口程序在Java 1.0中,图形用户接口(GUI)库最初的设计目标是让程序员构建一个通用的GUI,使其在所有平台上都能正常显示。但遗憾的是,这个目标并未达到。事实上,...
  • Part 2: 触发检测 关键词语音唤醒 触发检测 欢迎来到这个专业课程的最终编程...触发检测技术,可以让亚马逊Alexa,Google Home,Apple Siri百度DuerOS等设备在听到某个词语时进行唤醒。 本练习中,我...
  • 第十三章 创建窗口程序在Java 1.0中,图形用户接口(GUI)库最初的设计目标是让程序员构建一个通用的GUI,使其在所有平台上都能正常显示。但遗憾的是,这个目标并未达到。事实上,Java 1.0版的“抽象Windows工具...
  • 【Python基础】2万-详解Python基础函数,包教包会

    万次阅读 多人点赞 2021-10-08 17:05:33
    endswith_str = 'Python新视野' endswith_str.endswith('thon', 0, 6) output:True 从第 1 个字符开始检测,到第 7 个字符结束(不包含第 7 个),注意这里的范围字符串切片其实是一样的道理,都是前闭后开。...
  • 批量修改ppt字体大小及颜色

    万次阅读 2018-03-16 16:30:35
    本人遇到一个问题,就是修改已经做好的ppt文件时,怎么样才能如何批量修改ppt字体大小及颜色,我google了很多相似的问题,但给出答案不是很满意,有高手请赐教,谢谢!我从网上搜索到另一个代码,经过运行是可以使用...
  • mongodb分介绍

    千次阅读 2016-06-21 14:38:15
    1.mongodb集群架构 ...sharded cluster有如下几个组件:分(shards),查询路由器(query router)配置服务器(config servers): shards存储实际数据,为了提高高可用,每个shards可以配置为复制集replica sets,
  • K-近邻算法实现手写数字识别系统

    千次阅读 2019-04-19 23:26:03
    K 近邻算法实现手写数字识别系统 实验内容 本实验将会从电影题材分类的例子入手,讲述 K 近邻算法的原理。在这之后,我们将会使用该... 从文本文件中解析导入数据 使用 Matplotlib 创建扩散图 归一化数值 ...
  • R参考卡片

    千次阅读 2016-05-31 15:53:30
    帮助基础 大部分 R 函数都有在线文档。 help(topic) 关于 topic 的文档. ?topic 同上 help.search("topic") 搜索帮助系统 apropos("topic") 返回在搜索路径下包含 (部分) 关键词”topic” 的 所有对象名称 help....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,134
精华内容 22,453
关键字:

和片比较相似的字