精华内容
下载资源
问答
  • 迭代法只利用一个一位全加器完成四位二进制加法
  • 实验题目 设计、实现八位二进制数全加器 设计思路 ...使用两个四位二进制加法器组成。 功能设计 实现八位二进制加法,并保存可能存在的溢出值。 波形图 源代码 library ieee; use ieee.std_logic_11

    实验题目
    设计、实现八位二进制数全加器

    设计思路
    总体设计为三输入,两输出。具体:实体声明部分描述电路模块的端口,即指定输入输出口及其大小。设计具有8位位宽的矢量或总线端口信号a,b以及标准一位输入的cin。然后在结构体描述部分对电路模块的功能进行描述,指明整个电路时如何运作的:对3个二进制的9位矢量数进行加法运算输出到data。
    使用两个四位二进制加法器组成。

    功能设计
    实现八位二进制数加法,并保存可能存在的溢出值。

    波形图
    在这里插入图片描述
    源代码

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity ADD8 is
    	port (a,b : in std_logic_vector(7 downto 0);
    	count : out std_logic;
    cin : in std_logic;
    	dount : out std_logic_vector(7 downto 0) );
    end entity Add8;
    architecture bhv of add8 is
    signal data :std_logic_vector(8 downto 0);
    	begin
    	data <= ('0' & a) + ('0' & b) + ("00000000" & cin);
    	count <= data(8);
    	dount <= data(7 downto 0);
    end architecture bhv;
    

    实验题目
    设计、实现八位无符号二进制数乘法器

    设计思路
    八位乘法器由八位全加器以时序逻辑构成,通过逐项移位相加原理实现乘法。乘数的各位数码从被乘数的最低位开始依次相乘,每相乘一次得到部分积,若为此位的数码为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位,所有的部分积被加过一次可以得到相应的乘积。由于乘数的每一位不是0就是1,对应的部分积不是0就是和被乘数相等的部分积,所以实际作部分积相加这一步时,只要根据乘数的对应位判断,如过该位为1,则将累加器中的数据加上被乘数再移位;如该位为0时,就不加被乘数而直接移1位。然后对乘法器的进行自顶而下设计,把乘法器的设计分成几个功能模块,进而逐步细化。该任务需了解各个模块的引脚含义以及内部构造,并对各个模块的实现功能进行分析,通过VHDL对这些模块进行编程,调试。最后在QuartusⅡ进行模拟仿真,得出正确的运行结果。

    功能设计
    本设计采用移位和加法来实现两个8位二进制数相乘,使用VHDL语言完成八位乘法器,以及如何做二进制位相乘的运算过程。该乘法器是由八位加法器构成八位乘法器,通过逐项移位相加来实现乘法功能,并以QuartusⅡ软件工具进行模拟。

    波形图
    在这里插入图片描述
    源代码:

    1.library ieee;                               //四位二进制并行加法器                   
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity add4 is
    port( cin:in std_logic;
          a,b:in std_logic_vector(3 downto 0);
            s:out std_logic_vector(3 downto 0);
           cout:out std_logic);
    end;
    architecture one of add4 is
      signal sint,aa,bb:std_logic_vector(4 downto 0);
    begin
             aa<='0' & a;
             bb<='0' & b;
         sint<=aa+bb+cin;
      s<=sint(3 downto 0);
    cout<=sint(4);
    end;
    
    2.library ieee;          //由两个加法器结合成八位加法器;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity add8 is
    port( cin:in std_logic;
          a,b:in std_logic_vector(7 downto 0);
            s:out std_logic_vector(7 downto 0);
           cout:out std_logic);
    end;
    architecture one of add8 is
    component add4                    //说明要调用的元件端口
    port( cin:in std_logic;
          a,b:in std_logic_vector(3 downto 0);
            s:out std_logic_vector(3 downto 0);
           cout:out std_logic);
    end component;
    signal carryout: std_logic;
    begin
           u1:add4 port map(cin,a(3 downto 0),b(3 downto 0),s(3 downto 0),carryout);
           u2:add4 port map(carryout,a(7 downto 4),b(7 downto 4),s(7 downto 4),cout);
    end;
    
    3.library ieee;                  //一位乘法器;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity andarith is
    port( abin:in std_logic;
          din:in std_logic_vector(7 downto 0);
            dout:out std_logic_vector(7 downto 0));
    end;
    architecture one of andarith is
    begin
      process(abin,din)
    begin
       for i in 0 to 7 loop
            dout(i)<=din(i) and abin;
             end loop;
      end process;
    end;
    
    4.library ieee;          //乘法运算控制器                 
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity arictl is
    port( clk,start:in std_logic;
           clkout,rstall,ariend:out std_logic);
    end;
    architecture one of arictl is
    signal cnt4b:std_logic_vector(3 downto 0);
    begin
    rstall<=start;
      process(clk,start)
    begin
      if start='1' then cnt4b<="0000";
           elsif clk'event and clk='1' then
               if cnt4b<8 then        //小于8:计数,等于8:表明乘法运算结束
                  cnt4b<=cnt4b+1;
           end if;
    end if;
    end process;
    process(clk,cnt4b,start)
        begin
              if start='0' then
                  if cnt4b<8  then
                     clkout<=clk;    ariend<='0';
                      else clkout<='0'; ariend<='1';
                  end if;
              else clkout<=clk; ariend<='0';
         end if;
           end process;
    end;
    
    5.library ieee;                            
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity reg16b is
    port( clk,clr:in std_logic;
          d:in std_logic_vector(8 downto 0);
           q:out std_logic_vector(15 downto 0));
    end;
    architecture one of reg16b is
    signal r16s:std_logic_vector(15 downto 0);
    begin
      process(clk,clr)
    begin
       if clr='1' then r16s<="0000000000000000";
        elsif clk'event and clk='1'  then
            r16s(6 downto 0)<=r16s(7 downto 1);
               r16s(15 downto 7)<=d;
       end if;
    end process;
       q<=r16s;
    end;
    
    6.library ieee;                         //8位右移寄存器:在时钟信号作用下,进行输入值的移位与锁存。           
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity sreg8b is
    port( clk,load:in std_logic;
          din:in std_logic_vector(7 downto 0);
           qb:out std_logic);
    end;
    architecture one of sreg8b is
    signal reg8:std_logic_vector(7 downto 0);
    begin
      process(clk,load)
    begin
        if clk'event and clk='1'  then
         if load='1' then reg8<=din;
          else reg8(6 downto 0)<=reg8(7 downto 1);
            end if;
         end if;
       end process;
      qb<=reg8(0);
    end;
    
    7.library ieee;               //8位乘法器顶层设计
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    entity mult8x8 is
    port( clk:in std_logic;
    start:in std_logic;
          a,b:in std_logic_vector(7 downto 0);
             dout:out std_logic_vector(15 downto 0);
          ariend:out std_logic);
    end;
    architecture struc of mult8x8 is 
    component add8 is
    port( cin:in std_logic;
          a,b:in std_logic_vector(7 downto 0);
            s:out std_logic_vector(7 downto 0);
           cout:out std_logic);
    end component;
    component andarith is
    port( abin:in std_logic;
          din:in std_logic_vector(7 downto 0);
            dout:out std_logic_vector(7 downto 0));
    end component;
    component arictl is
    port( clk,start:in std_logic;
           clkout,rstall,ariend:out std_logic);
    end component;
    component reg16b is
    port( clk,clr:in std_logic;
          d:in std_logic_vector(8 downto 0);
           q:out std_logic_vector(15 downto 0));
    end component;
    component sreg8b is
    port( clk,load:in std_logic;
          din:in std_logic_vector(7 downto 0);
           qb:out std_logic);
    end component;
    signal gndint  :std_logic;
    signal intclk  :std_logic;
    signal rstall  :std_logic;
    signal qb  :std_logic;
    signal andsd  :std_logic_vector(7 downto 0);
    signal  dtbin :std_logic_vector(8 downto 0);
    signal  dtbout :std_logic_vector(15 downto 0);
    begin 
        dout<=dtbout; gndint<='0';
    u1:arictl port map( clk,start,intclk,rstall,ariend);
    u2:sreg8b port map(intclk,rstall,b,qb);
    u3:andarith port map(qb,a,andsd);
    u4:add8 port map(gndint,dtbout(15 downto 8),andsd,dtbin(7 downto 0),dtbin(8));
    u5:reg16b port map(intclk,rstall,dtbin,dtbout);
    end;
    

    学习心得
    通过本次课外实验项目,我了解了如何使用QuartusⅡ软件、加深了对VHDL语言结构的认识以及如何设计加法乘法器。虽然途中出现了一些困难与问题,比如说运行波形图时结果出现毛刺,设置为功能仿真后又出现Error等等的问题。但是我还是在查询资料的过程中,通过对同一个工程下不同程序的连接,逻辑结构的梳理,对最后结果的测试验证等方面的学习,加深了对整个代码及软件的认识。。此外,在团队中,我们独立思考,互相分享经验和进步,这也改善了自己的各项能力。

    展开全文
  • 数字电路写给读者 作者是...二进制LSB和MSB 通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。传输 串行:在计算机总线或其他数据通道上,每次传输个bit 并行:所有bit同时传送BCD编码 意义:用4个bit...

    数字电路


    写给读者

    作者是华中科技大学本科生,这是我的数字电路笔记
    感谢你阅读本文。本文不允许任何形式的转载。有任何问题请联系:wnn2000@hust.edu.cn


    第一章 数字电路概论

    1.二进制

    LSB和MSB

    通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。

    传输

    串行:在计算机总线或其他数据通道上,每次传输一个bit
    并行:所有bit同时传送

    BCD编码

    意义:用4个bit表示0-9

    有权码

    8421码:4个bit的权值分别是8、4、2、1
    2421码:
    5421码:

    无权码

    余3码:在8421码的基础上,将每个代码都加上0011而形成
    余3循环码:
    格雷码:

    f31cd938ed1feaf66b53e8cf36fa47e4.png

    2.二值逻辑变量与基本逻辑运算

    输入输出

    仅有0、1

    几种逻辑运算类型

    a7b25a1777277ff29cb4b977d3528c14.png

    由真值表写逻辑表达式

    把每个输出为1的一组输入变量组合状态以逻辑乘形式表示(原变量表示取值1,反变量表示取值0),再将所有的这些逻辑乘进行逻辑加。

    第二章 逻辑代数与硬件描述语言基础

    1.逻辑代数

    基本公式和恒等式

    这部分太简单了

    对偶规则

    对于逻辑函数式,若将其中的与换成或,或换成与;并将1换成0,0换成1;所得的新的函数式就是L的对偶式

    cd367f1c81ea006f8dbbc53805d45e4f.png

    2.逻辑函数的卡诺图化简法

    最小项

    n个变量(X1, X2, …, Xn)的最小项就是n个因子的乘积,在该乘积中每个变量都以它的原变量或非变量的形式出现一次,且仅出现一次。

    2cc05f2d3cf3b7b8a3f7f20c805a31e8.png

    卡诺图

    6d36ccd18669fe9f6c64b76990c73769.png

    卡诺图横纵二进制码为格雷码。使用格雷码的意义在于:使得相邻的格子只有一个bit不同,方便寻找共同bit,从而画圈圈。
    化简过程就是画圈圈的过程,把相邻的元素圈起来。(注意包括上下底相邻,左右边相邻和四角相邻)。包围圈内的方格数一定是2n个,包围圈的方格数要尽可能多。

    f041cc6739129c89c76f77242820b1a8.png

    无关项

    在有些逻辑问题中,有些变量的取值要加以约束。
    如A=1表示电机正转;B =1表示电机反转;C =1表示电机停转。ABC不能等于000、011、101、111中的任何一组。
    填函数的卡诺图时在无关项对应的格内填符号 “×” 。逻辑函数式中用“Φ”或、“d”表示无关项。
    化简时可根据需要视为“1”也可视为“0”,使函数化到最简。(无视无关项即可)

    8720d436ff26284844b5b969061224fe.png

    3.Verilog HDL基础

    这部分等以后再补吧(逃)

    第三章 逻辑门电路

    1.逻辑门电路分类

    d95d0907801d310afed745ddf6b6a5fe.png

    2.CMOS电路

    MOS管的特性在模电中已经学过,不再赘述。

    CMOS反相器(即非门)

    483a0cf4cd638de0ca98854edcddb63d.png

    当输入为低电位时,下方的NMOS的栅源电压为0,截止;上方的PMOS的栅源电压为-VDD,导通;输出为高电位。
    当输入为高电位时,下方的NMOS的栅源电压为VDD,导通;上方的PMOS的栅源电压为0,截止;输出为低电位。

    CMOS与非门

    7542e8e6f2fc17b3ebe828201dd8a87b.png

    直接列出真值表

    16cd4dada4d4f5a89052fb09687e0658.png

    CMOS与门

    79c06902f4ce08650f1bda736927fa15.png

    先与非再非即可得与

    CMOS或非门

    55f949b6b51ecd287b8170395d55b493.png

    做类似与非门的分析即可

    输入保护电路和缓冲电路

    输入端保护电路

    f60e19b91c1c74251705415955a7676f.png

    当输入电压不在正常电压范围时,二极管导通,限制了电容两端电压的增加,保护了输入电路。
    Rs和MOS管的栅极电容组成积分电路,即使是大信号的输入,C充电也需要时间,保证漏极电位的正常

    CMOS漏极开路(OD)门

    这部分等以后再补吧(逃)

    三态输出门电路

    加入一个“使能”输入,来决定输出是否为第三态——高阻态。

    8224821a2105cd1a474a659db5e12418.png

    EN上无圈,表示高电平有效;有圈,表示低电平有效
    还有其他的三态门,比如三态与非门,不加赘述

    3.TTL逻辑门

    非重点

    第四章 组合逻辑电路

    简单理解就是没有反馈的电路

    1.组合逻辑电路的分析

    1.由电路图写出各输出端的逻辑表达式
    2.化简逻辑表达式,比如卡诺图法
    3.根据化简后的表达式写出功能

    2.组合逻辑电路的设计

    1.由功能抽象出逻辑表达式
    2.化简逻辑表达式,比如卡诺图法
    3.根据化简后的表达式画出电路

    3.竞争-冒险现象

    竞争:由于每级逻辑门存在延迟,信号经由不同的路径达到某一会合点的时间有先有后的现象
    冒险:由于竞争而引起电路输出发生瞬间错误现象称为冒险,比如毛刺
    产生条件:只要有互补变量进行与运算、或运算

    2bd6e296fae37152721acb6c1c349ea0.png

    解决办法

    法一:增加乘积项,避免互补项相加

    ce981e98b288254b9e36979bad20c6e6.png

    当A=B=1时,出现竞争-冒险现象
    由卡诺图可知,这个表达式也可以写成

    68cc41e7e405090817a454e7b92ca148.png

    当A=B=1时,L恒等于1,不会出现竞争-冒险现象
    如何增加乘积项?把卡诺图相邻的圈圈圈起来即可

    47e872d8c8c45fe1639cd7cb90cb51f7.png

    法二:输出端并联电容

    竞争-冒险现象相当于瞬间的高频信号,用电容滤波即可

    4.常见集成组合逻辑电路(重难点)

    编码器

    能将输入信号变换为不同的二进制的代码输出。如BCD编码器

    普通编码器:只有一个输入信号为1,其他都是0,此时2n个输入对应n个输出(多输入,少输出)

    a3db85c2211358955c99c9ef57e1a423.png

    这种编码器致命缺点在于,不能同时有两个1输入。用这种编码器做键盘,只能每次按一个键……

    优先编码器:规定优先级,解决上述问题

    6bfa4209de08ffc2a919c90729f76381.png

    优先编码器的功能表里有"×"符号,用来表示优先级。比如当I7为高电平时,其他信号为什么都不重要了,说明I7相对后面优先级最高。
    这其实是集成电路CD4532的功能表。
    EI是使能信号,它为低电平时,整个电路不工作,输出全为低电平
    若EI为高电平,但是没有I信号输入,相当于键盘通电,但是没有按键被按下,此时只有EO输出为1
    当有按键被按下时,GS=1,EO=0,按照优先级顺序处理输入信号I,从而输出相应的信号

    译码器

    译码器是普通编码器的逆过程,可以将n个输入转变为2n个输出,少输入,多输出。输出信号只有一个是1,其他都是0。所以译码器又叫唯一地址译码器

    16ce194010e829c5b3d0801dbcf061e5.png

    译码器也有使能信号,只有使能信号全都满足时,电路才会正常工作。还要特别注意输出端是否取非。译码器的输出实际上是输入的信号变量最小项,利用这点可以通过控制输入来生成逻辑函数

    数据选择器

    有多个信号输入,需要选择一个输出
    靠什么来选择呢?靠"选择信号"
    比如有四个信号输入,那么"选择信号"可以用2位二进制表示,2位二进制可以表示四种状态,即可以确定是4个中的哪一个信号输出"选择信号"就是译码器!,n位"选择信号"对应2n种状态(少对应多),就可以选择2n个输入信号中的一个进行输出

    51e7c2b095569cb5edd8cad6566d47e4.png

    "选择信号"译码后,实际上是"选择信号"的逻辑函数最小项。众多最小项中只有一个最小项mi是1,所以与输入信号D相乘后,输出信号Y=m1D1+m2D2+…+miDi+…=Di
    从另一个角度看,由于Y=m1D1+m2D2+…+miDi+…,那么通过控制Di就可以得到多个最小项的或

    数值比较器(比较简单)

    一位数值比较器

    直接列出真值表

    11259e1ac85e60fce5bc2f0a093a748c.png

    根据真值表画出电路即可

    d0fba399535e80a0347a3023d80269b9.png

    两位数值比较器

    先比高位,再比低位。可以用一位数值比较器拓展而成

    d2dbc7e11d2b357cc4db8a471db1587a.png

    多位数值比较器

    可以通过串联或者并联形式,前者节约门电路,后者节约时间,太简单不再赘述。

    加法器(比较简单)

    半加器

    直接列出真值表画出电路

    a8286e37e786caa7795b50e38467d7e0.png

    全加器

    比较简单,先加低位再进位到高位

    19aab8f8593b33b64eaba021e63a7e1a.png

    多位加法器

    串联法:过于简单不赘述
    超前进位加法器:不需要等低位进位,因为加数输入时,进位数就已经确定,直接求得进位数即可
    显然,第i位的进位数为:

    164997c0b2cf3f87f7ab68c3000ca661.png

    求出carry bit,剩下的就相当于无进位的全加器

    v2-124a101dfa983f00907dadb08f9db030_b.jpg

    第五章 锁存器和触发器(重点)

    这类电路具有“记忆功能”,是组合逻辑电路没有的

    1.锁存器

    SR锁存器(两个或非门组成)

    efb5ee6d9ace009157343c53d8bab401.png

    锁存器的真值表如下

    R(Reset)S(Set)Q00保持原来的Q01110011状态不定,不允许这种状态

    逻辑门控SR锁存器(加个使能信号)

    9cbda58b9b8bd76a0aa6f95293ea8f2a.png

    D(Data)锁存器

    逻辑门控D锁存器

    其实没必要上面那么复杂,当E=0时就是保持不变的状态。所以R和S信号就是相反的关系,可以用一个非门接在一起。这就是D锁存器

    966bd8331971d786f6e73580f3b5e033.png

    只要电路工作,即E=1,那么它的原理就和RS锁存器一样。

    如果D=1,相当于R=0且S=1,那么Q=1(置1)
    如果D=0,相当于R=1且S=0,那么Q=0(置0)

    有很多方式可以描述电路的功能,比如真值表、波形图等。这一章引入特性方程这一新方式
    D锁存器的特性方程:Q=D(电路工作时)
    之后还会引入状态转换图来描述电路

    传输门控D锁存器

    e123037f00e2fbf449609def2ebbaa11.png

    传输门TG的作用就是,当电压给对了,D信号就会传过去
    E=1时,TG1导通,TG2断开,Q=D
    E=0时,TG2导通,TG1断开,Q保持不变

    2.触发器

    刚才讲了锁存器,锁存器是在某个信号处于高电平或者低电平的时候工作,比如使能信号E
    但是触发器不一样,触发器是在某个信号处于上升沿或者下降沿的时候工作,这里一般是信号CP

    aaa2fafda4fde2974355cc340724be32.png

    分析如下
    CP=0时,输入信号D送入主锁存器,使Q'=D
    CP由0跳变到1时,从锁存器TG3打开,Q'信号送Q到端
    Q'由CP跳变前的电路决定。CP跳变后,Q=Q'。换句话说,触发器的状态仅仅取决于CP信号上升沿到达前瞬间的D信号

    D触发器

    由两个D锁存器构成的触发器,就是上图,这里不再分析

    JK触发器

    我们把D触发器封装一下,输入信号是D和C,输出Q和Q。再加上几个门电路,就构成了JK触发器

    3d3e583e3cf5968690b5d0cf0cd198d1.png

    如果C信号有效时,比如上升沿到来
    那么可以写出JK触发器的状态方程

    cc944f4edbefeef7a72f2e5522f1d1fb.png

    当J和K取不同值的时候,电路就可以完成不同的功能。
    例如,上升沿到来前,J=K=1,那么有D=Q非。上升沿到来后,由D触发器的特性可知,D=Q,那么此时Q=Q非,实现翻转。特别注意,如果上升沿迟迟不到来,那么D也就只能卡在或门的后面,不能进入D触发器从而改变Q
    这边我们可以用状态转换图来描述这个电路

    f4e1d3a607d33c05bd482e3f59fb9063.png

    T触发器和T'触发器

    T触发器只需要将JK触发器的J和K接在一起就好了

    8ae88924716e9b3b1ee4d9878ed9eb6f.png

    写出方程如下

    75d5c195eaea36f407e0919b072d946a.png

    T'触发器更简单了,直接把T触发器中的T接到1

    1c01300063e8c1ea27d3aa8fa80d6290.png

    写出方程如下

    d0742d55b4c36080d29a639bd36babc9.png

    当上升沿来之后,Q翻转,保持住,直到下一次上升沿到来

    总结一下,本章的内容分为锁存器和触发器。内容不难,特别要注意电路工作的条件!

    第六章 时序电路

    1.时序电路基本组成和分类

    86532a4bcdc71f16cae77923ad495f66.png

    上图是时序电路的基本电路结构,存储部分由触发器构成
    在时序电路中,要弄懂电路的功能,需要三组方程,分别是输出方程状态方程激励方程输出方程描述输出信号Z与输入信号X和当前电路状态Q的关系,即Z=F(X,Qn)
    如果输出信号Z是Q的单值函数,该电路是摩尔型电路;如果Z是二元函数,该电路是米里型电路。这本教材讨论摩尔型电路激励方程描述触发器的输入Y与X和Q的关系,即Y=F(X,Qn)状态方程描述触发器下一状态与当前状态和Y的关系,即Qn+1=F(Y,Qn)激励方程状态方程可以通过触发器特性方程联系起来

    2.同步时序电路分析

    1.大致了解电路构成,判断触发器类型,写出特性方程
    2.写出激励方程和输出方程(也许不需要)
    3.把激励方程代入特性方程,就可以写出状态方程,即Qn+1的表达式
    4.画出状态转换表
    5.画出状态转换图,确定功能
    6.可以关心一下电路的自启动问题

    3.同步时序逻辑电路的设计

    1.逻辑抽象,建立最初的状态图或者状态表
    2.状态化简,合并等价状态(如果在相同的输入下输出相同或者相互变化就叫等价)
    3.状态分配,n个触发器可以确定2n个状态(highly encoding)
    4.选择触发器的类型
    5.求出电路的激励方程和输出方程
    6.画出逻辑图并检查自启动能力
    展开全文
  • 通过本实验,掌握使用VHDL硬件描述语言设计个1位二进制全加器,做出仿真波形。 注意: 创建项目、文件的具体操作细节可参考以下文章: Quartus Prime Lite Edition 使用教程(创建项目与仿真) 2、创建 Project f...

    1、实验目标

    通过本实验,掌握使用VHDL硬件描述语言设计一个1位二进制全加器,做出仿真波形。

    注意:
    创建项目、文件的具体操作细节可参考以下文章:
    Quartus Prime Lite Edition 使用教程(创建项目与仿真)

    2、创建 Project

    f_adder 项目创建成功。

    3、创建 VHDL 文件

    全加器由两个半加器和一个或门连接而成,

    所以就需要先设计好半加器和或门,然后全加器来调用半加器和或门就可以了。

    ①创建半加器 h_adder.vhd 文件

    写入如下代码:

    LIBRARY  IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    
    ENTITY h_adder IS
      PORT ( a, b  : IN STD_LOGIC;
            co, so : OUT STD_LOGIC);
    END ENTITY  h_adder;
    
    ARCHITECTURE fh1 OF h_adder IS
    BEGIN
      so <= NOT(a XOR (NOT b)) ;   co <= a AND b ;
    END ARCHITECTURE fh1;
    
    

    ②创建或门 or2a.vhd 文件

    写入如下代码:

    LIBRARY  IEEE ;
     USE IEEE.STD_LOGIC_1164.ALL;
     
     ENTITY or2a IS
       PORT (a, b : IN STD_LOGIC;  c : OUT STD_LOGIC );
     END ENTITY or2a ;
     
     ARCHITECTURE one OF or2a IS
       BEGIN
       c <= a OR b ;
     END ARCHITECTURE one ;
    
    

    ③创建全加器 f_adder.vhd 文件

    写入如下代码:

    LIBRARY  IEEE;
     USE IEEE.STD_LOGIC_1164.ALL;
     
     ENTITY f_adder IS
       PORT (ain, bin,  cin : IN STD_LOGIC;
                  cout, sum : OUT STD_LOGIC);
     END ENTITY f_adder;
     
     ARCHITECTURE fd1 OF f_adder IS
       COMPONENT h_adder
         PORT (  a, b : IN STD_LOGIC;
               co, so : OUT STD_LOGIC);
       END COMPONENT;
       COMPONENT or2a
          PORT (a, b : IN STD_LOGIC;
                   c : OUT STD_LOGIC);
       END COMPONENT;
    
    SIGNAL d, e, f : STD_LOGIC;
      BEGIN
       u1 : h_adder PORT MAP(a=>ain, b=>bin, co=>d, so=>e);
       u2 : h_adder PORT MAP(a=>e, b=>cin, co=>f, so=>sum);
       u3 : or2a    PORT MAP(a=>d, b=>f, c=>cout);
     END ARCHITECTURE fd1;
    
    

    ④编译

    编译成功。

    4、查看 RTL 图

    如下:

    查看完成。

    5、仿真

    写入测试数据如下:

    仿真结果:

    符合设计要求,仿真成功。

    展开全文
  • 1位二进制全加器实验

    2008-11-04 20:27:28
    里面又1位二进制全加器的所以制作 是个完整的1位二进制全加器 还有程序 和具体实验过程
  • 本系列主要是《数字设计和...加法器前边说过处理单个二进制位相加的加法器:但是我们使用的加法是好多位的,这也好说,把多个全加器串联起来就好了:从右到左看这个电路图,这是个32位二进制加法的电路图。初始的...

    本系列主要是《数字设计和计算机体系结构》和一些相关书籍的读书笔记,并没有专门为读者的阅读体验认真做设计,敬请谅解(时间不多)。

    下边这些数字电路模块是构成CPU的基础,在了解CPU执行指令过程之前,需要把这些模块的原理都搞清楚。

    加法器

    前边说过处理单个二进制位相加的加法器:

    5405271f1b292c43333daa5a994606c3.png

    但是我们使用的加法是好多位的,这也好说,把多个全加器串联起来就好了:

    84404629abfd4bdfa1dc735179833bda.png

    从右到左看这个电路图,这是一个32位二进制加法的电路图。初始的时候进位为0,然后每一位相加的进位输出当作高一位相加的进位输入,这样就跟接力棒一样,以此经过各个全加器之后,最后 C31S31S30S29S28…S2S1S0 就是最后的加法结果。我们把这个电路画个简单的示意图:

    b7c7f5fa42ff96b084a816578e7c51e2.png

    这种加法器由于需要先使用低位的加法器,把进位输出当作高一位的进位输入类似接力棒的方式传递进位,所以效率有点慢。后来人们又发明了些别的加法器电路,以求更快的实现二进制加法运算,比如先行进位加法器、行波进位加法器啥的,由于时间有限,我就不想看了,等以后时间充裕了再研究。

    对于减法来说,某种程度上可以把它转换成一种加法。比方说我们现在处理10以内的减法,比方说下边这个式子:

    5 - 2 = 3

    其实这个减法可以转换成这样的写法:

    5 + (10 - 2) - 10 = 5 + 8 - 10

    其中,2和8是相对于10的补数,a-b相当于a和b补数的和再减去进位。对于二进制减法,我们也可以用这个方式。比方说我们做4位二进制内的减法,比方说这样

    1001 - 0010 = 1001 + (10000 - 0010) - 10000

    怎么求一个给定位数的二进制数的补数呢?这个超级简单:

    1. 先把一个二进制数的每一位都取反,比方说这样0010的每一位都取反就是1101,
    2. 这样0010 + 1101 = 1111,但是两个互为补数的和是10000,所以让取反后的结果再加1就好了,也就是0010的4位二进制补数就是1101 + 1 = 1110。

    所以:

    1001 - 0010 = 1001 + 1110 - 10000

    用通俗一点的语言描述一下,比方说求A-B的结果,我们把B取反后的结果记为B,然后B的4为二进制数的补数就是B + 1。所以:

    A - B = A + B + 1 - 10000

    对于4位二进制数的加法,我们只有4个全加器,最后的进位会被放到C3中,我们只需要忽略这个最高位的进位,就相当于减去了10000。

    所以我们可以这样修改一下上边的加法器来让它可以做减法:

    8c06fae3da195713dc9a757d09e9dde3.png

    与上边的加法器电路相比,改了两个地方:

    1. 初始的进位输入从0改为了1。
    2. 减数B会被取反。

    那怎么表示负数呢?-5不就是相当于0 - 5么,也就是说负数相当于0和这个数对应的绝对值的减法,二进制的负数也是这个意思。0减去一个数相当于和这个数的补数相加后减去进位,0作为加数没有什么意义,也就是说负数相当于它的绝对值的补数减去进位。因为进位没啥意义,我们不关心,所以一个负数就相当于它绝对值的补数。我们以4位二进制数为例,看看怎么表示十进制数-5:

    1. 首先十进制数5用4位二进制数表示出来就是0101。
    2. 求0101的补数。先取反得1010,再加1,得1011。

    也就是说这个十进制数-5用4位二进制数表示得结果就是1011。可是我们怎么区别1011表示得是-5还是11呢?规定:首位为1的就是负数,首位为0得就是正数,这样就成功的把负数表示出来了。

    但是使用首位来区分正负数的话,4位二进制数就不能表示0 ~ 15这16个非负数了,表示范围变成了-8~7。8位、16位、32位、64位的数值表示和减法运算都可以参照4位二进制数来计算。

    比较器

    对于两个给定的输入,我们怎么知道这两个给定的输入是否完全相同呢?先把问题简化一下,怎么判断两个二进制位是否相同?我们可以规定:如果输出为1则相同,为0则不相同。很容易想到这个异或门的定义:输入相同得0,输入不同得1:,所以我们使用异或非门(NXOR)就可以达到我们得目的:

    fe7ad764bb5f1254d56bcd3043f4be1b.png

    如果需要比较得两个输入中分别有n位,那意味着只要n位中有一位比较输出为0,那么整个比较输出就是0,很容易想到用与门来完成这个汇聚各个位比较结果的任务(以4位比较器为例):

    aaa180add7a23c4a71db07e169bd2a5f.png

    算术逻辑单元

    不知道你有没有觉得我们不知不觉学了好多电路模块,现在我们提到加法器,只需要知道把输入和输出接上去,然后这个电路自动就帮我们把结果输出来了,对于一个需要使用加法器得小朋友来说,他就不需要理解这个加法器内部到底是怎么构造出来的,使用了哪些逻辑门,我们再一次强调抽象的好处:你不需要了解过多的实现细节,照着说明书(提供的接口)使用就行了。这个抽象的过程我们有时候也称为封装,用户不关心某个模块的内部实现,只需要调用这个模块提供的接口就好。对于我们前边说的一些电路模块,我们想把它们再次进行一次抽象,以提供更简单的使用接口,这就是我们所说的ALU(算术逻辑单元),直接看下边这个ALU的一个实现电路图:

    b04d90fbe919c0e58912763e5522c16d.png

    这个电路共有5个输入,可以被分为两种类型

    • 数据输入,包括:输入A和输入B
    • 控制输入,包括:输入F0、F1和F2,图中F0和F1写在了一起,以这种符号表示:F1:0。

    这个所谓的ALU就是把各种运算模块集中到了一起,用户可以通过修改控制信号F0、F1和F2的输入来控制对数据输入A和B进行何种运算,各个控制信号对应的运算类型如下:

    控制信号F2:0的值运算类型000A AND B001A OR B010A + B001未使用100A AND B101A AND B110A - B111判断A<B是否成立

    我们以减法运算为例看一下上边的ALU是怎么工作的。从表格中可以看到,处理减法运算的控制信号为:F2=1,F1=1,F0=0。

    1. 当F2=1时,最上边的2-1选择器会输出将信号B取反后的结果,并且加法器的进位输入的值也为1。所以该加法器实际执行的是A - B的操作。
    2. 当F1=1,F0=0时,最下边的4-1选择器会选择输出加法器的运算输出,也就是输出Y=A - B。

    其他类型的运算的道理是一样的,就不一一推导了。最后再说一下,控制信号F2=1,F1=1,F0=1的情况表示判断A<B是否成立,如果A<B成立,则Y=1,否则Y=0。这是怎么做到的呢?还是利用了加法器做了A - B的操作,如果结果为负,意味着加法器的输出的符号为为1,那图中的0扩展的电路黑盒就是把符号位作为Y的最后一位,其他位补0的作用,所以当Y=1时意味着A<B。反之当Y=0时,A<B不成立。

    所以之后我们再用到这个ALU时,就不用再考虑它里边复杂的电路是怎么画的了,只需要用下边简单的示意图代替就好:

    ec74f79ee3df8baa0d136b9f78f13b4a.png

    如此简洁。。。抽象的强大作用,以后我们想做点简单的运算时就可以直接把这个ALU给拿出来,输入对应的数据和控制性好就可以得到我们的结果,而不用关心它里边用了啥神器的魔术,666666666。更复杂的ALU中需要的电路更多,控制信号也会更多,我们这个只是做个演示,让大家知道原理的一个简易版ALU。

    移位器

    我们编程序的时候会经常使用到下边几种移位操作:

    • 左移:将所有二进制位向左移动若干位,在低位补0。
    • 逻辑右移:将所有二进制位向右移动若干位,在高位补0。
    • 算术右移:将所有二进制位向右移动若干位,在高位补与符号为相同的值,也就是正数的算数右移高位补0,负数的算数右移高位补1。

    下边以4位二进制数的左移为例来看一下电路图:

    213bdd99dcbab48e373fcf9d1545d482.png

    A3A2A1A0是我们指定的4位二进制数,shamt1:0是我们需要左移的位数,它连接着下边的4个4-1选择器。大家可以自己分析一下当移动位数从0~3的这几种情况分别会发生什么。

    乘法器

    二进制乘法比十进制乘法更加简单,因为我们都不用再背九九乘法表,它的单个位相乘的运算规则超级简单:

    ×01000101

    这样的规律和与门的运算是一样一样的,所以我们可以很轻易的使用与门去完成单个位的乘法运算。对于多个位相乘的运算只不过是在重复但个位的运算规律而已,如下:

    f0aaa3dc190999647a35f736fffd93ae.png

    0100和0101分别代表十进制的4和5,最后的结果1010代表十进制的20。4位二进制相乘的通用示意图可以这样表示:

    cd599c0c337bd47545f478f54fddc69d.png

    结果就是P7P6P5P4P3P2P1P0。下边是一个电路实现:

    a3454baf0889b51608b6a1a690224d1a.png

    是的,很复杂,当位数多一点的话更复杂,所以计算乘法的时候还是比较耗时的。

    除法器

    除法器更麻烦,就不说了。反正最终还是可以通过电路实现的,我们调用接口就好了(抽象的好处~)。

    计数器

    有时候我们需要计数,也就是数数,0,1,2,3,4,5,6…可以使用下边这个电路:

    e5d4c110b67b4bb3848d53540561eee8.png

    其中复位信号是让寄存器R1的输出Q为0,然后每当时钟上升沿到来时,加法器的输出值都加1。也就是说这个电路可以对时钟周期进行计数。这个很有用。

    展开全文
  • 文章目录VerilogHDL程序设计与仿真作业5:——实现74HC283的四位二进制进位全加器的功能、实验目的二、实现74HC283的功能1、设计思路2、实现代码3、测试代码4、仿真 、实验目的 实现74HC283的四位二进制进位...
  • 我们设A和B是两个相加的二进制数,C是从下一位获得的进位,两书相加的和在该位的值为Sum,全加器的两个输出仍然是给上一位的进位Carry。 A–B--C Sum–Carry 0–0--0 0–0 0–0--1 1–0 ...
  • 全加器电路图:
  • 初学者,文件过程:先设计一位的加法计数,再一个个进位达成八位二进制加法,若要改成十进制的只需要修改加法部分语言将二进制改成十进制即可
  • ##MATLAB之Simulink(四) ##两位二进制加法器 在上一节中,我们学习了全加器的原理并且进行了仿真,今天我们来做一个实例——两位二进制的加法器。 由于全加器有三个输入...也就是说,半加器仅适用于一位二进制数
  • 二进制全加器 只涉及一位加法 逻辑图和电路图
  • 二进制加法器

    千次阅读 2019-03-11 20:53:13
    二进制加法表: + 0 1 0 00 01 1 01 10 第一位叫做进位位,第二位叫做加法位 这个表可以拆分成两个表: +加法 0 1 0 0 1 1 1 0 +进位 0 1 0 0 0...
  • 42进制全加器代码

    2010-03-31 11:00:50
    用Verilog HDL 语言实现的4位全加器的代码 只是作为个练习,有什么指教可以发邮件给我
  • 二进制全加器设计 (verilog)

    万次阅读 2013-09-07 00:11:14
    二进制全加器设计  一位全加器使用乘积项之和的形式可以表示为:  sum=a·b·c_in+a’·b·c_in’+a’·b’·c_in+a·b’·c_in’ c_out=a·b+b·c_in+a·c_in  其中a,b和c_in为输入,sum和c_out为输出,只...
  • 若你我之间有缘,关注作者又何妨?两情若是久长时,又岂在朝朝暮暮。...我们FANUC PMC处理数据是以二进制和BCD码两种形式,要想真的理解它,首先我们需要学习一些数字电路基础知识,这些知识可能看遍两遍无法理解...
  • 试用4位二进制数比较器7485实现3位8421BCD码的比较。 三位8421BCD码,首先先确定需要三个比较器,一位一位的比较即可,非常简单,不废话,以下是演示: 比较:110和011 比较:010 和 111 ppp:记得点赞、关注、...
  • Verilog实现两个100位二进制数加法

    千次阅读 2020-07-15 10:25:12
    通过实例化100个全加器来实现个100bit的二进制加法器。该加法器有两个100bit的输入和cin,输出为sum与cout。为了鼓励大家使用实例化来完成电路设计,我们同时需要输出每个全加器的cout。 故cout[99]标志着全加器的...
  • library ieee; use ieee.std_logic_1164.all; entity addt is port (ain,bin,cin :in std_logic; cout,sum :out std_logic); end entity addt; architecture fd1 of addt is component h_adder ...
  • 在编码的奥秘中有这么句话, 8位二进制需要8个全加器。 我想问一下,这是怎么得到的结论? 个人认为 1个全加器可以计算三个二进制的运算,但是想不出8位二进制需要8个全加器
  • 首先得搞明白什么是四位二进制的加法器 半加器: library IEEE ; use IEEE.STD_LOGIC_1164.ALL ; entity banjiaqi is port ( a,b : in std_logic ; so,co: out std_logic ) ; end banjiaqi ; ...
  • 这也是我的第篇文章。 本文格式参照课程设计报告要求。 课程设计目的 1.初步掌握数字系统电路的一般设计方法,具备对逻辑电路独立设计能力。 2.进一步熟悉常用电子器件的类型和特性,并掌握合理选用的原则。 3....
  • 两个二进制数字Ai,Bi和一个进位输入Ci相加,产生一个和输出Si,以及一个进位输出Ci+1。表2-2中列出一位全加器进行加法运算的输入输出真值表。根据表2-2所示的真值表,三个输入端和两个输入端可按如下逻辑方程进行联系...
  • 利用逻辑门电路构造二进制加法器

    万次阅读 2014-12-31 10:53:35
    而计算机所处理的数据也只是二进制数也就是0和1。下面简单阐述二进制加法机的构造原理,这是cpu计算单元的基本计算原理。 加法计算实际上分为两步,计算和和计算进位。在一般人进行加法运算的时候先计算两个和,...
  • 实验名称:一位全加器(综合验证性) 一、目的与要求 1、熟悉组合逻辑电路,通过用门电路构成一位全加器组合逻辑电路。掌握组合逻辑电路的基本概念,组合逻辑电路的结构。 2、通过用门电路构成一位全加器组合逻辑...
  • VHDL设计四位二进制加法器和乘法器

    千次阅读 2021-05-20 15:12:18
    本文所设计的加法器是简单四位二进制加法器。计算机中的减法、乘法和除法最终都要转换成加法来运算。本实验没有用VHDL语言中的加法运算符。而是用基本门电路来实现的。通过对VHDL中算术运算符的运用,设计四位二进制...
  • CD4040是串行计数器。也叫异步计数器;它与并行(同步)计数器的区别在于。...而在同步计数器中(例如4位二进制同步加计数器4518)。计数脉冲同时接于各位触发器的时钟脉冲输入端,当计数脉冲到来时,各触发器同时被触发。
  • 八位二进制乘法器VHDL

    千次阅读 2020-11-02 21:56:08
    八位二进制乘法器VHDL工程文件、 实验目的二、设计要求三、实验仪器与环境四、实现原理五、系统设计及仿真六、顶层设计:七、结果仿真:附录: 工程文件 点击下载八位二进制乘法器工程文件 、 实验目的 熟习...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,686
精华内容 674
关键字:

一位二进制数全加器