硬件的魅力
前言
今天睡到了11点,挺嗨啊,下午去找女朋友,预计这几天写不了博客了,等回来了补上吧.
本次要介绍的是一点硬件知识和HCL语言的内容.
正文
从疑问開始
首先,在介绍本文的内容之前,我们先来考虑一个考斯简单的问题.众所周知,计算机归根结底是在0和1打交道,那么究竟0和1是怎样被计算机记住的呢?
怎么样,是不是有点像1+1为啥等于2?
这个问题的答案比着1+1=2要简单多了.答案就是计算机通过电压来记录0和1.在学习物理的时候大家肯定都听说过电压这个玩意,它的单位通常是伏特(V).比方我们经常使用的电压通常是220V.计算机中使用1V来代表1,使用0V代表0.
设计的基础
要谈设计,就要知道设计的基础.刚才事实上我们了解了最主要的基础,就是0和1怎样表示,只是这仅仅是最根本的立足之本,我们还须要一些主要的元素.就像你要画一个物体一样,首先是点,然后才干点动成线,进而线动成画,终于画动成体.
刚才的0和1仅仅只是是点而已,接下来,我们要用点变化成线.这个东西就叫做逻辑门.
逻辑门是数字电路的基本计算元素,也能够看做是物理结构与逻辑结构的映射,它们实际上是由晶体管组成的.逻辑门接收信号的输入,并依据信号产生一定的输出,而输出则是输入的布尔函数,也就是说,输出仅仅能是0或1.下图是and门(“与”门),or门(“或”门)和not门(“非”门)的标准符号,你能够看到他们代表了一组路线的组成方式.
能够看出,and和or都是2个输入,而not为一个输入.前面我们提到了HCL硬件设计语言,上面的的三个图分别用HCL表示则是,a&&b,a||b,!a.
举个样例,比方对于and门来说,它接受2个输入,假设2输入都是高位电压,则输出的为高位电压,也就是输出为1否则的话,都是输出低位电压,也就是输出0.这些就是建立在刚才1V为1,oV为0的基础上的.
高级设计
如今我们已经掌握了基础,那么在基础之上,我们就能够玩点花样了.比方刚才提到的逻辑门,他们仅仅能接受1位的输入和1位的输出,比方我们计算0&&1为0.那么假设我们希望计算更加复杂的表达式该怎样做呢,比方10001&&11111=?(注意,这里是位’与’运算,而不是逻辑运算).
答案就是组合电路.道理非常easy,一个逻辑门能够计算1位,假设我们弄来32个逻辑门,不就能够计算32位了吗?那么像上面那个10001&&11111的运算,我们就能够採取5个逻辑门去计算.当然,实际上并非这种,这个兴许我们会更加具体的介绍.
只是电路往往是复杂的,不能随便乱接,否则电死了咋办?因此组合的电路须要遵循下面两个规则:
1.两个逻辑门的输出不能连接到一起,否则他们可能会使线上的信号矛盾,因此可能会得到一个不合法的电压或故障.比方1个0V和1个1V接到一起,会不会出来一个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?
遵循以上规则,我们就能够任意组装电路了,比方这么一个图:
它代表着输出是a和b,假设用HCL来描写叙述电路,就是(a&&b)||(!a&&!b).我们不难看出来,这个表达式就是编程语言a==b.
接下来的这个图是还有一个案例,它被翻译为多路复用器.事实上之所以叫这个,是由于当中的控制位s是能够复用的.
在这里样例中还不是特别明显,可是之后的有更明显的样例说明”复用”的含义.以上这个电路假设用HCL表达,则是(a&&s)||(b&&!s).这个电路的含义是假设s为1,则结果为a,否则结果为b.
在书中对HCL表达式与C语言的表达式做了下面差别,有下面三点:
1.逻辑门是持续输出的,但C语言表达式是运行到的时候才会求值.这个差别能够把逻辑门当成一个电路来看,电路是不能断点的,电流会一直存在.
2.C语言中输入能够是随意整数,而HCL仅仅能是1和0.这点比較好理解.
3.对于a&&b这个符号来说,C语言中的规定是假设前者为假,则后者不会再计算.而HCL其中没有这样的说法.
按位计算
以上所提到的,哪怕是高级设计,也依旧是针对1位进行操作的.那么怎样才干真正操作多个位呢,比方平时经常使用的32位或者64位.
道理非常easy,就是多个1位操作一起进行,比如以下这个图:
这个图其中每一个位相等的推断都是上面所提到的两个not门,两个and门和一个or门组成的组合电路.它们并列的一起进行,终于再通过一个and门,就完毕了推断两个32位的数字是否相等的操作.也就是表达式A==B,值得注意的是,这里的A和B都是32位的.
另一种类似于C语言中的switch语言的表达式,就是例如以下形式:
int Out=[ s:A; 1:B; ];
他代表的意思就是说假设s为1,则输出A否则输出B,相同,这里的A和B都是32位.那么使用电路怎样表达呢?事实上就是上次的服用电路的32位版本号,见下图:
能够看到,s的not值是被复用的,否则的话,这里须要32个not门.值得一提的是,HCL中条件选择表达式中的条件是不须要互拆的,仅仅是依照优先顺序依次选取,这与C语言中的seitch是不同的.
最后一种HCL表达式,试剂盒的形式.他表示须要拿一个输入信号与某些值做匹配.比方下图的S1和S0:
当中假设S1为code==2||code==3,S0为code==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处理器须要使用的.比方组合电路,存储器.在本章的最后,已经很接近我们的变成领域了,我们能够看到有寄存器和内存的出现.但要注意的是,这里的寄存器文件并不等于寄存器,随即訪问存储器也不等于内存,咱仅仅想想让大家更加深刻的理解他.