在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: rosshardware

[原创] 数字典型电路知识结构地图,请大家参考,也希望积极补充!

[复制链接]
发表于 2018-11-1 18:37:21 | 显示全部楼层
非常不错的文章 赞赞赞
发表于 2018-11-1 18:54:40 | 显示全部楼层
每天来签个到,正在学习基带
发表于 2018-11-2 11:07:35 | 显示全部楼层
回复 10# rosshardware
你好,design spec 有没有相关模板,或者能单独讲一些design spec包含具体的内容吗?
发表于 2018-11-2 15:31:52 | 显示全部楼层

建议出本书,一定鼎力支持
 楼主| 发表于 2018-11-2 20:18:14 | 显示全部楼层
回复 83# leopard520329


    可以讲讲,每个公司可能模板格式会有不同,但是内容应该大同小异
发表于 2018-11-2 23:32:19 | 显示全部楼层
特定注册了账号,前来支持
发表于 2018-11-3 09:48:42 | 显示全部楼层
回复 85# rosshardware
期待中。。。。。。
 楼主| 发表于 2018-11-5 10:15:02 | 显示全部楼层
本帖最后由 rosshardware 于 2018-11-5 10:16 编辑

近期有人给我反馈,希望讲解一些更基础知识,所以先讲一些更基础知识,再继续讲NCO的电路实现。说的数字电路的基础,不得不提18世纪德国数理哲学大师莱布尼兹发明的二进制,二进制就是1个位只有0和1两种数值,十进制就我们通常自然世界使用的数值,1个位表示0,1,2,3,4,5,6,7,8,9。 为什么在电子世界使用二进制来表示数值,而不用十进制呢?主要因为电子的物理可实现性的原因。因为一个位只有两个状态,那么我们设计一个开关电路即可表示一个二进制的一个位,比如集成电路使用CMOS管的开关状态来表示1(开)和0(关),如果要设计一个电路表示10种状态,就是简单的开关电路完成不了的事情,同时,开关电路具有较好的动态范围,可以接受电压的波动范围较大,假如这个CMOS管工作在1.0V,那么,表示1时,CMOS管打开,只要输出电平在0.6~1.1,我们都可以认为是逻辑1,表示0,CMOS关闭,输出电平为0~0.4都可以认为是0, 想想如果要0~1.0V的范围表示0~9 10种状态,那么比如0~0.9表示0,1.0~1.9表示1,2.0~2.9表示2,以此类推,那么电压如果波动,很容易把逻辑1变成相邻逻辑2或者逻辑0,所以对于器件的稳定性要求极高,难易实现。 所以,数字集成电路的世界就是二进制的世界,用个CMOS管代表一个二进制的1个位(bit)
 楼主| 发表于 2018-11-5 10:40:08 | 显示全部楼层
二进制跟十进制以及十六进制的转换关系,前面讲加法器的时候,有过提及,这里就不在重复,这里主要讲述与之对应的布尔逻辑,这里逻辑主要指两个布尔变量之间的逻辑关系,在数字电路世界里,布尔变量就是一个采用二进制表示的信号,比如一个布尔变量A,其状态有两种0 或者1, 布尔变量的逻辑关系主要有:

逻辑非 NOT(~符号表示),逻辑功能,输出值与输入相反,一般图形符号为:
                         |\
         in --------- | \O------------  out                         out = ~ in
                         |/

        
  真值表              in     |   out
              ------------------------------------------
                        0      |     1
                        1      |     0

逻辑与 AND(&符号表示),逻辑功能,两个输入都为1,输出为1,否则均为0,一般图形符号为:
                          _____
   in0 -------------|         \
                         |          ) ------------  out                         out = in0 & in1
    in1------------ |____ /

        
  真值表       in0    in1  |   out
              ------------------------------------------
                  0       0    |    0
                  0       1    |    0
                  1       0    |    0
                  1       1    |    1

逻辑或 OR(|符号表示),逻辑功能,两个输入都为0,输出为0,否则均为1,一般图形符号为:
                          __
   in0 -------------\   \
                          )    ) ------------  out                         out = in0 | in1
    in1------------ /__/

