手机版 | 登陆 | 注册 | 留言 | 设首页 | 加收藏
当前位置: 网站首页 > 音响设备技术 > 文章 当前位置: 音响设备技术 > 文章

文盲学CPU设计—基础篇

时间:2009-10-07    点击: 次    来源:本站原创    作者:佚名 - 小 + 大

文盲学CPU设计—基础篇(已完成)

     这是我的学习笔记,原贴发在http://www.socvista.com/开源IP通吃岛。那里高手比较原意帮我这样的门外汉。
移过来大家共同学习吧,了解了解也好!我的目标是用Verilog编写自己CPU!目前正在学习中!我所使用的教材是《数字逻辑基础与Verilog设计》、《CPU芯片逻辑设计技术》和《MIPS处理器设计透视》。
     我是新手笔记中有错误的话大家请指正!

逻辑电路入门


一、变量和函数

       (图是用DXP2004画的)
       二进制电路中信号只有两种可能的取值0和1。最简单的二进制元件是具有两个状态的开关。



      上图中,S表示逻辑状态开关,L表示灯。
      设:灯开时L=1,灯灭时L=0。
      根据灯L的状态描述,X1为L的输入变量。
      当X1=1时,L=1,当X1=0时,L=0。
      即:L(X1)=X1
      L(X1)=X1就是个逻辑函数了,X1是输入变量。
    (PS:函数好像是高中数学的内容吧)

二、逻辑与
逻辑与(AND)的操作符号为“· ”。可以用两个开关串联的电路来表示。




相应函数式为L(X1,X2)=X1·X2,
只有当X1和X2都为1的时候,灯L=1;其他情况下灯L=0。

三、逻辑或
逻辑或(OR)的操作符号为“+”。可以用两个开关并联来表示。




相应的函数为L(X1,X2)=X1+X2;
只有当X1和X2都为0时,灯L=0;其他情况下灯L=1;

四、非门(反相)



这个电路在日常中应当不会用到!只是帮助理解非门!

开关S与灯L是并联的!当开关S闭合时,灯L被短路。这时灯L不亮反而灭。

而S断开时,灯L会亮。电阻R是为了防止电源短路被烧掉。

                                              —
非门的函数为:L(x)=X
(PS:这个上划线还真难打)
当X=0时,L=1;当X=1时,L=0。
书上说通常不说求反,而称求补。所以这个函数L(X)为X的补。也就是非操作!
可以用~X(波浪符)或X'(单撇号)或!X来表示!

逻辑门与真值表


     前面用开关电路,简单学习了与、或、非。真实的电路当然不可能是那个样子。他们有自己的电路符号,电路实现也更加复杂。复杂的东西留着以后学(PS:现在我也不懂),先从简单的电路符号学起。


一、逻辑门


在数字电路中每个逻辑操作都能用晶体管来实现,实现逻辑操作的电路元件叫做逻辑门。(PS:这是书中对逻辑门的描述,晶体管应当是指晶体三极管)





上图的左边部分就是前面介绍的逻辑门的电路符号。(PS:图片来自DXP2004的电路原理图中的电路符号,非门电路符号是由BUF改的。我找不到非门。)这三个门是其它复杂逻辑的基础。复杂的逻辑电路可能需要很多这样的元件才能完成。上图的右边部分分别是6输入与门和6输入或门,当然可以是其它的数量的输入,可以是x1·x2· ……·xn和x1+x2+ ……+xn。这里只是学习下多输入时电路图的画法。


二、真值表


真值表是啥?就是一张表嘛!在表中用穷举的方法例出逻辑电路中所有可能出现的输入和对应的结果。下边就是一张真值表,表中穷举了2输入与门和或门的四种可能的逻辑值组合。用真值表可以直观的反映出逻辑电路的正确性。规模小的时候很容易处理,但随着变量的增多,真值表的规模会随着变量呈指数的增长。也就是说2输入时,真值表是2的2次方。就是4行。当3输入是就是2的3次方,就是8行,4输入就是16行了,依此类推。一般情况,N输入变量的真值表有2的N次方行。


