07-层次化设计 -- 全加器

1.层次化设计

数字电路中根据模块层次不同有两种基本的结构设计方法:自底向上的设计方法和自顶向下的设计方法

1.1 自底向上的设计方法(Bottom-Up)

自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的(基本单元是已有的或者是购买的),有基本单元构建高层单元,依次向上,直至构建系统

  • 首先对现有的功能块进行分析,只用这些已经存在的模块,搭建比较大的功能块

1.2 自上而下的设计方法(Top-Down)

从系统开始,把系统分为基本单元,然后再把每个单元划分为下一层次的基本单元,一直这样做下去,直到直接可以使用EDA元件库中的元件来实现为止

  • 先确定顶层模块
  • 划分子模块
  • 对子模块进行分解
  • 实现最小的模块

1.3 混合设计

2.全加器设计

  • 使用半加器实现一个全加器
  • 使用按键KEY1,KEY2,KEY3表示in_1,in_2,c_in
  • LED1,LED2分别表示sum,c_out

2.1 框图和波形


将顶层模块进行继续划分

2.2 代码编写

  • 顶层模块和子模块放在同一个文件夹下,顶层模块可以例化子模块
module half_adder(
  input wire in_1,
  input wire in_2,

  output wire sum,
  output wire count
);

  assign {count,sum} = in_1 + in_2;
  
endmodule
module full_adder(
  input wire in_1,    // 输入两个加数和一个低位进位
  input wire in_2,
  input wire cin,  
  
  output wire sum,    // 输出和 进位
  output wire count
);

// 例化过程中需要引出的线,单独进行命名
// 第一个半加器的输出 sum -- 顶层没有定义子模块的输出,所以要自己定义


// 声明两个变量,将第一个半加器的输出引出来
// 可以对变量进行重新进行命名
wire h0_sum;
wire h0_count;
// 将第二个半加器的输出引出来
wire h1_count;

half_adder half_adder_inst1(
  .in_1 (in_1),     // 输入in_1 in_2
  .in_2 (in_2),
  .sum  (h0_sum),   // in_1 ^ in_2
  .count (h0_count) // in_1 & in_2
);

half_adder half_adder_inst2(
  .in_1 (cin),    // 输入是第一个半加器的输入和进位
  .in_2 (h0_count), 
  .sum  (sum),    // 输出是 in_1 ^ in_2 ^ cin
  .count (h1_count) // 进位是 (in_1 ^ in_2) & cin + in_1 & in_2 
);

assign count = (h0_count | h1_count);
endmodule
  • 进行代码编译,检查是否出错
  • 需要将子模块和顶层模块都添加到工程当中进行编译

2.3 Testbench

