• 硬件的魅力


    硬件的魅力

    前言

    今天睡到了11,挺嗨啊,下午去找女朋友,预计这几天写不了博客了,等回来了补上吧.

    本次要介绍的是一点硬件知识和HCL语言的内容.

    正文

    从疑问開始

    首先,在介绍本文的内容之前,我们先来考虑一个考斯简单的问题.众所周知,计算机归根结底是在01打交道,那么究竟01是怎样被计算机记住的呢?

    怎么样,是不是有点像1+1为啥等于2?

    这个问题的答案比着1+1=2要简单多了.答案就是计算机通过电压来记录01.在学习物理的时候大家肯定都听说过电压这个玩意,它的单位通常是伏特(V).比方我们经常使用的电压通常是220V.计算机中使用1V来代表1,使用0V代表0.

    设计的基础

    要谈设计,就要知道设计的基础.刚才事实上我们了解了最主要的基础,就是01怎样表示,只是这仅仅是最根本的立足之本,我们还须要一些主要的元素.就像你要画一个物体一样,首先是点,然后才干点动成线,进而线动成画,终于画动成体.

    刚才的01仅仅只是是点而已,接下来,我们要用点变化成线.这个东西就叫做逻辑门.

    逻辑门是数字电路的基本计算元素,也能够看做是物理结构与逻辑结构的映射,它们实际上是由晶体管组成的.逻辑门接收信号的输入,并依据信号产生一定的输出,而输出则是输入的布尔函数,也就是说,输出仅仅能是01.下图是and(“与”门),or(“或”门)not(“非”门)的标准符号,你能够看到他们代表了一组路线的组成方式.

     

    能够看出,andor都是2个输入,not为一个输入.前面我们提到了HCL硬件设计语言,上面的的三个图分别用HCL表示则是,a&&b,a||b,!a.

    举个样例,比方对于and门来说,它接受2个输入,假设2输入都是高位电压,则输出的为高位电压,也就是输出为1否则的话,都是输出低位电压,也就是输出0.这些就是建立在刚才1V1,oV0的基础上的.

    高级设计

    如今我们已经掌握了基础,那么在基础之上,我们就能够玩点花样了.比方刚才提到的逻辑门,他们仅仅能接受1位的输入和1位的输出,比方我们计算0&&10.那么假设我们希望计算更加复杂的表达式该怎样做呢,比方10001&&11111=?(注意,这里是位’与’运算,而不是逻辑运算).

    答案就是组合电路.道理非常easy,一个逻辑门能够计算1,假设我们弄来32个逻辑门,不就能够计算32位了吗?那么像上面那个10001&&11111的运算,我们就能够採取5个逻辑门去计算.当然,实际上并非这种,这个兴许我们会更加具体的介绍.

    只是电路往往是复杂的,不能随便乱接,否则电死了咋办?因此组合的电路须要遵循下面两个规则:

    1.两个逻辑门的输出不能连接到一起,否则他们可能会使线上的信号矛盾,因此可能会得到一个不合法的电压或故障.比方10V11V接到一起,会不会出来一个0.5V,又或者类似于正负极相接,直接断路了呢?

    2.组合的电路必须是无环的.也就是说输出不能再当做输入,否则会使这个函数产生歧义.这个道理非常easy,比方数学上来说,假设c=a+b.我们这里能够把c看做输出,a+b看做输入.假设a又等于c,那么是不是b就等于0了呢?当然不是,由于a此时事实上就是a+b,第二轮的c又会等于a+2b,同理,第三轮的c又会等于a+3b.那么究竟c=a+b还是c=a+2b还是c=a+3b?

    遵循以上规则,我们就能够任意组装电路了,比方这么一个图:

     

    它代表着输出是ab,假设用HCL来描写叙述电路,就是(a&&b)||(!a&&!b).我们不难看出来,这个表达式就是编程语言a==b.

    接下来的这个图是还有一个案例,它被翻译为多路复用器.事实上之所以叫这个,是由于当中的控制位s是能够复用的.

     

    在这里样例中还不是特别明显,可是之后的有更明显的样例说明”复用”的含义.以上这个电路假设用HCL表达,则是(a&&s)||(b&&!s).这个电路的含义是假设s1,则结果为a,否则结果为b.

    在书中对HCL表达式与C语言的表达式做了下面差别,有下面三点:

    1.逻辑门是持续输出的,C语言表达式是运行到的时候才会求值.这个差别能够把逻辑门当成一个电路来看,电路是不能断点的,电流会一直存在.

    2.C语言中输入能够是随意整数,HCL仅仅能是10.这点比較好理解.

    3.对于a&&b这个符号来说,C语言中的规定是假设前者为假,则后者不会再计算.HCL其中没有这样的说法.

    按位计算

    以上所提到的,哪怕是高级设计,也依旧是针对1位进行操作的.那么怎样才干真正操作多个位呢,比方平时经常使用的32位或者64.

    道理非常easy,就是多个1位操作一起进行,比如以下这个图:

     

    这个图其中每一个位相等的推断都是上面所提到的两个not,两个and门和一个or门组成的组合电路.它们并列的一起进行,终于再通过一个and,就完毕了推断两个32位的数字是否相等的操作.也就是表达式A==B,值得注意的是,这里的AB都是32位的.

    另一种类似于C语言中的switch语言的表达式,就是例如以下形式:

    int	Out=[
    s:A;
    1:B;
    ];


    他代表的意思就是说假设s1,则输出A否则输出B,相同,这里的AB都是32.那么使用电路怎样表达呢?事实上就是上次的服用电路的32位版本号,见下图:

    能够看到,snot值是被复用的,否则的话,这里须要32not.值得一提的是,HCL中条件选择表达式中的条件是不须要互拆的,仅仅是依照优先顺序依次选取,这与C语言中的seitch是不同的.

    最后一种HCL表达式,试剂盒的形式.他表示须要拿一个输入信号与某些值做匹配.比方下图的S1S0:

     

    当中假设S1code==2||code==3,S0code==1||code==0.那么HCL能够用第二种方式表达,code in {2,3}code in{1,0} .能够看出,HCL表达式事实上就是一种硬件表述方式.

    存储器和时钟

    上面我们介绍的都是组合电路,它们的作用是依据输入来产生一个值.可是刚才也说过,组合电路是一直输出的,因此它无法保持一个状态不变.但我们的计算机是须要存储数据的,因此就须要能保存状态的存储设备.存储设备则是由一个时钟控制,时钟就像一个开关一样,,它控制着存储设备什么时候更新设备里的值.

    常见的存储设备一般有两种

    1.时钟寄存器:存储单个位或者单个字.时钟信号来控制寄存器是否要载入输入的值.

    2.随即訪问存储器:存储多个字.用低脂来选择该读,写哪个字.

    时钟寄存器的典型应用是PC,条件码寄存器以及程序状态.它们都有明白的输入,这意味着他们的值事实上是某几个值的一个函数,比方条件码寄存器的输入主要就是逻辑计算单元的值,因此条件码寄存器的值就能够看做是逻辑计算单元的函数.

    时钟寄存器通常是非常据时钟信号来更新状态的,而时钟信号就像一个表一样,比方每到12,寄存器的值就更新一下.就像下图一样,当时钟变化时,值就会变化为y.

     

    随即訪问存储器最典型的案例就是我们的寄存器文件(也就是8个程序寄存器)和随即訪问存储器(也就是我们常说的内存).它们没有明白的输入值,因此不存在函数关系.不论是进村器文件还是随即訪问存储器,都有读和写两种操作,而对于时钟寄存器来说,是无所谓读和写的,由于它仅仅会依据输入的变化改变输出的值,是能够直接连接到电路上去的.

    寄存器文件一般有两个读port和一个写port.每一个port都附带有一个地址来标示操作的是哪个寄存器,而对于写port,另一个输入数据,对于读port,则另一个输出数据.详细的图演示样例如以下:

    能够看到在寄存器文件的写port处,有一个时钟(clock)控制着写的操作.当时钟变化时,输入数据的值就会更新到相应的寄存器其中.而对于读数据,则类似于组合电路,依据输入的地址值(src),寄存器文件会输出相应的数据.

    对于随即訪问存储器来说,与寄存器文件很相似.不同的是,随即訪问存储器仅仅有一个地址输入,而不是三个,仅仅有一个数据输出而不是两个.详细的图演示样例如以下:

     

    当地址输入,而且输入数据(data in)输入时,假设写(write)输入为1而且时钟(clock)变化时,存储器中地址为输入地址值的值将会变化,值就是输入数据(data in)的值.相同的,假设地址(address)输入,而且写(write)输入为0,则输出数据(data out)会输出地址为输入地址值的值.这里另一点特殊的是,当读数据的时候,假设地址超出了范围,erroe信号将会输出为1.回顾一下刚才的HCL语言,error事实上就能够看做是一个组合电路的输出,等于(address in>max address)||(address in <0),即当输入的地址值不在合法范围内时,他的输出为1.

    小小的结一下

    本次主要就是结合HCL语言在解说硬件的组成.而这些硬件,就是Y86处理器须要使用的.比方组合电路,存储器.在本章的最后,已经很接近我们的变成领域了,我们能够看到有寄存器和内存的出现.但要注意的是,这里的寄存器文件并不等于寄存器,随即訪问存储器也不等于内存,咱仅仅想想让大家更加深刻的理解他.

  • 相关阅读:
    mod_rewrite
    敏捷开发
    转python和ruby的相同点
    ESB总线知识小结
    使用 squid 2.7 for windows 进行无缓存反向代理
    初探K2workflow
    没激情的工作
    多易拍 二次开发
    查看数二进制代码片段
    生成随机数
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6922741.html
Copyright © 2020-2023  润新知