X1


X2


X1·X2(与)


X1+X2(或)


0


0


0


0


0


1


0


1


1


0


0


1


1


1


1


1



但不管有多少个输入变量,只要记住前面的。逻辑与就是开关串联,逻辑或就是开关并联。不管他有N个开关,结果有都一样。串联开关只要有一个没开,灯都不亮,x1·x2· ……·xn中所有变量为1时,结果为1,否则就为0。并联开关只要有一个开着灯都会亮。x1+x2+ ……+xn中只要有一个变量为1时,结果为1。只有当变量全为0时,结果才为0。

逻辑网络的分析与等价网络


 

在数字系统的设计中一般会遇到两个问题:一是对已存在数字电路的逻辑功能分析;二是设计新的逻辑电路,也称综合。当然分析要比综合容易。不过也要有一定的方法。



 





 

上图中是一个示例,现在我来分析下这个电路图。应当怎么分析呢?我用前两天学的基础分析。首先这个电路中有三个逻辑门符号,我们按纵向从上至下,横向从输入至输出的顺序来分析。


 

首先是上边的非门x1由非门输出到A点就是!X(PS:前面讲多逻辑非的四种表示方法)
A=!X1;


 

接着是下边的与门x1·x2由与门输出到B点。


 

B=x1·x2;


 

最后是或门的输出f。


 

f=A+B;


 

我们做下代入就成了。


 

f(x1,x2)=!x1+x1·x2;


 

这是个比较笨的办法,高手一眼就能看出来,不过谁让我是新手呢!


 

好我得到了函数f,接下来用真值表看看这个电路做了什么!这是一个2输入的电路,根据我昨天学的内容,真值表总有2的N次方行。所以可以确定这个电路的真值表有4行。将X1和X2可能的值放入表中,就会得到如下的真值表表。


X1


X2


A=!X1


B=x1·x2


f=A+B


0


0


1


0


1


0


1


1


0


1


1


0


0


0


0


1


1


0


1


1


现在我们来看看另一个电路!



 





 

这个电路更简单,我们按照上面的分析方法来分析这个电路。直接就能写出函数g(x1,x2)=!X1+X2;然后将函数g也写一张真值表,就会发现g=f。


X1


X2


!X1


g=!X1+X2


0


0


1


1


0


1


1


1


1


0


0


0


1


1


0


1


很有意思,为什么!x1+x1·x2=!X1+X2。这是就功能等价网络,一般情况下,一个逻辑函数可以用许多不同的网络来实现,实现电路的成本也可能有所不同。完成同一个功能可能高手画的电路只要几个元件就能搞定,而菜鸟可能要十几个元件才能完成。


 

看来要补习下数学知识了,布尔代数,该方法为现代电路设计奠定了技术基础。


 

布尔代数


 

布尔代数是乔治·布尔在1849年发表的涉及逻辑思想和推理过程的代数描述方法。其实和初中学的代数差不多!不过布尔代数是学好逻辑电路的基础,好在布尔代数不太难,只是有些枯燥。在学习布尔代数前,先学习下逻辑表达式中运算符优先级,运算按以下顺序执行:非,与,或。


 

一、布尔代数公理


 

代数嘛都是由很少几个基本假设推导得到一套规则,布尔代数就建立在这套规则的基础上。这几个基本假设就称为公理。现在根据以前学的真值表,可以得到一套公理!


X1


X2


X1·X2(与)


X1+X2(或)


0


0


0


0


0


1


0


1


1


0


0


1


1


1


1


1



1a、0·0=0

1b、1+1=1

2a、1·1=1

2b、0+0=0

3a、0·1=1·0=0

3b、0+1=1+0=1

4a、x=0,!X=1