`timescale 1ns/1ns

module tb_full_adder();
  reg in_1;
  reg in_2;
  reg cin;
  wire sum;
  wire count;

  initial begin
    in_1 <= 1'b0;
    in_2 <= 1'b0;
    cin <= 1'b0;
  end

  initial begin
    $timeformat(-9,0,"ns",6);
    $monitor("@time:time=%t,in_1=%b,in_2=%b,cin=%b,sum=%b,count=%b",$time,in_1,in_2,cin,sum,count);
  end

  always #10 in_1 = {$random} % 2;
  always #10 in_2 = {$random} % 2;
  always #10 cin = {$random} % 2;
  
  full_adder full_adder_inst(
    .in_1 (in_1),
    .in_2 (in_2),
    .cin  (cin),
    .sum  (sum),
    .count (count)
  );
endmodule
  • 添加仿真文件进行仿真

2.4 上板验证



本文转载于网络 如有侵权请联系删除

相关文章

  • 数据可视化设计过程:面向初学者的循序渐进指南

    导读:可视化图表,图形和仪表中的数据是使数字能够实际对话的最强大的方式之一。但是,很多刚开始使用的人往往会不知所措,无法下手。本文作者详细解读了关于数据可视化图表设计如何循序渐进的过程,以便大家在将电子表格转换为可视化图表时可以明确要执行的第一,第二和第三步,供大家一同参考和学习。步骤1:分析目标对象首先,我们必须做一些计划,先不要急着马上从图形下手。从长远来看,一点点的前期计划可以节省数小时的血液,汗水和眼泪。我们最先需要分析的是目标受众群体。确切地说,谁将使用我们提供的数据进行决策?在设计过程中,分析受众是所有思考步骤中最不线性的。此步骤不依赖于计算机软件或编程技能,而是涉及有关于用脑的思考。1.谁是观众?我们的的首要考虑因素就是这个问题,为一组基础课程计划人员设计的图表不适用于一组高中校长,反之亦然。在一张纸,白板,电子表格甚至餐巾纸的背面列出所有受众类型。与相关负责人共享该列表,直到所有人都对数据的目标对象达成共识,这一步才算是完成。2.受众人群的算术水平是多少?他们喜欢还是害怕数据?除非您为一组经济学家或统计学家设计图表,否则通常可以忽略诸如效应大小,功效分析和误差范围之类的

  • 机器学习学术速递[8.30]

    Update!H5支持摘要折叠,体验更佳!点击阅读原文访问arxivdaily.com,涵盖CS|物理|数学|经济|统计|金融|生物|电气领域,更有搜索、收藏等功能!cs.LG方向,今日共计60篇Graph相关(图学习|图神经网络|图优化等)(4篇)【1】Group-AwareGraphNeuralNetworkforNationwideCityAirQualityForecasting 标题:群体感知图神经网络在全国城市空气质量预报中的应用 链接:https://arxiv.org/abs/2108.12238 作者:LingChen,JiahuiXu,BinqingWu,YuntaoQian,ZhenhongDu,YanshengLi,YongjunZhang 机构:ZhejiangUniversity 摘要:空气污染问题威胁着公众健康。空气质量预测可以在几小时甚至几天后提供空气质量指数,帮助公众提前预防空气污染。以往的工作侧重于城市范围内的空气质量预测,无法解决全国范围内的城市预测问题,其困难在于捕捉地理距离遥远但高度相关的城市之间的潜在相关性。在本文中,我们提出了群体感知图神经

  • 干货 | 用数据描述和驱动业务,携程指标标准化管理实践

    作者简介 Chao,携程资深数据分析经理,关注数据治理、数据仓库和数据分析领域。致力于数据使用效率及价值提升。一、背景携程金融自2017年成立以来,继承了互联网企业“小步快跑,快速迭代”的基因,一直保持高速发展。不过业务的频繁迭代以及分散性的数据组织架构,给数据治理工作带来了很大的挑战。特别是在指标应用层面,这些挑战更为明显:业务频繁迭代,数据知识相对于业务模型变更存在一定滞后性,导致不同数据使用人员对业务理解存在较大偏差。数据团队比较分散,指标建设存在严重冗余,不仅导致资源浪费,并且在口径描述上缺乏一致性管理,导致在指标使用过程中有很多分歧。标准化规范浮于表面,无法在数据开发的全生命周期实现系统性约束和校验,存在数据质量风险。针对以上这些问题,我们参考了业界比较成熟的OneData方法论。OneData提出了数据建设的三个统一:统一指标定义、统一数仓建模,统一开发流程。基于此,我们结合金融独有的组织架构及业务特点,从指标定义标准化、流程管理系统化两个层面进行了设计和实践,以保障数据能有效支撑和驱动业务的高速发展。 二、指标定义标准化:关于指标定义的思考数仓建设者对业务的把控程度直接决

  • 适合普通大学生的前端开发学习路线

    大家好,我是帅地。接下来的一段时间,帅地会总结各种技术栈的学习路线,例如Java开发,C++开发,python开发,前端开发等等,以下是以更新的:假如你没有明确的目标,或许可以按照我说的学习路线来学习一波,我写的每一份学习路线,不会很全面,因为我认为,东西列的太多,反而不利于新手的学习,所以我列举的,都是比较必要的知识,当你把这些知识学了的时候,我相信你不需要别人的学习路线,也能知道自己接下来需要学啥了。虽然帅地的技术栈是后端开发,不过后端和前端显然是一对的,还是经常要和前端打交道,所以在之前也学习过不少前端的知识,下面总结的这套前端学习路线,是我参考了别人大量的学习经历+自己的思考+咨询前端大佬后提取出来的,可能不会像别人一样写一大堆,但你按照这个路线学习之后,应该也不算太差。下面推荐的所有书籍,都可以在这个GitHub上下载到,里面收集了挺多优质编程书籍:编程的优质书籍整理一、入门前端三剑客前端和后端相比,需要学习的知识还是要少很多,如果你要入门后端,你可以要学习一大堆只是,但是你入门前端,只要把HTML+CSS+JavaScript这三门知识学习了,就基本差不多入门前端了,并且可

  • centos yum php 7.x 无需删除升级的方法

    1.yumlistinstalled|grepphp查看安装的php版本mod_php72w.x86_647.2.1-1.w7@webtaticphp72w-cli.x86_647.2.1-1.w7@webtaticphp72w-common.x86_647.2.1-1.w7@webtaticphp72w-devel.x86_647.2.1-1.w7@webtaticphp72w-fpm.x86_647.2.1-1.w7@webtaticphp72w-gd.x86_647.2.1-1.w7@webtaticphp72w-mbstring.x86_647.2.1-1.w7@webtaticphp72w-mysqlnd.x86_647.2.1-1.w7@webtaticphp72w-opcache.x86_647.2.1-1.w7@webtaticphp72w-pdo.x86_647.2.1-1.w7@webtaticphp72w-process.x86_647.2.1-1.w7@webtatic2.yuminstall-yphp72wphp72w-fpm升级phph版本,升级完后。mod

  • 深度学习2018下半年关键技术大盘点:模型、社区与框架

    新智元报道来源:Medium编辑:智能禅师【新智元导读】本文总结了2018年下半年,最火的开源框架、模型,以及社区。同时还提到一个有趣的现象,每20分钟就有一篇AI论文现世。最后作者为新智元读者推荐3本经典深度学习教程。禅师从来没有感受过像2018这么冷的寒冬。所有的行业,仿佛都像中了冰冻减速一样,又慢,又冷。可就在这一片冷清中,有一个领域却成了这个冬天里,为数不多的火炉:深度学习(DeepLearning)。距离圣诞节还有2周;离元旦还有3周。眼看今年的余额就要用完了,可各大论文网站却依然没有任何,要盘点这半年来深度学习技术发展的迹象。于是两个人坐不住了。他们是RossTaylor和RobertStojnic,两人想办法搞到了PapersWithCode的数据。PapersWithCode是一个社区,致力于将DL研究论文和代码实现相结合。 本文由原作者RossTaylor授权新智元发布。RossTaylor来自伦敦,毕业于剑桥大学。AtlasML公司联合创始人,CTO。 两个小伙子,就这么对着这些天真无邪的数据,下手了!花了两个星期,总结出2018下半年,深度学习最关键性的技

  • JS 正则表达式国外手机号

    因公司需要开发国外网站,阅读需求文档的时候遇到这个问题,因此查找了解决办法做个记录。 varphones={ 'ar-DZ':/^(\+?213|0)(5|6|7)\d{8}$/, 'ar-SY':/^(!?(\+?963)|0)?9\d{8}$/, 'ar-SA':/^(!?(\+?966)|0)?5\d{8}$/, 'en-US':/^(\+?1)?[2-9]\d{2}[2-9](?!11)\d{6}$/, 'cs-CZ':/^(\+?420)??[1-9][0-9]{2}?[0-9]{3}?[0-9]{3}$/, 'de-DE':/^(\+?49[\.\-])?([\(]{1}[0-9]{1,6}[\)])?([0-9\.\-\/]{3,20})((x|ext|extension)[]?[0-9]{1,4})?$/, 'da-DK':/^(\+?45)?(\d{8})$/, 'el-GR':/^(\+?30)?(69\d

  • 快速排序到底是什么?

    1,快速排序概念通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。主要采用分治法和挖坑填数等方法,分治法就是大问题分解成各个小问题,对小问题求解,使得大问题得以解决。2,算法思路我们先搞清楚这个堆排序思想,先把逻辑搞清楚,不着急写代码。我们首先有一个无序数组,比方说int[]arr={4,2,8,0,5,7,1,3,9}; 复制2.1,第一步,取基准数基准数(枢轴),取数组的第一个元素,此时基准数:arr[0]=4基准数图并定义两个变量i和j分别指向无序数组的第一个元素start和最后一个元素end。//起始 inti=start; intj=end; //获取基准数 inttemp=arr[start]; 复制2.2,第二步,分区过程分区过程,将比基准数大的数全放到它的右边,比基准数小的或者相等的数全放到它的左边。我们首先把第一个元素arr[0]=4定义为基准元素,此时数组第一个位置就是坑,那么我们要从数组的右边向左开始查找小于基准数的元素,并与坑互换位置。从右至左查找while(i<

  • win10锁屏一分钟就自动熄屏了

    这个问题是由windows电源选项中的“控制台锁定显示关闭超时”配置默认为一分钟引起的。也就是锁屏后,系统默认会在一分钟后关闭显示器,而无视电源选项中的关闭显示器时长设置。 你可以通过打开以下注册表键值,修改Attributes为2来开启“控制台锁定显示关闭超时”设置选项。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7复制 随后就可在控制面板的高级电源选项中找到“显示-控制台锁定显示关闭超时”配置项。设置为你想要的锁屏后的熄屏等待时长就行了。       作者:WSWS链接:https://www.zhihu.com/question/395380735/answer/2734319270来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • ubuntu20.04 编译安装ckermit

    ubuntu20.04编译安装ckermit 我呢之前一直使用的是ubuntu18.04,最近在安装了某个软件之后,再加上自己的操作不当最终导致ubuntu系统卡死无法进入桌面环境,早就想更新20.04的我,终于迎来了换最新版ubuntu的理由 常规安装ckermit过程(通过apt下载方式) 请参考“Linux安装kermit”这篇文章。本文主要介绍通过源码安装方式。 源码方式安装ckermit 一、源码下载 TheKermitProject|ColumbiaUniversity注:通过哥伦比亚大学下载常常会因为网络原因导致下载速度过慢,甚至无法下载 这里提供已经下载好的最新版本源码包: 链接:C-Kermit9.0source 提取码:3ssb 二、编译C-kermitSource 解压源码压缩包 unzipx.zip ls ckc302.txtckcftp.cckcnet.cckcssl.hckcxla.hckuath.hckufio.cckusig.hckuus6.cckuver.hckvioc.cckvrms.hCOPYING.TXT ckcasc.hckcker.hckcn

  • 服务注册与发现组件介绍

    一、基本功能 对于微服务架构,服务注册与发现组件是必不可少的。在传统的服务架构中,服务的规模处于运维人员的可控范围内。当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的设定。在微服务应用中,服务实例的数量和网络地址都是动态变化的。 服务注册和服务发现 在一个分布式系统中,服务注册与发现组件主要解决两个问题:服务注册和服务发现。 服务注册:服务实例将自身服务信息注册到注册中心。这部分服务信息包括服务所在主机IP和提供服务的Port,以及暴露服务自身状态以及访问协议等信息。 服务发现:服务实例请求注册中心获取所依赖服务信息。服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提供的服务。 除此之外,服务注册与发现需要关注监控服务实例运行状态、负载均衡等问题。 监控:微服务应用中,服务处于动态变化的情况,需要一定机制处理无效的服务实例。一般来讲,服务实例与注册中心在注册后通过心跳的方式维系联系,一旦心跳缺少,对应的服务实例会被注册中心剔除。 负载均衡:同一服务可能同时存在多个实例,需要正确处理对该服务的负载均衡。 CAP原则 CAP原则,指的是在一个分布式

  • SQLServer查询近三年的数据

    declare@annualint=2020 select* fromtbName whereDATEDIFF(YEAR,CAST(annualasvarchar),cast(@annualasvarchar)) between(casewhen@annual=YEAR(GETDATE())then0else-1end) and(casewhen@annual=YEAR(GETDATE())then2else1end)复制  

  • JS-合并对象

    将多个对象合并成一个最终的对象。 解决办法:Object.assign(form,obj)----->Object.assign(目标对象,被合并的对象) <script> letform={name:'yazi',sex:'女'}; letobj={class:'十六班',age:16}; console.log('before',form); Object.assign(form,obj); console.log('after',form); </script>复制 结果:  

  • PHP 获取当天 凌晨 时间戳常用代码

    echostrtotime(date('Y-m-d')); 获取明天凌晨的时间戳代码:echostrtotime(date('Y-m-d',strtotime('+1day'))); 附上测试代码:echostrtotime('2012-11-2');echostrtotime('2012-11-200:00:00');echostrtotime(date('Y-m-d')),'';echodate('Y-m-dH:i:s',strtotime(date('Y-m-d')));echostrtotime(date('Y-m-d',strtotime('+1day')));echo(strtotime(date('Y-m-d',strtotime('+1day')))-strtotime(date('Y-m-d')))/3600; 其它参考代码: echo"一周后:".date("Y-m-d",strtotime("+1week"));    echo"一周零两天四小时两秒后:".date("Y-m-dG:H

  • nginx配置文件中的location详解

    location 语法:location[=|~|~*|^~]/uri/{…}默认:否 上下文:server 这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用~*前缀选择不区分大小写的匹配或者~选择区分大小写的匹配。 确定哪个location指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白nginx怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。 有两个方法修改这个行为。第一个方法是使用“=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用“location=/”将加速处理这个请求。 第二个是使用^~前缀。如果把这个前缀用于一个常规字符串那么告诉nginx如果路径匹配那么不测试正则表达式。 而且它重要在于NGINX做比较没有URL编码,所以如果你有一个URL链接’/images/%20/test

  • go 操作redis遇到的坑

    go操作redis,常用的库为redisgo和go-redis,在github上都有相关的democode。 但是,相关的demo都不支持redis集群,开始尝试都是会报MOVED的错误,查资料说用MOVED报错后的地址再试一次即可,自己搞了半天发现重试也不行。 又继续查资料,发现go-redis是支持集群的。只要是合理的设置即可。 如下: varctx=context.Background()//关键在于如下的配置复制 rdb:=redis.NewClusterClient(&redis.ClusterOptions{Addrs:[]string{"xxx:xx"},Password:"xx",})复制 err:=rdb.Set(ctx,"key","valuetest",0).Err()iferr!=nil{fmt.Println(err)panic(err)}val,err:=rdb.Get(ctx,"key").Result()iferr!=nil{panic(err)}fmt.Println("key",val)val2,err:=rdb.Get(ctx,"key2"

  • MyModel fields ValidationError clean_fields

    classMyModel(models.Model): foo=models.BooleanField() #Wrong!Don'tdothis! defclean_fields(self,exclude=None):#指定某些字段排除验证 #Bah!ForgettingtopassexcludedefaultsittoNone! super(MyModel,self).clean_fields() ifnotself.foo: raiseValidationError('Ahfooey.') #Correct!Doitthisway! defclean_fields(self,exclude=None): #That'sbetter!Let'stakeacoffeebreak.I'mtired. super(MyModel,self).clean_fields(exclude) ifnotself.foo: raiseValidationError('Ahfooey.')复制

  • JavaScript基本包装类介绍

      为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类型:Boolean、Number和String。这些类型与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而能够调用一些方法来操作这些数据。   经典实例1:   String对象是基本类型,但是也是特殊的引用类型(基本包装类型:内部创建对象,可以调用它自己内部的特殊行为) 1varstr="abcd"; 2str.length=2; 3console.log(str);//输出结果为abcd复制  上面str.length=2;实际执行为newString("abcd"),然后newString("abcd").length=2,然后delete销毁这个对象,与前面的对象无关,所以后面访问str时,还是abcd;  

  • IE下的兼容

    IE浏览器下宽100%高100% 此时高会集成父元素的高包括padding

  • Supervisor安装教程

    Supervisor有两个主要的组成部分: supervisord,运行Supervisor时会启动一个进程supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。 supervisorctl,是命令行管理工具,可以用来执行stop、start、restart等命令,来对这些子进程进行管理。 安装 sudopipinstallsupervisor 创建配置文件 mkdir-p/etc/etc/supervisor/conf.decho_supervisord_conf>/etc/supervisor/conf.d/supervisord.confmkdir-p/var/log/supervisor/touchsupervisord.log 配置修改 [unix_http_server];file=/tmp/supervisor.sock;(thepathtothesocketfile);修改为/var/run目录,避免被系统删除file=/var/run/supervisor.soc

  • [C/C++] C++ Primer学习笔记

    记录下自己掌握不清楚的概念和用法... Day1 endl:具有输出换行的效果,并刷新与设备相关联的缓冲区。 注:在调试程序过程中插入的输出语句都应刷新输出流,否则可能会造成程序崩溃,将会导致程序出错位置的错误判断。 buffer(缓冲区):输出缓冲区通常必须显式刷新以强制输出缓冲区内容。默认情况下,读cin会刷新cout;当程序正常结束时,cout也被刷新。 cerr:默认情况下,输出cerr不缓冲。通常用于不是程序正常逻辑部分的错误信息或其他输出。 clog:默认情况下,写到clog时是带缓冲的。通常用于将程序执行信息写入到日志文件中。 >>,<<:都返回其做操作数,从而连续读入或输出。 while(std::cin>>x):在遇到文件结束符时停止读入。 注:Windows系统下--"Ctrl+z" Unix系统下--"Ctrl+d" 在C++中,把负数赋给unsigned对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。 通用转义字符: \ooo:ooo表示3个八进制数字,这三个数字表示字符的数字值。

相关推荐

推荐阅读