其实是个月亮的符号,这里不好画,所以大家将就看。
        
  真值表       in0    in1  |   out
              ------------------------------------------
                  0       0    |    0
                  0       1    |    1
                  1       0    |    1
                  1       1    |    1

逻辑异或 XOR (^符号表示),逻辑功能,两个输入相同,输出为0,否则均为1,一般图形符号为:
                          __
   in0 -----------\ \   \
                        ) )    ) ------------  out                         out = in0 ^ in1
    in1-----------/ /__/

      
  真值表       in0    in1  |   out
              ------------------------------------------
                  0       0    |    0
                  0       1    |    1
                  1       0    |    1
                  1       1    |    0
 楼主| 发表于 2018-11-5 11:09:11 | 显示全部楼层
通过上述逻辑,不但可以完成我们一些简单控制,同时还可以完成的加法运算,以一个单bit的半加器为例,半加器主要是指只有进位输出,没有进位输入的加法器,我们先画出单bit半加器的真值表
半加器真值表       in0    in1  |   sum   cout
               ------------------------------------------
                         0       0    |    0        0
                         0       1    |    1        0
                         1       0    |    1        0
                         1       1    |    0        1

从真值表可以看出,sum和in0,in1是一个逻辑异或关系,cout和in0,in1位一个逻辑与关系,即:
             sum = in0  ^ in1;
             cout = in0 & in1;

半加器基础上,我们可以进一步扩展至全加器,全加器,即在半加器的基础上引入进位输入cin,

全加器真值表   cin   in0    in1  |   sum   cout
               ------------------------------------------
                     0      0      0    |    0        0
                     0      0      1    |    1        0
                     0      1      0    |    1        0
                     0      1      1    |    0        1
                     1      0      0    |    1        0
                     1      0      1    |    0        1
                     1      1      0    |    0        1
                     1      1      1    |    1        1

    全加器的输出sum,可以看做是半加器输出sum基础上加一个cin,所以
                    sum = in0 ^ in1 ^ cin;
    全加器的进位输出,可以从真值表上看出,任意两个输入位1,则进位输出为1:
                   cout = (in0 & in1) | (in0 & cin) | (in1 & cin);

     再进一步扩展,把单bit in0,in1,sum,cout扩展至4 bit in0[3:0],in1[3:0],sum[3:0],cout[3:0],既可以完成10进制的加法运算,即
                   sum[0] = in0[0] ^ in1[0];  // 最低bit没有进位位
                   cout[0] = in0[0] & in1[0]; // 最低bit没有进位位

                   sum[1] = in0[1] ^ in1[1] ^ cout[0];
                   cout[1] = (in0[1] & in1[1]) | (in0[1] & cout[0]) | (in1[1] & cout[0]) ;

                   sum[2] = in0[2] ^ in1[2] ^ cout[1];
                   cout[2] = (in0[2] & in1[2]) | (in0[2] & cout[1]) | (in1[2] & cout[1]) ;

                   sum[3] = in0[3] ^ in1[3] ^ cout[2];
                   cout[3] = (in0[3] & in1[3]) | (in0[3] & cout[2]) | (in1[3] & cout[2]) ;


这里以加法器为例,主要目的是给大家介绍,我们通过基本的与、或、非、异或逻辑,就可以组合出跟复杂的逻辑,完成更复杂的功能,大家了解这个过程就行,对于采用逻辑真值表化简布尔代数的方法,如果大家不熟悉,或者不能掌握,关系不大,我们真正到了集成电路前端开发时候,我们重点在用什么电路描述逻辑功能,至于这些逻辑最后怎么映射到门级电路,这一步交给Synopsy的综合工具完成,如果没有意向致力于EDA综合工具开发的话,真值表化简电路的点,不要花太长时间拘泥在这里。 包括上面的加法器例子,也是通过这个例子,让大家知道基本的门级电路怎么实现复杂电路的过程,而实际我们工程实现一个加法器就是在RTL里面用+即可,通常不会按照上述方式从门级开始设计,我们设计Level是从RTL级开始,这里特别说明,希望大家不要被误导认为我们电路设计完全门级开始。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 14:16 , Processed in 0.040235 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表