4b、x=1,!X=0
二、单变量定理
根据公理定义一些规则来处理单个变量。这些规则通常称为定理。设X是二进制变量,则有以下定理:
5ax·0=0
5b、x+1=1
6a、x·1=x
6b、x+0=x
7a、x·x=x
7b、x+x=x
8a、x·!x=0
8b、x+!x=1
9、!!x=x
要证明这些定理也很简单,只要0和1分别代入X就可以了!比如5a,将0和1分别代入!0·0=0,1·0=0。当然用真值表更直观。

x


x·0


x+1


x·1


x+0


x·x


x+x


!x


x·!x


x+!x


!!x


0


0


1


0


0


0


0


1


0


1


0


1


0


1


1


1


1


1


0


0


1


1


三、对偶性
       前面公理和定理都是成对出现的,为什么呢?书中说到对于给定的一个逻辑表达式,将所有的“+”操作符替换为“· ”,将所有的“· ”操作符替换为“+”;将所有的0替换为1,将所有的1替换为0,就得到了对偶表达式。比如x·0=0将“· ”操作符替换为“+”,将0替换为1,就得到了x+1=1。当然对偶性还有更大的用处,对偶性意味着每个逻辑函数至少可以用两种不同的布尔代数表达式表示。其中一种表达式比另一种表达式的物理实现更简单。(PS:书上写的,慢慢学吧!)

四、二变量和三变量性质
      为了能够处理多个变量,定义2个变量和3个变量的代数恒等式是很有用的。这些恒等式通常被称为性质。也可以说是定律。
10a、x·y=y·x                                        交换律
10b、x+y=y+x
11a、x·(y·z)=(x·y)·z                       结合律
11b、x+(y+z)=(x+y)+z
12a、x·(y+z)=x·y+x·z                         分配律
12b、x+y·z=(x+y)·(x+z)
13a、x+x·y=x                                          吸收律
13b、x·(x+y)=x
14a、x·y+x·!Y=x                                   合并律
14b、(x+y)·(x+!Y)=x
15a、!(x·y)=!X+!Y                                   德摩根定律
15b、!(x+y)=!x·!Y
16a、x+!x·y=x+y
16b、x·(!X+y)=x·y
17a、x·y+y·z+!x·z+!x·z=x·y+!x·z            合意
17b、(x+y)·(y+z)·(!X+z)=(x+y)·(!X+z)
和初中学的代数很像,而且比初学代数更简单,这些公式都可以用真值表来验证。现在验证下13a。

x


y


x·y


x+x·y


0


0


0


0


0


1


0


0


1


0


0


1


1


1


1


1


       好了,布尔代数的基础就是这么多了。现在我们用代数的方法来证明下上次的那两幅电路图是等价电路!

      !x1+x1·x2=!X1+X2
用分配律12b,
      左式=(!x1+x1)·(!x1+x2)
用定理8a,
      左式=1·(!x1+x2)
用交换律10a
      左式=(!x1+x2)·1
最后用定理6a
      左式=!x1+x2
和原式的右式相等。
      不过这套东西,只能熟记加多计算。因为我也不太知道有什么更好的办法学习布尔代数。但布尔代数非学不可,后面的根据真值表和时序图(PS:重要内容)进行综合的学习一定要用到布尔代数。

单输出电路的综合


 

前面所学的所有知识都是为了最后电路的实现,也就是综合。虽然Verilog也是一种程序描述语言,但是与在电脑上写的软件程序有明显区别。大多数情况下电脑软件程序只要求完成功能,对资源占用和速度没有太多的要求,可以完全当做一门语言来学。可是硬件描述语言不一样,不能单单只实现功能,还要考虑硬件开销。而且要有一定的数学基础和逻辑分析能力。随着学习一天天的深入,我越来越佩服硬件工程师。说正题:


 


 

一、用积之和进行综合


 

啥叫积之和?其实是一种综合方法的口决。我还是用前面的例子来学习。


X1


X2


F(x1,x2)


0


0


1


0


1


1


1


0


0


1


1


1


假设只知道输入和输出(PS:实际中是用示波仪来得到时序图来分析。时序图要到后面才会学),要求出函数式进行综合。现在怎么用这个口决呢?只要为直值表中每一项函数的值为1的项创建值为1乘积,再将所有乘积求和就行了。


 

第一行:x1=0,x2=0,f(x1,x2)=1,怎么样才能使X1与X2的结果为1呢!先求非就可以了!


 

!X1·!X2=1;


 

第二行:x1=0,x2=1,f(x1,x2)=1,先对X1求非再求与,


 

!X1·X2=1;


 

第三行:f(x1,x2)=0,不考虑。


 

第四行:X1·X2=1


 

然后对值为1的三行求和就可以得到函数f(x1,x2)的表达式


 

f(x1,x2)=!X1·!X2+!X1·X2+X1·X2


 

这个表达式也太复杂了,和我们已经证明过的表达式相差太多了,现在把他化简下!


 

!X1·!X2+!X1·X2+X1·X2


 

=!X1·!X2+!X1·X2+X1·X2+!X1·X2     根据定理7b,复制其中一项不会改变结果


 

=(!X2+X2)·!X1+(X1+!X1)·X2                根据12a,分配律


 

=1·!X1+1·X2                                        根据定理8b


 

=!X1+X2                                                   根据定理6a


 

f(x1,x2)=!X1+X2


 

二、用和之积进行综合


 

前面说过了对偶和对偶表达式,那么积之和的对偶就是和之积了。还是用上面的那张真值表来学习。这个口决的理解和上面的差不多,只不过把1变成0,把积变成和。在真值表中每一项函数值为0的项创建值为0的和,再将所有和相乘。


 

上表中只有第三行为F(x1,x2)=0,于是我们只要写一行就行了!


 

要让X1+X2=0,X1和X2都要为0,第三行X1=1所以加个非。


 

!X1+X2=0;


 

f(x1,x2)=!X1+X2


哇,直接就写出结果了,真快呀!

时序图


 

    时序图是硬件工程师的重要分析工具,一般由示波仪、逻辑分析仪等工具显示。当然我这种业余的家伙是不会有那些东西了,不过CAD(计算机辅助设计)工具和EDA(电子设计自动化)工具都可以生成时序图。FPGA和专业工具的出现,使学习硬件技术的成本降低了许多。(PS:我的FPGA开发板只花了99元,还真便宜。)说正题:


 




 

上图就是一张时序图,这样看对于新手真的很头痛。我简单的说明下,逻辑电路的时序图为方波。因为逻辑电路只存在0和1,所以只有波峰和波谷。波峰代表1,而波谷代表0。我们再单看X3的时序,很像长城吧。长城的上城墙就是波峰,而长城的豁口就是波谷。长城的上城墙和豁口的长度都是等长的,这个长度就是电路维持状态的时间。我们可以通过这个时间量对时序图进行分列取值。(PS:这张图没有考虑输出延迟,实际上从输入到输出的变化之间必定存在一个延迟。这个难点的以后学!)



 





 

上图的是已经分好段的时序图。又是笨办法,不过很直观。虽然已经把时序图分解了,但还是不好看,我们把它转换成真值表!输入为x1,x2,x3。输出函数为f(x1,x2,x3)



X1


X2


X3


f(x1,x2,x3)


0


0


0


0


1


1


0


0


1


0


2


0


1


0


0


3


0


1


1


1


4


1


0


0


0


5


1


0


1


1


6


1


1


0


1


7


1


1


1


0


(PS:有计算机基础的兄弟,可以看出行号就是3位二进制转换为10进制的数据。看不懂的也没关系,进制转换以后学。)好了我们得到了真值表。现在用刚学的积之和及和之积来分别写出函数表达式。


 

积之和,找出f=1的行,求积。


 

第0行:!X1!X2!X3=1(简化的求积方式,去掉了· ”运算符)


 

第3行:!X1X2X3=1


 

第5行:X1!X2X3=1


 

第6行:X1X2!X3=1


 

再对所有积求和


 

f(x1,x2,x3)=!X1!X2!X3+!X1X2X3+X1!X2X3+X1X2!X3


 

和之积,找出f=0的行,求和。


 

第1行:X1+X2+!X3=0


 

第2行:X1+!X2+X3=0


 

第4行:!X1+X2+X3=0


 

第7行:!X1+!X2+!X3=0


 

再对所有和求积


 

f(x1,x2,x3)=(X1+X2+!X3)(X1+!X2+X3)(!X1+X2+X3)(!X1+!X2+!X3)

与非以及或非逻辑网络


 

前面已经讨论把与、或、非门用在逻辑电路的综合上了。与、或、非是逻辑电路的基础,但其硬件实现电路却不是最简单(PS:逻辑门电路实计上是由晶体三极管或场效应管组成,关于逻辑门的硬件实现电路,我不准备单独再学了。因为以后用不怎么到,喜欢研究的兄弟自己找找资料吧!),而与非和或非门却是最简的电路。下图是与非和或非的电路符号。


 




 

与非和或非的电路符号跟与门和或门差不多,不同之处在于输出端多了一个小圆圈。别小看与非和或非门,书上写着用与非门或者或非门可以实现任何复杂的电路。与非和或非算是重点。下面电路图用来证明德摩根定律,也使以后使用电路转换有律可循!


 




 

上面的图片展示了德摩根定律15。可见与非门和或非门等于输入取反的与门和或门。这东西非常有用,前面学习过积之和电路和和之积电路,而这两种电路可以只使用与非门或者或非门来实现。


 




 

上图是使用与非门实现积之和的电路。


 

第一张是原电路图。


 

第二张图是第一张把每个与门先替换成与非门,再在或门输入前加上非门,进行双重取反。根据我们的定理9可以证明,双重取反不会改变电路行为。


 

第三张图是根据德摩根定律15a所得的全与非门电路。


 


 





 

上图是使用或非门实现积之和的电路。


 

第一张是原电路图。


 

第二张图是第一张把每个或门先替换成或非门,再在与门输入前加上非门,进行双重取反。


 

第三张图是根据德摩根定律15b所得的全或非门电路。


 


 

这两个例子证明和之积和积子和,可以只由或非门和与非门来实现。而前面我们也证明了所有逻辑电路都可以用和之积和积子和实现。所以与非和或非可以实现任何逻辑电路。这有什么用呢?我想还是很有用的,首先与非门和或非门是一种逻辑门,不是与门和非门及或门和非门的组合。在物理实现上也比与门和或门简单。由于这几种特点,才使得可编程逻辑电路得以发展。为什么呢?因为可以FPGA中只添加与非门或者或非门!


 

下面用两个例子来学习一下与非和或非门的用法。


 

1、只用或非门实现和之积,函数为f=(x1+x2)(x2+!X3)


 




 


 

这里用两个输入端并联来实现x3的取反!计算过程比较简单,可以参考前面的内容。上划线不太好打就不写出来了!


 


 

2、只用与非门实现积之和,函数为f=x2+x1!X3



 




 


 

这个电路和前一个和之积的电路差不多。计算方法主要就是德摩根定律。一般用于化简完后的电路。


 


 

逻辑电路基础部分差不多就这些了,如果以后有什么情况再补充。明天开始学习Verilog基础

上一篇:Magic-1 HomebrewCPU

下一篇:ESET NOD32 KEY

备案ICP编号  |   QQ:285250603  |  地址:湛江市  |  电话:15322199012  |  
Copyright © 2026 天人文章管理系统 版权所有,授权www.yajiupc.top使用 Powered by 55TR.COM